]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - queue-5.0/net-bridge-multicast-use-rcu-to-access-port-list-from-br_multicast_start_querier.patch
5.0-stable patches
[thirdparty/kernel/stable-queue.git] / queue-5.0 / net-bridge-multicast-use-rcu-to-access-port-list-from-br_multicast_start_querier.patch
1 From foo@baz Sat Apr 20 16:43:09 CEST 2019
2 From: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
3 Date: Thu, 11 Apr 2019 15:08:25 +0300
4 Subject: net: bridge: multicast: use rcu to access port list from br_multicast_start_querier
5
6 From: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
7
8 [ Upstream commit c5b493ce192bd7a4e7bd073b5685aad121eeef82 ]
9
10 br_multicast_start_querier() walks over the port list but it can be
11 called from a timer with only multicast_lock held which doesn't protect
12 the port list, so use RCU to walk over it.
13
14 Fixes: c83b8fab06fc ("bridge: Restart queries when last querier expires")
15 Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
16 Signed-off-by: David S. Miller <davem@davemloft.net>
17 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
18 ---
19 net/bridge/br_multicast.c | 4 +++-
20 1 file changed, 3 insertions(+), 1 deletion(-)
21
22 --- a/net/bridge/br_multicast.c
23 +++ b/net/bridge/br_multicast.c
24 @@ -1916,7 +1916,8 @@ static void br_multicast_start_querier(s
25
26 __br_multicast_open(br, query);
27
28 - list_for_each_entry(port, &br->port_list, list) {
29 + rcu_read_lock();
30 + list_for_each_entry_rcu(port, &br->port_list, list) {
31 if (port->state == BR_STATE_DISABLED ||
32 port->state == BR_STATE_BLOCKING)
33 continue;
34 @@ -1928,6 +1929,7 @@ static void br_multicast_start_querier(s
35 br_multicast_enable(&port->ip6_own_query);
36 #endif
37 }
38 + rcu_read_unlock();
39 }
40
41 int br_multicast_toggle(struct net_bridge *br, unsigned long val)