]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: bridge: stop fast-leave after deleting a port group
authorZhiling Zou <zhilinz@nebusec.ai>
Thu, 23 Jul 2026 16:52:48 +0000 (00:52 +0800)
committerJakub Kicinski <kuba@kernel.org>
Mon, 27 Jul 2026 22:20:27 +0000 (15:20 -0700)
br_multicast_leave_group() iterates mp->ports with pp = &p->next in
its fast-leave path. After br_multicast_del_pg() removes p,
continuing the loop advances pp through the deleted entry.

If multicast-to-unicast was enabled, the bridge can hold multiple port
groups for the same port and group with different source MAC
addresses. Once multicast-to-unicast is disabled,
br_port_group_equal() matches those entries by port only. A fast leave
can then delete one entry and continue from its stale next pointer,
leaving mp->ports pointing at a deleted port group.

Fast leave only needs to remove one matching port group. Break after
br_multicast_del_pg() so the loop stops before dereferencing the
removed entry.

Fixes: 6db6f0eae605 ("bridge: multicast to unicast")
Cc: stable@vger.kernel.org
Reported-by: Vega <vega@nebusec.ai>
Signed-off-by: Zhiling Zou <zhilinz@nebusec.ai>
Signed-off-by: Ren Wei <enjou1224z@gmail.com>
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
Link: https://patch.msgid.link/1cf0898872ef7c72d5f4c0304414a192c6dac591.1784707712.git.zhilinz@nebusec.ai
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/bridge/br_multicast.c

index 6b3ac473fd228b65d1479963e032a63a9f9210ee..00aa9b2879d6e213a363a064bd70116acf6b95da 100644 (file)
@@ -3687,6 +3687,7 @@ br_multicast_leave_group(struct net_bridge_mcast *brmctx,
 
                        p->flags |= MDB_PG_FLAGS_FAST_LEAVE;
                        br_multicast_del_pg(mp, p, pp);
+                       break;
                }
                goto out;
        }