diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 8cc9b5499013..72c04f7caf2b 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -3568,14 +3568,17 @@ int tcp_nuke_addr(struct net *net, struct sockaddr *addr) sock_hold(sk); spin_unlock_bh(lock); + lock_sock(sk); + // TODO: + // Check for SOCK_DEAD again, it could have changed. + // Add a write barrier, see tcp_reset(). local_bh_disable(); - bh_lock_sock(sk); sk->sk_err = ETIMEDOUT; sk->sk_error_report(sk); tcp_done(sk); - bh_unlock_sock(sk); local_bh_enable(); + release_sock(sk); sock_put(sk); goto restart;