From: Jafar Al-Gharaibeh Date: Thu, 30 May 2024 17:46:47 +0000 (-0500) Subject: pimd: fix crash when mixing ssm/any-source joins X-Git-Tag: docker/8.5.5~4^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=9101a9f6e9aa0a7e9c4c81a15574d60b84ec9d77;p=matthieu%2Ffrr.git pimd: fix crash when mixing ssm/any-source joins There is no reason to call `igmp_anysource_forward_stop()` inside a call to `igmp_get_source_by_addr()`; not only it is not expected for a "get" function to perform such an action, but also the decision to start/stop forwarding is already handled correctly by pim outside `igmp_get_source_by_addr()`. That call was left there from the days pim was initially imported into the sources. The problem/crash was happening because `igmp_find_source_by_addr()` would fail to find the group/source combo when mixing `(*, G)` and `(S, G)`. When having an existing flow `(*, G)`, and a new `(S, G)` igmp is received, a new entry is correctly created. `igmp_anysource_forward_stop(group)` always stops and eventually frees `(*, G)`, even when the new igmp is `(S, G)`, leaving a bad state. I.e, the new entry for `(S, G)` causes `(*, G)` to be deleted. Tested the fix with multiple receivers on the same interface with several ssm and any source senders and receivers with various combination of start/stop orders and they all worked correctly. Fixes: #15630 Signed-off-by: Jafar Al-Gharaibeh (cherry picked from commit a951960a15e8b6b5ed248abb0ecc9eb4e9a3427f) --- diff --git a/pimd/pim_igmpv3.c b/pimd/pim_igmpv3.c index 8961c93263..787641c74c 100644 --- a/pimd/pim_igmpv3.c +++ b/pimd/pim_igmpv3.c @@ -479,8 +479,6 @@ struct gm_source *igmp_get_source_by_addr(struct gm_group *group, listnode_add(group->group_source_list, src); - /* Any source (*,G) is forwarded only if mode is EXCLUDE {empty} */ - igmp_anysource_forward_stop(group); return src; }