Skip to content

Commit 1515a63

Browse files
Nikolay Aleksandrovdavem330
authored andcommitted
net: bridge: always clear mcast matching struct on reports and leaves
We need to be careful and always zero the whole br_ip struct when it is used for matching since the rhashtable change. This patch fixes all the places which didn't properly clear it which in turn might've caused mismatches. Thanks for the great bug report with reproducing steps and bisection. Steps to reproduce (from the bug report): ip link add br0 type bridge mcast_querier 1 ip link set br0 up ip link add v2 type veth peer name v3 ip link set v2 master br0 ip link set v2 up ip link set v3 up ip addr add 3.0.0.2/24 dev v3 ip netns add test ip link add v1 type veth peer name v1 netns test ip link set v1 master br0 ip link set v1 up ip -n test link set v1 up ip -n test addr add 3.0.0.1/24 dev v1 # Multicast receiver ip netns exec test socat UDP4-RECVFROM:5588,ip-add-membership=224.224.224.224:3.0.0.1,fork - # Multicast sender echo hello | nc -u -s 3.0.0.2 224.224.224.224 5588 Reported-by: liam.mcbirnie@boeing.com Fixes: 19e3a9c ("net: bridge: convert multicast to generic rhashtable") Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent cc5a726 commit 1515a63

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

net/bridge/br_multicast.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,7 @@ static int br_ip4_multicast_add_group(struct net_bridge *br,
601601
if (ipv4_is_local_multicast(group))
602602
return 0;
603603

604+
memset(&br_group, 0, sizeof(br_group));
604605
br_group.u.ip4 = group;
605606
br_group.proto = htons(ETH_P_IP);
606607
br_group.vid = vid;
@@ -1497,6 +1498,7 @@ static void br_ip4_multicast_leave_group(struct net_bridge *br,
14971498

14981499
own_query = port ? &port->ip4_own_query : &br->ip4_own_query;
14991500

1501+
memset(&br_group, 0, sizeof(br_group));
15001502
br_group.u.ip4 = group;
15011503
br_group.proto = htons(ETH_P_IP);
15021504
br_group.vid = vid;
@@ -1520,6 +1522,7 @@ static void br_ip6_multicast_leave_group(struct net_bridge *br,
15201522

15211523
own_query = port ? &port->ip6_own_query : &br->ip6_own_query;
15221524

1525+
memset(&br_group, 0, sizeof(br_group));
15231526
br_group.u.ip6 = *group;
15241527
br_group.proto = htons(ETH_P_IPV6);
15251528
br_group.vid = vid;

0 commit comments

Comments
 (0)