Skip to content

{bp-19436} fix(net/igmp): restore General Query handling broken by pointer compare - #19619

Merged
xiaoxiang781216 merged 1 commit into
apache:releases/13.0from
jerpelea:bp-19436
Aug 3, 2026
Merged

{bp-19436} fix(net/igmp): restore General Query handling broken by pointer compare#19619
xiaoxiang781216 merged 1 commit into
apache:releases/13.0from
jerpelea:bp-19436

Conversation

@jerpelea

@jerpelea jerpelea commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Summary

The group address in the IGMP header is declared as uint16_t grpaddr[2], so it decays to a pointer. Comparing it against INADDR_ANY compares the address of a struct member against 0, which is always false. The General Query branch is therefore unreachable and GCC discards it entirely.

Commit 09bb292 ("net/igmp: fix build warning on GCC 12.2.0") replaced the original

if (igmp->grpaddr == 0)

with

if (net_ipv4addr_cmp(igmp->grpaddr, INADDR_ANY) != 0)

but net_ipv4addr_cmp(a, b) expands to (a == b) and INADDR_ANY expands to ((in_addr_t)0), so the emitted comparison is unchanged. The -Waddress diagnostic disappeared only because the comparison now originates inside a macro expanded from a header included via -isystem, and GCC suppresses warnings from system-header macros. The defect was hidden, not fixed.

That commit also rewrote the unicast query test from group->grpaddr != 0, which was well-formed, into the same pointer comparison, making it unconditionally true.

Convert the header field with net_ip4addr_conv32() once, and compare the resulting in_addr_t. The conversion was already being done in the group-specific branch, so this only hoists it and reuses it.

Impact: a General Query (destination 224.0.0.1, group address 0) is the periodic query every IGMP querier sends. It currently falls through to the group-specific branch, where igmp_grpallocfind() allocates a group for 0.0.0.0 and schedules a report for it, while joined groups never have their report timers restarted. The querier then ages out the membership and multicast delivery to the device stops.

Impact

RELEASE

Testing

CI

The group address in the IGMP header is declared as uint16_t grpaddr[2],
so it decays to a pointer.  Comparing it against INADDR_ANY compares the
address of a struct member against 0, which is always false.  The General
Query branch is therefore unreachable and GCC discards it entirely.

Commit 09bb292 ("net/igmp: fix build warning on GCC 12.2.0") replaced
the original

    if (igmp->grpaddr == 0)

with

    if (net_ipv4addr_cmp(igmp->grpaddr, INADDR_ANY) != 0)

but net_ipv4addr_cmp(a, b) expands to (a == b) and INADDR_ANY expands to
((in_addr_t)0), so the emitted comparison is unchanged.  The -Waddress
diagnostic disappeared only because the comparison now originates inside
a macro expanded from a header included via -isystem, and GCC suppresses
warnings from system-header macros.  The defect was hidden, not fixed.

That commit also rewrote the unicast query test from group->grpaddr != 0,
which was well-formed, into the same pointer comparison, making it
unconditionally true.

Convert the header field with net_ip4addr_conv32() once, and compare the
resulting in_addr_t.  The conversion was already being done in the
group-specific branch, so this only hoists it and reuses it.

Impact: a General Query (destination 224.0.0.1, group address 0) is the
periodic query every IGMP querier sends.  It currently falls through to
the group-specific branch, where igmp_grpallocfind() allocates a group
for 0.0.0.0 and schedules a report for it, while joined groups never have
their report timers restarted.  The querier then ages out the membership
and multicast delivery to the device stops.

Signed-off-by: Jacob Dahl <dahl.jakejacob@gmail.com>
@jerpelea
jerpelea requested a review from yamt as a code owner August 3, 2026 08:16
@github-actions github-actions Bot added Area: Networking Effects networking subsystem Size: S The size of the change in this PR is small labels Aug 3, 2026
@xiaoxiang781216
xiaoxiang781216 merged commit 08961fa into apache:releases/13.0 Aug 3, 2026
16 of 41 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Area: Networking Effects networking subsystem Size: S The size of the change in this PR is small

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants