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: 51f1de79ad
("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>
This commit is contained in:
parent
7acf8b36a2
commit
26d92e951f
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue