diff --git a/net/core/sock_map.c b/net/core/sock_map.c index b0e96337a269..77358ae7553b 100644 --- a/net/core/sock_map.c +++ b/net/core/sock_map.c @@ -1657,6 +1657,12 @@ void sock_map_destroy(struct sock *sk) if (unlikely(!psock)) { rcu_read_unlock(); saved_destroy = READ_ONCE(sk->sk_prot)->destroy; + + if (unlikely(saved_destroy == sock_map_destroy)) { + read_lock_bh(&sk->sk_callback_lock); + read_unlock_bh(&sk->sk_callback_lock); + saved_destroy = READ_ONCE(sk->sk_prot)->destroy; + } } else { saved_destroy = psock->saved_destroy; sock_map_remove_links(sk, psock);