Netdev List
 help / color / mirror / Atom feed
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


  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