public inbox for netdev@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH net v2] tipc: fix bc_ackers underflow on duplicate GRP_ACK_MSG
@ 2026-04-01 10:24 Oleh Konko
  2026-04-02  3:16 ` Tung Quang Nguyen
  0 siblings, 1 reply; 2+ messages in thread
From: Oleh Konko @ 2026-04-01 10:24 UTC (permalink / raw)
  To: netdev@vger.kernel.org
  Cc: jmaloy@redhat.com, davem@davemloft.net, edumazet@google.com,
	kuba@kernel.org, pabeni@redhat.com, horms@kernel.org,
	tipc-discussion@lists.sourceforge.net,
	linux-kernel@vger.kernel.org, stable@vger.kernel.org

The GRP_ACK_MSG handler in tipc_group_proto_rcv() currently decrements
bc_ackers on every inbound group ACK, even when the same member has
already acknowledged the current broadcast round.

Because bc_ackers is a u16, a duplicate ACK received after the last
legitimate ACK wraps the counter to 65535. Once wrapped,
tipc_group_bc_cong() keeps reporting congestion and later group
broadcasts on the affected socket stay blocked until the group is
recreated.

Fix this by ignoring duplicate or stale ACKs before touching bc_acked or
bc_ackers. This makes repeated GRP_ACK_MSG handling idempotent and
prevents the underflow path.

Fixes: 75da2163dbb6 ("tipc: introduce communication groups")
Cc: stable@vger.kernel.org
Signed-off-by: Oleh Konko <security@1seal.org>
---
v2:
- make duplicate or stale GRP_ACK_MSG a full no-op via early return
- place acked in reverse xmas tree style

 net/tipc/group.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/net/tipc/group.c b/net/tipc/group.c
index e0e6227b433..14e6732624e 100644
--- a/net/tipc/group.c
+++ b/net/tipc/group.c
@@ -746,6 +746,7 @@ void tipc_group_proto_rcv(struct tipc_group *grp, bool *usr_wakeup,
 	u32 port = msg_origport(hdr);
 	struct tipc_member *m, *pm;
 	u16 remitted, in_flight;
+	u16 acked;
 
 	if (!grp)
 		return;
@@ -798,7 +799,10 @@ void tipc_group_proto_rcv(struct tipc_group *grp, bool *usr_wakeup,
 	case GRP_ACK_MSG:
 		if (!m)
 			return;
-		m->bc_acked = msg_grp_bc_acked(hdr);
+		acked = msg_grp_bc_acked(hdr);
+		if (less_eq(acked, m->bc_acked))
+			return;
+		m->bc_acked = acked;
 		if (--grp->bc_ackers)
 			return;
 		list_del_init(&m->small_win);
-- 
2.50.0


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* RE: [PATCH net v2] tipc: fix bc_ackers underflow on duplicate GRP_ACK_MSG
  2026-04-01 10:24 [PATCH net v2] tipc: fix bc_ackers underflow on duplicate GRP_ACK_MSG Oleh Konko
@ 2026-04-02  3:16 ` Tung Quang Nguyen
  0 siblings, 0 replies; 2+ messages in thread
From: Tung Quang Nguyen @ 2026-04-02  3:16 UTC (permalink / raw)
  To: Oleh Konko
  Cc: jmaloy@redhat.com, davem@davemloft.net, edumazet@google.com,
	kuba@kernel.org, pabeni@redhat.com, horms@kernel.org,
	tipc-discussion@lists.sourceforge.net,
	linux-kernel@vger.kernel.org, stable@vger.kernel.org,
	netdev@vger.kernel.org

>Subject: [PATCH net v2] tipc: fix bc_ackers underflow on duplicate
>GRP_ACK_MSG
>
>The GRP_ACK_MSG handler in tipc_group_proto_rcv() currently decrements
>bc_ackers on every inbound group ACK, even when the same member has
>already acknowledged the current broadcast round.
>
>Because bc_ackers is a u16, a duplicate ACK received after the last legitimate
>ACK wraps the counter to 65535. Once wrapped,
>tipc_group_bc_cong() keeps reporting congestion and later group broadcasts
>on the affected socket stay blocked until the group is recreated.
>
>Fix this by ignoring duplicate or stale ACKs before touching bc_acked or
>bc_ackers. This makes repeated GRP_ACK_MSG handling idempotent and
>prevents the underflow path.
>
>Fixes: 75da2163dbb6 ("tipc: introduce communication groups")
AI complains that above Fixes tag is not correct:
" The Fixes: tag appears to reference the wrong commit. The bug was actually
introduced by commit 2f487712b893 ("tipc: guarantee that group broadcast
doesn't bypass group unicast").

Commit 75da2163dbb6 introduced the basic group communication feature but did
not include bc_ackers or GRP_ACK_MSG handling. Commit 2f487712b893 added the
GRP_ACK_MSG handler with the buggy unconditional decrement:

    if (--grp->bc_ackers)

Should the Fixes: tag be updated to:

    Fixes: 2f487712b893 ("tipc: guarantee that group broadcast doesn't bypass group unicast")
"
I agree with AI review result. Could you please correct the Fixes tag ?

>Cc: stable@vger.kernel.org
>Signed-off-by: Oleh Konko <security@1seal.org>
>---
>v2:
>- make duplicate or stale GRP_ACK_MSG a full no-op via early return
>- place acked in reverse xmas tree style
>
> net/tipc/group.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
>diff --git a/net/tipc/group.c b/net/tipc/group.c index
>e0e6227b433..14e6732624e 100644
>--- a/net/tipc/group.c
>+++ b/net/tipc/group.c
>@@ -746,6 +746,7 @@ void tipc_group_proto_rcv(struct tipc_group *grp, bool
>*usr_wakeup,
> 	u32 port = msg_origport(hdr);
> 	struct tipc_member *m, *pm;
> 	u16 remitted, in_flight;
>+	u16 acked;
>
> 	if (!grp)
> 		return;
>@@ -798,7 +799,10 @@ void tipc_group_proto_rcv(struct tipc_group *grp,
>bool *usr_wakeup,
> 	case GRP_ACK_MSG:
> 		if (!m)
> 			return;
>-		m->bc_acked = msg_grp_bc_acked(hdr);
>+		acked = msg_grp_bc_acked(hdr);
>+		if (less_eq(acked, m->bc_acked))
>+			return;
>+		m->bc_acked = acked;
> 		if (--grp->bc_ackers)
> 			return;
> 		list_del_init(&m->small_win);
>--
>2.50.0


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-04-02  3:16 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-01 10:24 [PATCH net v2] tipc: fix bc_ackers underflow on duplicate GRP_ACK_MSG Oleh Konko
2026-04-02  3:16 ` Tung Quang Nguyen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox