Message ID | 20200504041554.3703-1-tuong.t.lien@dektech.com.au |
---|---|
State | Accepted |
Delegated to: | David Miller |
Headers | show |
Series | [net] tipc: fix partial topology connection closure | expand |
From: Tuong Lien <tuong.t.lien@dektech.com.au> Date: Mon, 4 May 2020 11:15:54 +0700 > When an application connects to the TIPC topology server and subscribes > to some services, a new connection is created along with some objects - > 'tipc_subscription' to store related data correspondingly... > However, there is one omission in the connection handling that when the > connection or application is orderly shutdown (e.g. via SIGQUIT, etc.), > the connection is not closed in kernel, the 'tipc_subscription' objects > are not freed too. > This results in: > - The maximum number of subscriptions (65535) will be reached soon, new > subscriptions will be rejected; > - TIPC module cannot be removed (unless the objects are somehow forced > to release first); > > The commit fixes the issue by closing the connection if the 'recvmsg()' > returns '0' i.e. when the peer is shutdown gracefully. It also includes > the other unexpected cases. > > Acked-by: Jon Maloy <jmaloy@redhat.com> > Acked-by: Ying Xue <ying.xue@windriver.com> > Signed-off-by: Tuong Lien <tuong.t.lien@dektech.com.au> Applied, thanks.
diff --git a/net/tipc/topsrv.c b/net/tipc/topsrv.c index ad78f7cff379..c364335623ab 100644 --- a/net/tipc/topsrv.c +++ b/net/tipc/topsrv.c @@ -405,10 +405,11 @@ static int tipc_conn_rcv_from_sock(struct tipc_conn *con) read_lock_bh(&sk->sk_callback_lock); ret = tipc_conn_rcv_sub(srv, con, &s); read_unlock_bh(&sk->sk_callback_lock); + if (!ret) + return 0; } - if (ret < 0) - tipc_conn_close(con); + tipc_conn_close(con); return ret; }