67 lines
2.0 KiB
Diff
67 lines
2.0 KiB
Diff
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
Date: Wed, 31 Aug 2016 17:54:09 +0200
|
|
Subject: [PATCH] net: add a lock around icmp_sk()
|
|
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patches-4.14.6-rt7.tar.xz
|
|
|
|
It looks like the this_cpu_ptr() access in icmp_sk() is protected with
|
|
local_bh_disable(). To avoid missing serialization in -RT I am adding
|
|
here a local lock. No crash has been observed, this is just precaution.
|
|
|
|
Cc: stable-rt@vger.kernel.org
|
|
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
---
|
|
net/ipv4/icmp.c | 7 +++++++
|
|
1 file changed, 7 insertions(+)
|
|
|
|
--- a/net/ipv4/icmp.c
|
|
+++ b/net/ipv4/icmp.c
|
|
@@ -77,6 +77,7 @@
|
|
#include <linux/string.h>
|
|
#include <linux/netfilter_ipv4.h>
|
|
#include <linux/slab.h>
|
|
+#include <linux/locallock.h>
|
|
#include <net/snmp.h>
|
|
#include <net/ip.h>
|
|
#include <net/route.h>
|
|
@@ -204,6 +205,8 @@ static const struct icmp_control icmp_po
|
|
*
|
|
* On SMP we have one ICMP socket per-cpu.
|
|
*/
|
|
+static DEFINE_LOCAL_IRQ_LOCK(icmp_sk_lock);
|
|
+
|
|
static struct sock *icmp_sk(struct net *net)
|
|
{
|
|
return *this_cpu_ptr(net->ipv4.icmp_sk);
|
|
@@ -417,6 +420,7 @@ static void icmp_reply(struct icmp_bxm *
|
|
|
|
/* Needed by both icmp_global_allow and icmp_xmit_lock */
|
|
local_bh_disable();
|
|
+ local_lock(icmp_sk_lock);
|
|
|
|
/* global icmp_msgs_per_sec */
|
|
if (!icmpv4_global_allow(net, type, code))
|
|
@@ -461,6 +465,7 @@ static void icmp_reply(struct icmp_bxm *
|
|
out_unlock:
|
|
icmp_xmit_unlock(sk);
|
|
out_bh_enable:
|
|
+ local_unlock(icmp_sk_lock);
|
|
local_bh_enable();
|
|
}
|
|
|
|
@@ -656,6 +661,7 @@ void icmp_send(struct sk_buff *skb_in, i
|
|
|
|
/* Needed by both icmp_global_allow and icmp_xmit_lock */
|
|
local_bh_disable();
|
|
+ local_lock(icmp_sk_lock);
|
|
|
|
/* Check global sysctl_icmp_msgs_per_sec ratelimit, unless
|
|
* incoming dev is loopback. If outgoing dev change to not be
|
|
@@ -744,6 +750,7 @@ void icmp_send(struct sk_buff *skb_in, i
|
|
out_unlock:
|
|
icmp_xmit_unlock(sk);
|
|
out_bh_enable:
|
|
+ local_unlock(icmp_sk_lock);
|
|
local_bh_enable();
|
|
out:;
|
|
}
|