tcp: fix a possible lockdep splat in tcp_done()
syzbot found that if __inet_inherit_port() returns an error,
we call tcp_done() after inet_csk_prepare_forced_close(),
meaning the socket lock is no longer held.
We might fix this in a different way in net-next, but
for 5.4 it seems safer to relax the lockdep check.
Fixes: d983ea6f16
("tcp: add rcu protection around tp->fastopen_rsk")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reported-by: syzbot <syzkaller@googlegroups.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
c9b96eb6da
commit
cab209e571
|
@ -3842,8 +3842,12 @@ void tcp_done(struct sock *sk)
|
||||||
{
|
{
|
||||||
struct request_sock *req;
|
struct request_sock *req;
|
||||||
|
|
||||||
req = rcu_dereference_protected(tcp_sk(sk)->fastopen_rsk,
|
/* We might be called with a new socket, after
|
||||||
lockdep_sock_is_held(sk));
|
* inet_csk_prepare_forced_close() has been called
|
||||||
|
* so we can not use lockdep_sock_is_held(sk)
|
||||||
|
*/
|
||||||
|
req = rcu_dereference_protected(tcp_sk(sk)->fastopen_rsk, 1);
|
||||||
|
|
||||||
if (sk->sk_state == TCP_SYN_SENT || sk->sk_state == TCP_SYN_RECV)
|
if (sk->sk_state == TCP_SYN_SENT || sk->sk_state == TCP_SYN_RECV)
|
||||||
TCP_INC_STATS(sock_net(sk), TCP_MIB_ATTEMPTFAILS);
|
TCP_INC_STATS(sock_net(sk), TCP_MIB_ATTEMPTFAILS);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue