* [PATCH net-next v1] tcp: Correct signedness in skb remaining space calculation
@ 2025-07-02 11:00 Jiayuan Chen
2025-07-02 13:41 ` Jiayuan Chen
0 siblings, 1 reply; 9+ messages in thread
From: Jiayuan Chen @ 2025-07-02 11:00 UTC (permalink / raw)
To: netdev
Cc: mrpre, Jiayuan Chen, Eric Dumazet, Neal Cardwell,
Kuniyuki Iwashima, David S. Miller, David Ahern, Jakub Kicinski,
Paolo Abeni, Simon Horman, David Howells, linux-kernel
The calculation for the remaining space, 'copy = size_goal - skb->len',
was prone to an integer promotion bug that prevented copy from ever being
negative.
The variable types involved are:
copy: ssize_t (long)
size_goal: int
skb->len: unsigned int
Due to C's type promotion rules, the signed size_goal is converted to an
unsigned int to match skb->len before the subtraction. The result is an
unsigned int.
When this unsigned int result is then assigned to the s64 copy variable,
it is zero-extended, preserving its non-negative value. Consequently,
copy is always >= 0.
The intended logic is that a negative copy value indicates that the tail
skb lacks sufficient space for appending new data, which should trigger
the allocation of a new skb. Because of this bug, the condition copy <= 0
was never met, causing the code to always append to the tail skb.
Fixes: 270a1c3de47e ("tcp: Support MSG_SPLICE_PAGES")
Signed-off-by: Jiayuan Chen <jiayuan.chen@linux.dev>
---
net/ipv4/tcp.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 8a3c99246d2e..ed942cd17351 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -1180,7 +1180,7 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size)
skb = tcp_write_queue_tail(sk);
if (skb)
- copy = size_goal - skb->len;
+ copy = size_goal - (ssize_t)skb->len;
trace_tcp_sendmsg_locked(sk, msg, skb, size_goal);
--
2.47.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH net-next v1] tcp: Correct signedness in skb remaining space calculation
2025-07-02 11:00 [PATCH net-next v1] tcp: Correct signedness in skb remaining space calculation Jiayuan Chen
@ 2025-07-02 13:41 ` Jiayuan Chen
2025-07-02 13:59 ` Eric Dumazet
0 siblings, 1 reply; 9+ messages in thread
From: Jiayuan Chen @ 2025-07-02 13:41 UTC (permalink / raw)
To: netdev
Cc: mrpre, Eric Dumazet, Neal Cardwell, Kuniyuki Iwashima,
David S. Miller, David Ahern, Jakub Kicinski, Paolo Abeni,
Simon Horman, David Howells, linux-kernel
July 2, 2025 at 19:00, "Jiayuan Chen" <jiayuan.chen@linux.dev> wrote:
>
> The calculation for the remaining space, 'copy = size_goal - skb->len',
>
> was prone to an integer promotion bug that prevented copy from ever being
>
> negative.
>
> The variable types involved are:
>
> copy: ssize_t (long)
>
> size_goal: int
>
> skb->len: unsigned int
>
> Due to C's type promotion rules, the signed size_goal is converted to an
>
> unsigned int to match skb->len before the subtraction. The result is an
>
> unsigned int.
>
> When this unsigned int result is then assigned to the s64 copy variable,
>
> it is zero-extended, preserving its non-negative value. Consequently,
>
> copy is always >= 0.
>
To better explain this problem, consider the following example:
'''
#include <sys/types.h>
#include <stdio.h>
int size_goal = 536;
unsigned int skblen = 1131;
void main() {
ssize_t copy = 0;
copy = size_goal - skblen;
printf("wrong: %zd\n", copy);
copy = size_goal - (ssize_t)skblen;
printf("correct: %zd\n", copy);
return;
}
'''
Output:
'''
wrong: 4294966701
correct: -595
'''
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net-next v1] tcp: Correct signedness in skb remaining space calculation
2025-07-02 13:41 ` Jiayuan Chen
@ 2025-07-02 13:59 ` Eric Dumazet
2025-07-02 14:02 ` Eric Dumazet
0 siblings, 1 reply; 9+ messages in thread
From: Eric Dumazet @ 2025-07-02 13:59 UTC (permalink / raw)
To: Jiayuan Chen
Cc: netdev, mrpre, Neal Cardwell, Kuniyuki Iwashima, David S. Miller,
David Ahern, Jakub Kicinski, Paolo Abeni, Simon Horman,
David Howells, linux-kernel
On Wed, Jul 2, 2025 at 6:42 AM Jiayuan Chen <jiayuan.chen@linux.dev> wrote:
>
> July 2, 2025 at 19:00, "Jiayuan Chen" <jiayuan.chen@linux.dev> wrote:
>
>
> >
> > The calculation for the remaining space, 'copy = size_goal - skb->len',
> >
> > was prone to an integer promotion bug that prevented copy from ever being
> >
> > negative.
> >
> > The variable types involved are:
> >
> > copy: ssize_t (long)
> >
> > size_goal: int
> >
> > skb->len: unsigned int
> >
> > Due to C's type promotion rules, the signed size_goal is converted to an
> >
> > unsigned int to match skb->len before the subtraction. The result is an
> >
> > unsigned int.
> >
> > When this unsigned int result is then assigned to the s64 copy variable,
> >
> > it is zero-extended, preserving its non-negative value. Consequently,
> >
> > copy is always >= 0.
> >
>
> To better explain this problem, consider the following example:
> '''
> #include <sys/types.h>
> #include <stdio.h>
> int size_goal = 536;
> unsigned int skblen = 1131;
>
> void main() {
> ssize_t copy = 0;
> copy = size_goal - skblen;
> printf("wrong: %zd\n", copy);
>
> copy = size_goal - (ssize_t)skblen;
> printf("correct: %zd\n", copy);
> return;
> }
> '''
> Output:
> '''
> wrong: 4294966701
> correct: -595
> '''
Can you explain how one skb could have more bytes (skb->len) than size_goal ?
If we are under this condition, we already have a prior bug ?
Please describe how you caught this issue.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net-next v1] tcp: Correct signedness in skb remaining space calculation
2025-07-02 13:59 ` Eric Dumazet
@ 2025-07-02 14:02 ` Eric Dumazet
2025-07-02 15:27 ` Jiayuan Chen
0 siblings, 1 reply; 9+ messages in thread
From: Eric Dumazet @ 2025-07-02 14:02 UTC (permalink / raw)
To: Jiayuan Chen
Cc: netdev, mrpre, Neal Cardwell, Kuniyuki Iwashima, David S. Miller,
David Ahern, Jakub Kicinski, Paolo Abeni, Simon Horman,
David Howells, linux-kernel
On Wed, Jul 2, 2025 at 6:59 AM Eric Dumazet <edumazet@google.com> wrote:
>
> On Wed, Jul 2, 2025 at 6:42 AM Jiayuan Chen <jiayuan.chen@linux.dev> wrote:
> >
> > July 2, 2025 at 19:00, "Jiayuan Chen" <jiayuan.chen@linux.dev> wrote:
> >
> >
> > >
> > > The calculation for the remaining space, 'copy = size_goal - skb->len',
> > >
> > > was prone to an integer promotion bug that prevented copy from ever being
> > >
> > > negative.
> > >
> > > The variable types involved are:
> > >
> > > copy: ssize_t (long)
> > >
> > > size_goal: int
> > >
> > > skb->len: unsigned int
> > >
> > > Due to C's type promotion rules, the signed size_goal is converted to an
> > >
> > > unsigned int to match skb->len before the subtraction. The result is an
> > >
> > > unsigned int.
> > >
> > > When this unsigned int result is then assigned to the s64 copy variable,
> > >
> > > it is zero-extended, preserving its non-negative value. Consequently,
> > >
> > > copy is always >= 0.
> > >
> >
> > To better explain this problem, consider the following example:
> > '''
> > #include <sys/types.h>
> > #include <stdio.h>
> > int size_goal = 536;
> > unsigned int skblen = 1131;
> >
> > void main() {
> > ssize_t copy = 0;
> > copy = size_goal - skblen;
> > printf("wrong: %zd\n", copy);
> >
> > copy = size_goal - (ssize_t)skblen;
> > printf("correct: %zd\n", copy);
> > return;
> > }
> > '''
> > Output:
> > '''
> > wrong: 4294966701
> > correct: -595
> > '''
>
> Can you explain how one skb could have more bytes (skb->len) than size_goal ?
>
> If we are under this condition, we already have a prior bug ?
>
> Please describe how you caught this issue.
Also, not sure why copy variable had to be changed from "int" to "ssize_t"
A nicer patch (without a cast) would be to make it an "int" again/
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net-next v1] tcp: Correct signedness in skb remaining space calculation
2025-07-02 14:02 ` Eric Dumazet
@ 2025-07-02 15:27 ` Jiayuan Chen
2025-07-02 15:34 ` Eric Dumazet
0 siblings, 1 reply; 9+ messages in thread
From: Jiayuan Chen @ 2025-07-02 15:27 UTC (permalink / raw)
To: Eric Dumazet
Cc: netdev, mrpre, Neal Cardwell, Kuniyuki Iwashima, David S. Miller,
David Ahern, Jakub Kicinski, Paolo Abeni, Simon Horman,
David Howells, linux-kernel
July 2, 2025 at 22:02, "Eric Dumazet" <edumazet@google.com> wrote:
>
> On Wed, Jul 2, 2025 at 6:59 AM Eric Dumazet <edumazet@google.com> wrote:
>
> >
> > On Wed, Jul 2, 2025 at 6:42 AM Jiayuan Chen <jiayuan.chen@linux.dev> wrote:
> >
> > July 2, 2025 at 19:00, "Jiayuan Chen" <jiayuan.chen@linux.dev> wrote:
> >
> > >
> >
> > > The calculation for the remaining space, 'copy = size_goal - skb->len',
> >
> > >
> >
> > > was prone to an integer promotion bug that prevented copy from ever being
> >
> > >
> >
> > > negative.
> >
> > >
> >
> > > The variable types involved are:
> >
> > >
> >
> > > copy: ssize_t (long)
> >
> > >
> >
> > > size_goal: int
> >
> > >
> >
> > > skb->len: unsigned int
> >
> > >
> >
> > > Due to C's type promotion rules, the signed size_goal is converted to an
> >
> > >
> >
> > > unsigned int to match skb->len before the subtraction. The result is an
> >
> > >
> >
> > > unsigned int.
> >
> > >
> >
> > > When this unsigned int result is then assigned to the s64 copy variable,
> >
> > >
> >
> > > it is zero-extended, preserving its non-negative value. Consequently,
> >
> > >
> >
> > > copy is always >= 0.
> >
> > >
> >
> > To better explain this problem, consider the following example:
> >
> > '''
> >
> > #include <sys/types.h>
> >
> > #include <stdio.h>
> >
> > int size_goal = 536;
> >
> > unsigned int skblen = 1131;
> >
> > void main() {
> >
> > ssize_t copy = 0;
> >
> > copy = size_goal - skblen;
> >
> > printf("wrong: %zd\n", copy);
> >
> > copy = size_goal - (ssize_t)skblen;
> >
> > printf("correct: %zd\n", copy);
> >
> > return;
> >
> > }
> >
> > '''
> >
> > Output:
> >
> > '''
> >
> > wrong: 4294966701
> >
> > correct: -595
> >
> > '''
> >
> > Can you explain how one skb could have more bytes (skb->len) than size_goal ?
> >
> > If we are under this condition, we already have a prior bug ?
> >
> > Please describe how you caught this issue.
> >
>
> Also, not sure why copy variable had to be changed from "int" to "ssize_t"
>
> A nicer patch (without a cast) would be to make it an "int" again/
>
I encountered this issue because I had tcp_repair enabled, which uses
tcp_init_tso_segs to reset the MSS.
However, it seems that tcp_bound_to_half_wnd also dynamically adjusts
the value to be smaller than the current size_goal.
Looking at the commit history, it's indeed unnecessary to define the
copy variable as type ssize_t.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net-next v1] tcp: Correct signedness in skb remaining space calculation
2025-07-02 15:27 ` Jiayuan Chen
@ 2025-07-02 15:34 ` Eric Dumazet
2025-07-03 12:03 ` Jiayuan Chen
0 siblings, 1 reply; 9+ messages in thread
From: Eric Dumazet @ 2025-07-02 15:34 UTC (permalink / raw)
To: Jiayuan Chen
Cc: netdev, mrpre, Neal Cardwell, Kuniyuki Iwashima, David S. Miller,
David Ahern, Jakub Kicinski, Paolo Abeni, Simon Horman,
David Howells, linux-kernel
On Wed, Jul 2, 2025 at 8:28 AM Jiayuan Chen <jiayuan.chen@linux.dev> wrote:
>
> July 2, 2025 at 22:02, "Eric Dumazet" <edumazet@google.com> wrote:
>
>
>
> >
> > On Wed, Jul 2, 2025 at 6:59 AM Eric Dumazet <edumazet@google.com> wrote:
> >
> > >
> > > On Wed, Jul 2, 2025 at 6:42 AM Jiayuan Chen <jiayuan.chen@linux.dev> wrote:
> > >
> > > July 2, 2025 at 19:00, "Jiayuan Chen" <jiayuan.chen@linux.dev> wrote:
> > >
> > > >
> > >
> > > > The calculation for the remaining space, 'copy = size_goal - skb->len',
> > >
> > > >
> > >
> > > > was prone to an integer promotion bug that prevented copy from ever being
> > >
> > > >
> > >
> > > > negative.
> > >
> > > >
> > >
> > > > The variable types involved are:
> > >
> > > >
> > >
> > > > copy: ssize_t (long)
> > >
> > > >
> > >
> > > > size_goal: int
> > >
> > > >
> > >
> > > > skb->len: unsigned int
> > >
> > > >
> > >
> > > > Due to C's type promotion rules, the signed size_goal is converted to an
> > >
> > > >
> > >
> > > > unsigned int to match skb->len before the subtraction. The result is an
> > >
> > > >
> > >
> > > > unsigned int.
> > >
> > > >
> > >
> > > > When this unsigned int result is then assigned to the s64 copy variable,
> > >
> > > >
> > >
> > > > it is zero-extended, preserving its non-negative value. Consequently,
> > >
> > > >
> > >
> > > > copy is always >= 0.
> > >
> > > >
> > >
> > > To better explain this problem, consider the following example:
> > >
> > > '''
> > >
> > > #include <sys/types.h>
> > >
> > > #include <stdio.h>
> > >
> > > int size_goal = 536;
> > >
> > > unsigned int skblen = 1131;
> > >
> > > void main() {
> > >
> > > ssize_t copy = 0;
> > >
> > > copy = size_goal - skblen;
> > >
> > > printf("wrong: %zd\n", copy);
> > >
> > > copy = size_goal - (ssize_t)skblen;
> > >
> > > printf("correct: %zd\n", copy);
> > >
> > > return;
> > >
> > > }
> > >
> > > '''
> > >
> > > Output:
> > >
> > > '''
> > >
> > > wrong: 4294966701
> > >
> > > correct: -595
> > >
> > > '''
> > >
> > > Can you explain how one skb could have more bytes (skb->len) than size_goal ?
> > >
> > > If we are under this condition, we already have a prior bug ?
> > >
> > > Please describe how you caught this issue.
> > >
> >
> > Also, not sure why copy variable had to be changed from "int" to "ssize_t"
> >
> > A nicer patch (without a cast) would be to make it an "int" again/
> >
>
> I encountered this issue because I had tcp_repair enabled, which uses
> tcp_init_tso_segs to reset the MSS.
> However, it seems that tcp_bound_to_half_wnd also dynamically adjusts
> the value to be smaller than the current size_goal.
>
Okay, and what was the end result ?
An skb has a limited amount of bytes that can be put into it
(MAX_SKB_FRAGS * 32K) , and I can't see what are the effects of having
an
"not optimally sized skb in socket write queue".
BTW if you have a tcp_repair test, I would love having it in the
tools/testing/selftests/net :)
Thanks.
> Looking at the commit history, it's indeed unnecessary to define the
> copy variable as type ssize_t.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net-next v1] tcp: Correct signedness in skb remaining space calculation
2025-07-02 15:34 ` Eric Dumazet
@ 2025-07-03 12:03 ` Jiayuan Chen
2025-07-03 12:06 ` Jiayuan Chen
2025-07-03 12:33 ` Eric Dumazet
0 siblings, 2 replies; 9+ messages in thread
From: Jiayuan Chen @ 2025-07-03 12:03 UTC (permalink / raw)
To: Eric Dumazet
Cc: netdev, mrpre, Neal Cardwell, Kuniyuki Iwashima, David S. Miller,
David Ahern, Jakub Kicinski, Paolo Abeni, Simon Horman,
David Howells, linux-kernel
2025/7/2 23:34, "Eric Dumazet" <edumazet@google.com> 写到:
>
> On Wed, Jul 2, 2025 at 8:28 AM Jiayuan Chen <jiayuan.chen@linux.dev> wrote:
>
> >
> > July 2, 2025 at 22:02, "Eric Dumazet" <edumazet@google.com> wrote:
> >
> > On Wed, Jul 2, 2025 at 6:59 AM Eric Dumazet <edumazet@google.com> wrote:
> >
> > >
> >
> > > On Wed, Jul 2, 2025 at 6:42 AM Jiayuan Chen <jiayuan.chen@linux.dev> wrote:
> >
> > >
> >
> > > July 2, 2025 at 19:00, "Jiayuan Chen" <jiayuan.chen@linux.dev> wrote:
> >
> > >
> >
> > > >
> >
> > >
> >
> > > > The calculation for the remaining space, 'copy = size_goal - skb->len',
> >
> > >
> >
> > > >
> >
> > >
> >
> > > > was prone to an integer promotion bug that prevented copy from ever being
> >
> > >
> >
> > > >
> >
> > >
> >
> > > > negative.
> >
> > >
> >
> > > >
> >
> > >
> >
> > > > The variable types involved are:
> >
> > >
> >
> > > >
> >
> > >
> >
> > > > copy: ssize_t (long)
> >
> > >
> >
> > > >
> >
> > >
> >
> > > > size_goal: int
> >
> > >
> >
> > > >
> >
> > >
> >
> > > > skb->len: unsigned int
> >
> > >
> >
> > > >
> >
> > >
> >
> > > > Due to C's type promotion rules, the signed size_goal is converted to an
> >
> > >
> >
> > > >
> >
> > >
> >
> > > > unsigned int to match skb->len before the subtraction. The result is an
> >
> > >
> >
> > > >
> >
> > >
> >
> > > > unsigned int.
> >
> > >
> >
> > > >
> >
> > >
> >
> > > > When this unsigned int result is then assigned to the s64 copy variable,
> >
> > >
> >
> > > >
> >
> > >
> >
> > > > it is zero-extended, preserving its non-negative value. Consequently,
> >
> > >
> >
> > > >
> >
> > >
> >
> > > > copy is always >= 0.
> >
> > >
> >
> > > >
> >
> > >
> >
> > > To better explain this problem, consider the following example:
> >
> > >
> >
> > > '''
> >
> > >
> >
> > > #include <sys/types.h>
> >
> > >
> >
> > > #include <stdio.h>
> >
> > >
> >
> > > int size_goal = 536;
> >
> > >
> >
> > > unsigned int skblen = 1131;
> >
> > >
> >
> > > void main() {
> >
> > >
> >
> > > ssize_t copy = 0;
> >
> > >
> >
> > > copy = size_goal - skblen;
> >
> > >
> >
> > > printf("wrong: %zd\n", copy);
> >
> > >
> >
> > > copy = size_goal - (ssize_t)skblen;
> >
> > >
> >
> > > printf("correct: %zd\n", copy);
> >
> > >
> >
> > > return;
> >
> > >
> >
> > > }
> >
> > >
> >
> > > '''
> >
> > >
> >
> > > Output:
> >
> > >
> >
> > > '''
> >
> > >
> >
> > > wrong: 4294966701
> >
> > >
> >
> > > correct: -595
> >
> > >
> >
> > > '''
> >
> > >
> >
> > > Can you explain how one skb could have more bytes (skb->len) than size_goal ?
> >
> > >
> >
> > > If we are under this condition, we already have a prior bug ?
> >
> > >
> >
> > > Please describe how you caught this issue.
> >
> > >
> >
> > Also, not sure why copy variable had to be changed from "int" to "ssize_t"
> >
> > A nicer patch (without a cast) would be to make it an "int" again/
> >
> > I encountered this issue because I had tcp_repair enabled, which uses
> >
> > tcp_init_tso_segs to reset the MSS.
> >
> > However, it seems that tcp_bound_to_half_wnd also dynamically adjusts
> >
> > the value to be smaller than the current size_goal.
> >
>
> Okay, and what was the end result ?
>
> An skb has a limited amount of bytes that can be put into it
>
> (MAX_SKB_FRAGS * 32K) , and I can't see what are the effects of having
>
Hi Eric,
I'm working with a reproducer generated by syzkaller [1], and its core
logic is roughly as follows:
'''
setsockopt(fd, TCP_REPAIR, 1)
connect(fd);
setsockopt(fd, TCP_REPAIR, -1)
send(fd, small);
sendmmsg(fd, buffer_2G);
'''
First, because TCP_REPAIR is enabled, the send() operation leaves the skb
at the tail of the write_queue. Subsequently, sendmmsg is called to send
2GB of data.
Due to TCP_REPAIR, the size_goal is reduced, which can cause the copy
variable to become negative. However, because of integer promotion bug
mentioned in the previous email, this negative value is misinterpreted as
a large positive number. Ultimately, copy becomes a huge value, approaching
the int32 limit. This, in turn, causes sk->sk_forward_alloc to overflow,
which is the exact issue reported by syzkaller.
On a related note, even without using TCP_REPAIR, the tcp_bound_to_half_wnd()
function can also reduce size_goal on its own. Therefore, my understanding is
that under extreme conditions, we might still encounter an overflow in
sk->sk_forward_alloc.
So, I think we have good reason to change copy to an int.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net-next v1] tcp: Correct signedness in skb remaining space calculation
2025-07-03 12:03 ` Jiayuan Chen
@ 2025-07-03 12:06 ` Jiayuan Chen
2025-07-03 12:33 ` Eric Dumazet
1 sibling, 0 replies; 9+ messages in thread
From: Jiayuan Chen @ 2025-07-03 12:06 UTC (permalink / raw)
To: Eric Dumazet
Cc: netdev, mrpre, Neal Cardwell, Kuniyuki Iwashima, David S. Miller,
David Ahern, Jakub Kicinski, Paolo Abeni, Simon Horman,
David Howells, linux-kernel
2025/7/3 20:03, "Jiayuan Chen" <jiayuan.chen@linux.dev> 写到:
>
> Hi Eric,
>
> I'm working with a reproducer generated by syzkaller [1], and its core
https://syzkaller.appspot.com/bug?extid=de6565462ab540f50e47
(sorry losting the link...)
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net-next v1] tcp: Correct signedness in skb remaining space calculation
2025-07-03 12:03 ` Jiayuan Chen
2025-07-03 12:06 ` Jiayuan Chen
@ 2025-07-03 12:33 ` Eric Dumazet
1 sibling, 0 replies; 9+ messages in thread
From: Eric Dumazet @ 2025-07-03 12:33 UTC (permalink / raw)
To: Jiayuan Chen
Cc: netdev, mrpre, Neal Cardwell, Kuniyuki Iwashima, David S. Miller,
David Ahern, Jakub Kicinski, Paolo Abeni, Simon Horman,
David Howells, linux-kernel
On Thu, Jul 3, 2025 at 5:03 AM Jiayuan Chen <jiayuan.chen@linux.dev> wrote:
> Hi Eric,
>
> I'm working with a reproducer generated by syzkaller [1], and its core
> logic is roughly as follows:
>
> '''
> setsockopt(fd, TCP_REPAIR, 1)
> connect(fd);
> setsockopt(fd, TCP_REPAIR, -1)
>
> send(fd, small);
> sendmmsg(fd, buffer_2G);
> '''
>
> First, because TCP_REPAIR is enabled, the send() operation leaves the skb
> at the tail of the write_queue. Subsequently, sendmmsg is called to send
> 2GB of data.
>
> Due to TCP_REPAIR, the size_goal is reduced, which can cause the copy
> variable to become negative. However, because of integer promotion bug
> mentioned in the previous email, this negative value is misinterpreted as
> a large positive number. Ultimately, copy becomes a huge value, approaching
> the int32 limit. This, in turn, causes sk->sk_forward_alloc to overflow,
> which is the exact issue reported by syzkaller.
>
> On a related note, even without using TCP_REPAIR, the tcp_bound_to_half_wnd()
> function can also reduce size_goal on its own. Therefore, my understanding is
> that under extreme conditions, we might still encounter an overflow in
> sk->sk_forward_alloc.
>
> So, I think we have good reason to change copy to an int.
Ok, I wish you had stated you were working on a syzbot report from the
very beginning.
Why hiding ?
Please send a V2 of the patch.
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2025-07-03 12:33 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-02 11:00 [PATCH net-next v1] tcp: Correct signedness in skb remaining space calculation Jiayuan Chen
2025-07-02 13:41 ` Jiayuan Chen
2025-07-02 13:59 ` Eric Dumazet
2025-07-02 14:02 ` Eric Dumazet
2025-07-02 15:27 ` Jiayuan Chen
2025-07-02 15:34 ` Eric Dumazet
2025-07-03 12:03 ` Jiayuan Chen
2025-07-03 12:06 ` Jiayuan Chen
2025-07-03 12:33 ` Eric Dumazet
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).