diff mbox

[RFC,net-next,09/11] tipc: fix net leak issue

Message ID 1430988770-28907-10-git-send-email-ying.xue@windriver.com
State RFC, archived
Delegated to: David Miller
Headers show

Commit Message

Ying Xue May 7, 2015, 8:52 a.m. UTC
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(+)
diff mbox

Patch

diff --git a/net/tipc/server.c b/net/tipc/server.c
index a91a2f7..29d9695 100644
--- a/net/tipc/server.c
+++ b/net/tipc/server.c
@@ -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;
 }