Commit 5869b8fa authored by Xin Long's avatar Xin Long Committed by David S. Miller
Browse files

net: use rcu_dereference_protected to fetch sk_dst_cache in sk_destruct



As Eric noticed, in .sk_destruct, sk->sk_dst_cache update is prevented, and
no barrier is needed for this. So change to use rcu_dereference_protected()
instead of rcu_dereference_check() to fetch sk_dst_cache in there.

v1->v2:
  - no change, repost after net-next is open.

Reported-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b6163f19
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -444,7 +444,7 @@ static void dn_destruct(struct sock *sk)
	skb_queue_purge(&scp->other_xmit_queue);
	skb_queue_purge(&scp->other_receive_queue);

	dst_release(rcu_dereference_check(sk->sk_dst_cache, 1));
	dst_release(rcu_dereference_protected(sk->sk_dst_cache, 1));
}

static unsigned long dn_memory_pressure;
+1 −1
Original line number Diff line number Diff line
@@ -160,7 +160,7 @@ void inet_sock_destruct(struct sock *sk)
	WARN_ON(sk->sk_forward_alloc);

	kfree(rcu_dereference_protected(inet->inet_opt, 1));
	dst_release(rcu_dereference_check(sk->sk_dst_cache, 1));
	dst_release(rcu_dereference_protected(sk->sk_dst_cache, 1));
	dst_release(sk->sk_rx_dst);
	sk_refcnt_debug_dec(sk);
}