Skip to content

Commit 9d04b4d

Browse files
Lu Weigregkh
authored andcommitted
tcp: fix a signed-integer-overflow bug in tcp_add_backlog()
[ Upstream commit ec791d8 ] The type of sk_rcvbuf and sk_sndbuf in struct sock is int, and in tcp_add_backlog(), the variable limit is caculated by adding sk_rcvbuf, sk_sndbuf and 64 * 1024, it may exceed the max value of int and overflow. This patch reduces the limit budget by halving the sndbuf to solve this issue since ACK packets are much smaller than the payload. Fixes: c9c3321 ("tcp: add tcp_add_backlog()") Signed-off-by: Lu Wei <luwei32@huawei.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Acked-by: Kuniyuki Iwashima <kuniyu@amazon.com> Signed-off-by: David S. Miller <davem@davemloft.net> Stable-dep-of: ec00ed4 ("tcp: avoid premature drops in tcp_add_backlog()") Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 527eaa5 commit 9d04b4d

1 file changed

Lines changed: 3 additions & 1 deletion

File tree

net/ipv4/tcp_ipv4.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1781,11 +1781,13 @@ bool tcp_add_backlog(struct sock *sk, struct sk_buff *skb)
17811781
__skb_push(skb, hdrlen);
17821782

17831783
no_coalesce:
1784+
limit = (u32)READ_ONCE(sk->sk_rcvbuf) + (u32)(READ_ONCE(sk->sk_sndbuf) >> 1);
1785+
17841786
/* Only socket owner can try to collapse/prune rx queues
17851787
* to reduce memory overhead, so add a little headroom here.
17861788
* Few sockets backlog are possibly concurrently non empty.
17871789
*/
1788-
limit = READ_ONCE(sk->sk_rcvbuf) + READ_ONCE(sk->sk_sndbuf) + 64*1024;
1790+
limit += 64 * 1024;
17891791

17901792
if (unlikely(sk_add_backlog(sk, skb, limit))) {
17911793
bh_unlock_sock(sk);

0 commit comments

Comments
 (0)