提交 1e443e2a 编写于 作者: K Kuniyuki Iwashima 提交者: Zheng Zengkai

icmp: Fix data-races around sysctl.

stable inclusion
from stable-v5.10.132
commit e088ceb73c24ab4774da391d54a6426f4bfaefce
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I5YS3T

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=e088ceb73c24ab4774da391d54a6426f4bfaefce

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

[ Upstream commit 48d7ee32 ]

While reading icmp sysctl variables, they can be changed concurrently.
So, we need to add READ_ONCE() to avoid data-races.

Fixes: 4cdf507d ("icmp: add a global rate limitation")
Signed-off-by: NKuniyuki Iwashima <kuniyu@amazon.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
Signed-off-by: NSasha Levin <sashal@kernel.org>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
上级 10d29fe0
...@@ -261,11 +261,12 @@ bool icmp_global_allow(void) ...@@ -261,11 +261,12 @@ bool icmp_global_allow(void)
spin_lock(&icmp_global.lock); spin_lock(&icmp_global.lock);
delta = min_t(u32, now - icmp_global.stamp, HZ); delta = min_t(u32, now - icmp_global.stamp, HZ);
if (delta >= HZ / 50) { if (delta >= HZ / 50) {
incr = sysctl_icmp_msgs_per_sec * delta / HZ ; incr = READ_ONCE(sysctl_icmp_msgs_per_sec) * delta / HZ;
if (incr) if (incr)
WRITE_ONCE(icmp_global.stamp, now); WRITE_ONCE(icmp_global.stamp, now);
} }
credit = min_t(u32, icmp_global.credit + incr, sysctl_icmp_msgs_burst); credit = min_t(u32, icmp_global.credit + incr,
READ_ONCE(sysctl_icmp_msgs_burst));
if (credit) { if (credit) {
/* We want to use a credit of one in average, but need to randomize /* We want to use a credit of one in average, but need to randomize
* it for security reasons. * it for security reasons.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册