@@ -99,6 +99,7 @@ static void tipc_conn_kref_release(struct kref *kref)
if (test_bit(CF_SERVER, &con->flags)) {
__module_get(sock->ops->owner);
__module_get(sk->sk_prot_creator->owner);
+ get_net(sock_net(sock->sk));
}
saddr->scope = -TIPC_NODE_SCOPE;
kernel_bind(sock, (struct sockaddr *)saddr, sizeof(*saddr));
@@ -332,6 +333,9 @@ static struct socket *tipc_create_listen_sock(struct tipc_conn *con)
(char *)&s->imp, sizeof(s->imp));
if (ret < 0)
goto create_err;
+
+ put_net(sock_net(sock->sk));
+
ret = kernel_bind(sock, (struct sockaddr *)s->saddr, sizeof(*s->saddr));
if (ret < 0)
goto create_err;
@@ -377,6 +381,7 @@ static struct socket *tipc_create_listen_sock(struct tipc_conn *con)
create_err:
kernel_sock_shutdown(sock, SHUT_RDWR);
+ get_net(sock_net(sock->sk));
sock_release(sock);
return NULL;
}
After tipc internal server kernel socket is created with __sock_create(), the reference counter to a namespace of the socket is held in sk_alloc(). This causes what the nemespace is never destroyed as the kernel socket is released on namespace's shutdown. So, after the kernel socket's creation, we should immediately put the net's reference counter. Cc: Erik Hugne <erik.hugne@ericsson.com> Cc: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: Ying Xue <ying.xue@windriver.com> --- net/tipc/server.c | 5 +++++ 1 file changed, 5 insertions(+)