瀏覽代碼

[NETFILTER]: check nf_log function call arguments

Check whether pf is too large in order to prevent array overflow.

Signed-off-by: Harald Welte <laforge@netfilter.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Harald Welte 20 年之前
父節點
當前提交
8a61fadb39
共有 2 個文件被更改,包括 10 次插入2 次删除
  1. 1 1
      include/linux/netfilter.h
  2. 9 1
      net/netfilter/nf_log.c

+ 1 - 1
include/linux/netfilter.h

@@ -157,7 +157,7 @@ struct nf_logger {
 
 
 /* Function to register/unregister log function. */
 /* Function to register/unregister log function. */
 int nf_log_register(int pf, struct nf_logger *logger);
 int nf_log_register(int pf, struct nf_logger *logger);
-void nf_log_unregister_pf(int pf);
+int nf_log_unregister_pf(int pf);
 void nf_log_unregister_logger(struct nf_logger *logger);
 void nf_log_unregister_logger(struct nf_logger *logger);
 
 
 /* Calls the registered backend logging function */
 /* Calls the registered backend logging function */

+ 9 - 1
net/netfilter/nf_log.c

@@ -24,6 +24,9 @@ int nf_log_register(int pf, struct nf_logger *logger)
 {
 {
 	int ret = -EBUSY;
 	int ret = -EBUSY;
 
 
+	if (pf >= NPROTO)
+		return -EINVAL;
+
 	/* Any setup of logging members must be done before
 	/* Any setup of logging members must be done before
 	 * substituting pointer. */
 	 * substituting pointer. */
 	spin_lock(&nf_log_lock);
 	spin_lock(&nf_log_lock);
@@ -38,14 +41,19 @@ int nf_log_register(int pf, struct nf_logger *logger)
 }		
 }		
 EXPORT_SYMBOL(nf_log_register);
 EXPORT_SYMBOL(nf_log_register);
 
 
-void nf_log_unregister_pf(int pf)
+int nf_log_unregister_pf(int pf)
 {
 {
+	if (pf >= NPROTO)
+		return -EINVAL;
+
 	spin_lock(&nf_log_lock);
 	spin_lock(&nf_log_lock);
 	nf_logging[pf] = NULL;
 	nf_logging[pf] = NULL;
 	spin_unlock(&nf_log_lock);
 	spin_unlock(&nf_log_lock);
 
 
 	/* Give time to concurrent readers. */
 	/* Give time to concurrent readers. */
 	synchronize_net();
 	synchronize_net();
+
+	return 0;
 }
 }
 EXPORT_SYMBOL(nf_log_unregister_pf);
 EXPORT_SYMBOL(nf_log_unregister_pf);