summaryrefslogtreecommitdiff
path: root/pimd
diff options
context:
space:
mode:
authorJafar Al-Gharaibeh <jafar@atcorp.com>2024-05-30 12:46:47 -0500
committerMergify <37929162+mergify[bot]@users.noreply.github.com>2024-05-31 15:00:16 +0000
commit0da61fe8a699086a4cc909fb72ffa42ffae37c9d (patch)
tree7f9dca016e8560d6d2473be0bf6fdd37615e3de4 /pimd
parenta6510b4dc625ecc07b1cdc8a832c765627103171 (diff)
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 <jafar@atcorp.com> (cherry picked from commit a951960a15e8b6b5ed248abb0ecc9eb4e9a3427f)
Diffstat (limited to 'pimd')
-rw-r--r--pimd/pim_igmpv3.c2
1 files changed, 0 insertions, 2 deletions
diff --git a/pimd/pim_igmpv3.c b/pimd/pim_igmpv3.c
index 18a9fb7c6c..2c5ad4d44b 100644
--- a/pimd/pim_igmpv3.c
+++ b/pimd/pim_igmpv3.c
@@ -457,8 +457,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;
}