net: kernel socket should be released in init_net namespace
authorYing Xue <ying.xue@windriver.com>
Mon, 16 Mar 2015 10:19:12 +0000 (18:19 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 16 Mar 2015 20:25:06 +0000 (16:25 -0400)
Creating a kernel socket with sock_create_kern() happens in "init_net"
namespace, however, releasing it with sk_release_kernel() occurs in
the current namespace which may be different with "init_net" namespace.
Therefore, we should guarantee that the namespace in which a kernel
socket is created is same as the socket is created.

Signed-off-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/sock.c

index a950b54248da3e5fe778d5bce0647fa561f5dfe5..d9f9e48253627efc3d45b45802fc39aa17162e4e 100644 (file)
@@ -1454,8 +1454,8 @@ void sk_release_kernel(struct sock *sk)
                return;
 
        sock_hold(sk);
-       sock_release(sk->sk_socket);
        sock_net_set(sk, get_net(&init_net));
+       sock_release(sk->sk_socket);
        sock_put(sk);
 }
 EXPORT_SYMBOL(sk_release_kernel);