ipv6: fix an oops when force unload ipv6 module
[safe/jmp/linux-2.6] / net / netfilter / nf_sockopt.c
index 69d699f..f042ae5 100644 (file)
@@ -60,14 +60,11 @@ void nf_unregister_sockopt(struct nf_sockopt_ops *reg)
 }
 EXPORT_SYMBOL(nf_unregister_sockopt);
 
-static struct nf_sockopt_ops *nf_sockopt_find(struct sock *sk, int pf,
+static struct nf_sockopt_ops *nf_sockopt_find(struct sock *sk, u_int8_t pf,
                int val, int get)
 {
        struct nf_sockopt_ops *ops;
 
-       if (sock_net(sk) != &init_net)
-               return ERR_PTR(-ENOPROTOOPT);
-
        if (mutex_lock_interruptible(&nf_sockopt_mutex) != 0)
                return ERR_PTR(-EINTR);
 
@@ -96,7 +93,7 @@ out:
 }
 
 /* Call get/setsockopt() */
-static int nf_sockopt(struct sock *sk, int pf, int val,
+static int nf_sockopt(struct sock *sk, u_int8_t pf, int val,
                      char __user *opt, int *len, int get)
 {
        struct nf_sockopt_ops *ops;
@@ -115,21 +112,22 @@ static int nf_sockopt(struct sock *sk, int pf, int val,
        return ret;
 }
 
-int nf_setsockopt(struct sock *sk, int pf, int val, char __user *opt,
-                 int len)
+int nf_setsockopt(struct sock *sk, u_int8_t pf, int val, char __user *opt,
+                 unsigned int len)
 {
        return nf_sockopt(sk, pf, val, opt, &len, 0);
 }
 EXPORT_SYMBOL(nf_setsockopt);
 
-int nf_getsockopt(struct sock *sk, int pf, int val, char __user *opt, int *len)
+int nf_getsockopt(struct sock *sk, u_int8_t pf, int val, char __user *opt,
+                 int *len)
 {
        return nf_sockopt(sk, pf, val, opt, len, 1);
 }
 EXPORT_SYMBOL(nf_getsockopt);
 
 #ifdef CONFIG_COMPAT
-static int compat_nf_sockopt(struct sock *sk, int pf, int val,
+static int compat_nf_sockopt(struct sock *sk, u_int8_t pf, int val,
                             char __user *opt, int *len, int get)
 {
        struct nf_sockopt_ops *ops;
@@ -155,14 +153,14 @@ static int compat_nf_sockopt(struct sock *sk, int pf, int val,
        return ret;
 }
 
-int compat_nf_setsockopt(struct sock *sk, int pf,
-               int val, char __user *opt, int len)
+int compat_nf_setsockopt(struct sock *sk, u_int8_t pf,
+               int val, char __user *opt, unsigned int len)
 {
        return compat_nf_sockopt(sk, pf, val, opt, &len, 0);
 }
 EXPORT_SYMBOL(compat_nf_setsockopt);
 
-int compat_nf_getsockopt(struct sock *sk, int pf,
+int compat_nf_getsockopt(struct sock *sk, u_int8_t pf,
                int val, char __user *opt, int *len)
 {
        return compat_nf_sockopt(sk, pf, val, opt, len, 1);