diff options
author | Takashi Iwai <tiwai@suse.de> | 2009-02-09 17:20:13 +0100 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2009-02-09 17:20:13 +0100 |
commit | d9f8e9c34150ebec2be07bb95b6a23d99ba1f6de (patch) | |
tree | 1e8c402df9b1154f4ca37eb5242f960ef7aab747 /net/sctp/input.c | |
parent | 2ebfb8eeb8f244f9d25937d31a947895cf819e26 (diff) | |
parent | 8bd4bb7a35e8ebb015a531218614c48e10a3c4ee (diff) | |
download | kernel-crypto-d9f8e9c34150ebec2be07bb95b6a23d99ba1f6de.tar.gz kernel-crypto-d9f8e9c34150ebec2be07bb95b6a23d99ba1f6de.tar.xz kernel-crypto-d9f8e9c34150ebec2be07bb95b6a23d99ba1f6de.zip |
Merge branch 'topic/quirk-cleanup' into topic/misc
Diffstat (limited to 'net/sctp/input.c')
-rw-r--r-- | net/sctp/input.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/net/sctp/input.c b/net/sctp/input.c index bf612d954d4..2e4a8646dbc 100644 --- a/net/sctp/input.c +++ b/net/sctp/input.c @@ -249,6 +249,19 @@ int sctp_rcv(struct sk_buff *skb) */ sctp_bh_lock_sock(sk); + if (sk != rcvr->sk) { + /* Our cached sk is different from the rcvr->sk. This is + * because migrate()/accept() may have moved the association + * to a new socket and released all the sockets. So now we + * are holding a lock on the old socket while the user may + * be doing something with the new socket. Switch our veiw + * of the current sk. + */ + sctp_bh_unlock_sock(sk); + sk = rcvr->sk; + sctp_bh_lock_sock(sk); + } + if (sock_owned_by_user(sk)) { SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_BACKLOG); sctp_add_backlog(sk, skb); |