Commit 5bf35ddf authored by Xin Long's avatar Xin Long Committed by David S. Miller

sctp: change sk state only when it has assocs in sctp_shutdown

Now when users shutdown a sock with SEND_SHUTDOWN in sctp, even if
this sock has no connection (assoc), sk state would be changed to
SCTP_SS_CLOSING, which is not as we expect.

Besides, after that if users try to listen on this sock, kernel
could even panic when it dereference sctp_sk(sk)->bind_hash in
sctp_inet_listen, as bind_hash is null when sock has no assoc.

This patch is to move sk state change after checking sk assocs
is not empty, and also merge these two if() conditions and reduce
indent level.

Fixes: d46e416c ("sctp: sctp should change socket state when shutdown is received")
Reported-by: default avatarAndrey Konovalov <andreyknvl@google.com>
Tested-by: default avatarAndrey Konovalov <andreyknvl@google.com>
Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
Acked-by: default avatarMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Acked-by: default avatarNeil Horman <nhorman@tuxdriver.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 193f5122
...@@ -4285,20 +4285,19 @@ static void sctp_shutdown(struct sock *sk, int how) ...@@ -4285,20 +4285,19 @@ static void sctp_shutdown(struct sock *sk, int how)
{ {
struct net *net = sock_net(sk); struct net *net = sock_net(sk);
struct sctp_endpoint *ep; struct sctp_endpoint *ep;
struct sctp_association *asoc;
if (!sctp_style(sk, TCP)) if (!sctp_style(sk, TCP))
return; return;
if (how & SEND_SHUTDOWN) {
sk->sk_state = SCTP_SS_CLOSING;
ep = sctp_sk(sk)->ep; ep = sctp_sk(sk)->ep;
if (!list_empty(&ep->asocs)) { if (how & SEND_SHUTDOWN && !list_empty(&ep->asocs)) {
struct sctp_association *asoc;
sk->sk_state = SCTP_SS_CLOSING;
asoc = list_entry(ep->asocs.next, asoc = list_entry(ep->asocs.next,
struct sctp_association, asocs); struct sctp_association, asocs);
sctp_primitive_SHUTDOWN(net, asoc, NULL); sctp_primitive_SHUTDOWN(net, asoc, NULL);
} }
}
} }
int sctp_get_sctp_info(struct sock *sk, struct sctp_association *asoc, int sctp_get_sctp_info(struct sock *sk, struct sctp_association *asoc,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment