From: Paolo Abeni <pabeni@redhat.com>
To: edumazet@google.com, tung.quang.nguyen@est.tech
Cc: davem@davemloft.net, kuba@kernel.org, horms@kernel.org,
netdev@vger.kernel.org, eric.dumazet@gmail.com,
jamesburton@meta.com, stable@vger.kernel.org, security@1seal.org,
jmaloy@redhat.com, netdev-bot+sashiko@kernel.org
Subject: Re: [PATCH net] tipc: reject invalid and unexpected GRP_ACK_MSG to prevent bc_ackers underflow
Date: Thu, 17 Sep 2026 10:09:56 +0200 [thread overview]
Message-ID: <126c1419-0df6-49b5-9cef-cb9f45c716c0@redhat.com> (raw)
In-Reply-To: <178936156410.22033.16977639465746131797@kernel.org>
On 9/14/26 06:52, netdev-bot+sashiko@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential
> issue(s) to consider:
>
> Critical: 0 · High: 0 · Medium: 1 (1) · Low: 0
>
> - [Medium] Incomplete ACK accounting in tipc_group_proto_rcv()
> (net/tipc/group.c:799-808): the new validation gates the decrement of…
>
> Pre-existing issues:
> - [Medium] Pre-existing (not introduced or claimed by this patch): in
> tipc_send_group_bcast() (net/tipc/socket.c:1131-1137) the packets…
>
> --
>
> tipc: reject invalid and unexpected GRP_ACK_MSG to prevent bc_ackers underflow
>
> This tightens the GRP_ACK_MSG path in tipc_group_proto_rcv() so that the
> message is dropped when grp->bc_ackers is zero, and so that only an ACK
> whose value equals grp->bc_snd_nxt (and which is not a repeat of the
> member's own last ACK) is allowed to decrement grp->bc_ackers.
>
>> diff --git a/net/tipc/group.c b/net/tipc/group.c
>> index 14e6732624e28..74f6d3dac0784 100644
>> --- a/net/tipc/group.c
>> +++ b/net/tipc/group.c
>> @@ -797,10 +797,10 @@ void tipc_group_proto_rcv(struct tipc_group *grp, bool *usr_wakeup,
>> tipc_group_open(m, usr_wakeup);
>> return;
>> case GRP_ACK_MSG:
>> - if (!m)
>> + if (!m || !grp->bc_ackers)
>> return;
>> acked = msg_grp_bc_acked(hdr);
>> - if (less_eq(acked, m->bc_acked))
>> + if (acked != grp->bc_snd_nxt || m->bc_acked == acked)
>> return;
>> m->bc_acked = acked;
>> if (--grp->bc_ackers)
>
> [Severity: Medium]
> The new test gates the decrement on the sequence value and on per-member
> duplication. Does it also need to check that the acking member was one of
> the members actually counted into grp->bc_ackers for the current round?
>
> tipc_group_update_bc_members() counts and re-arms receivers only:
>
> net/tipc/group.c:tipc_group_update_bc_members() {
> u16 prev = grp->bc_snd_nxt - 1;
> ...
> for (n = rb_first(&grp->members); n; n = rb_next(n)) {
> m = container_of(n, struct tipc_member, tree_node);
> if (tipc_group_is_receiver(m)) {
> tipc_group_update_member(m, len);
> m->bc_acked = prev;
> ackers++;
> }
> }
>
> /* Mark number of acknowledges to expect, if any */
> if (ack)
> grp->bc_ackers = ackers;
> grp->bc_snd_nxt++;
> }
>
> A member in MBR_JOINING or MBR_LEAVING is therefore neither summed into
> ackers nor re-armed, so it keeps a stale m->bc_acked. The same holds for a
> member created after the round was published, since
> tipc_group_create_member() sets:
>
> m->bc_acked = grp->bc_snd_nxt - 1;
>
> In both cases m->bc_acked differs from grp->bc_snd_nxt, so a GRP_ACK_MSG
> from that member passes both new conditions and still executes
> --grp->bc_ackers although it contributed no increment. The lookup on this
> path, tipc_group_find_member(), applies no state filter.
>
> Can that let grp->bc_ackers reach zero while a counted receiver still owes
> an ACK? The number of accepted decrements per round looks bounded by
> grp->member_cnt rather than by the counted acker set.
>
> If bc_ackers is cleared early, tipc_group_bc_cong() stops reporting
> congestion:
>
> net/tipc/group.c:tipc_group_bc_cong() {
> /* If prev bcast was replicast, reject until all receivers have acked */
> if (grp->bc_ackers) {
> *grp->open = false;
> return true;
> }
>
> so the sender releases the next group broadcast while the previous replicast
> round is still outstanding, which is the ordering guarantee from
> 2f487712b893, one of the Fixes tags on this patch. The zero-transition
> branch also runs list_del_init(&m->small_win) and *m->group->open = true for
> the acking member, which need not be a receiver, and the genuine acker's
> later ACK is then swallowed by the new !grp->bc_ackers guard, so its
> small_win / tipc_group_update_member() bookkeeping never runs.
>
> The commit message states that "each member can acknowledge at most once per
> round" - that part holds per member, but does it cover members that were
> never counted for the round?
>
> Would a per-round marker set in tipc_group_update_bc_members(), or accepting
> only members whose m->bc_acked == grp->bc_snd_nxt - 2, close the remaining
> gap?
>
> The u16 wrap to 65535 itself does look closed by the new !grp->bc_ackers
> guard, so what is left here is the premature clearing of the counter that
> item 2 of the commit message also mentions.
My reading of the above is that it's a slightly different problem, that
could/should deserve a separate patch. WDYT?
/P
next prev parent reply other threads:[~2026-09-17 8:10 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-13 4:42 [PATCH net] tipc: reject invalid and unexpected GRP_ACK_MSG to prevent bc_ackers underflow Eric Dumazet
2026-09-14 4:52 ` netdev-bot+sashiko
2026-09-17 8:09 ` Paolo Abeni [this message]
2026-09-18 22:50 ` patchwork-bot+netdevbpf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=126c1419-0df6-49b5-9cef-cb9f45c716c0@redhat.com \
--to=pabeni@redhat.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=eric.dumazet@gmail.com \
--cc=horms@kernel.org \
--cc=jamesburton@meta.com \
--cc=jmaloy@redhat.com \
--cc=kuba@kernel.org \
--cc=netdev-bot+sashiko@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=security@1seal.org \
--cc=stable@vger.kernel.org \
--cc=tung.quang.nguyen@est.tech \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox