diff options
author | Cong Wang <xiyou.wangcong@gmail.com> | 2019-01-05 23:45:26 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-01-07 14:40:27 -0500 |
commit | 26d92e951fe0a44ee4aec157cabb65a818cc8151 (patch) | |
tree | e0233475d3922cc26be5157b077f62b5b31e2031 /net | |
parent | 7acf8b36a2ac6eb4fdc53c4d862570089e56c69e (diff) | |
download | linux-26d92e951fe0a44ee4aec157cabb65a818cc8151.tar.gz linux-26d92e951fe0a44ee4aec157cabb65a818cc8151.tar.bz2 linux-26d92e951fe0a44ee4aec157cabb65a818cc8151.zip |
smc: move unhash as early as possible in smc_release()
In smc_release() we release smc->clcsock before unhash the smc
sock, but a parallel smc_diag_dump() may be still reading
smc->clcsock, therefore this could cause a use-after-free as
reported by syzbot.
Reported-and-tested-by: syzbot+fbd1e5476e4c94c7b34e@syzkaller.appspotmail.com
Fixes: 51f1de79ad8e ("net/smc: replace sock_put worker by socket refcounting")
Cc: Ursula Braun <ubraun@linux.ibm.com>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Reported-by: syzbot+0bf2e01269f1274b4b03@syzkaller.appspotmail.com
Reported-by: syzbot+e3132895630f957306bc@syzkaller.appspotmail.com
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/smc/af_smc.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c index c4da4a78d369..c4e56602e0c6 100644 --- a/net/smc/af_smc.c +++ b/net/smc/af_smc.c @@ -146,6 +146,9 @@ static int smc_release(struct socket *sock) sock_set_flag(sk, SOCK_DEAD); sk->sk_shutdown |= SHUTDOWN_MASK; } + + sk->sk_prot->unhash(sk); + if (smc->clcsock) { if (smc->use_fallback && sk->sk_state == SMC_LISTEN) { /* wake up clcsock accept */ @@ -170,7 +173,6 @@ static int smc_release(struct socket *sock) smc_conn_free(&smc->conn); release_sock(sk); - sk->sk_prot->unhash(sk); sock_put(sk); /* final sock_put */ out: return rc; |