提交 e74408de 编写于 作者: X Xin Long 提交者: Xie XiuQi

net: use rcu_dereference_protected to fetch sk_dst_cache in sk_destruct

mainline inclusion
from mainline-5.1
commit 5869b8fadad0
category: bugfix
bugzilla: 14979
CVE: NA

-------------------------------------------------

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: NEric Dumazet <edumazet@google.com>
Signed-off-by: NXin Long <lucien.xin@gmail.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
Signed-off-by: NZhiqiang Liu <liuzhiqiang26@huawei.com>
Reviewed-by: NWenan Mao <maowenan@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 fa870409
...@@ -444,7 +444,7 @@ static void dn_destruct(struct sock *sk) ...@@ -444,7 +444,7 @@ static void dn_destruct(struct sock *sk)
skb_queue_purge(&scp->other_xmit_queue); skb_queue_purge(&scp->other_xmit_queue);
skb_queue_purge(&scp->other_receive_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; static unsigned long dn_memory_pressure;
......
...@@ -156,7 +156,7 @@ void inet_sock_destruct(struct sock *sk) ...@@ -156,7 +156,7 @@ void inet_sock_destruct(struct sock *sk)
WARN_ON(sk->sk_forward_alloc); WARN_ON(sk->sk_forward_alloc);
kfree(rcu_dereference_protected(inet->inet_opt, 1)); 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); dst_release(sk->sk_rx_dst);
sk_refcnt_debug_dec(sk); sk_refcnt_debug_dec(sk);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册