linux-yocto/net/ipv4
Jiayuan Chen 81373cd1d7 tcp: Correct signedness in skb remaining space calculation
[ Upstream commit d3a5f2871a ]

Syzkaller reported a bug [1] where sk->sk_forward_alloc can overflow.

When we send data, if an skb exists at the tail of the write queue, the
kernel will attempt to append the new data to that skb. However, the code
that checks for available space in the skb is flawed:
'''
copy = size_goal - skb->len
'''

The types of the variables involved are:
'''
copy: ssize_t (s64 on 64-bit systems)
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.

Assume we are sending 2GB of data and size_goal has been adjusted to a
value smaller than skb->len. The subtraction will result in copy holding a
very large positive integer. In the subsequent logic, this large value is
used to update sk->sk_forward_alloc, which can easily cause it to overflow.

The syzkaller reproducer uses TCP_REPAIR to reliably create this
condition. However, this can also occur in real-world scenarios. The
tcp_bound_to_half_wnd() function can also reduce size_goal to a small
value. This would cause the subsequent tcp_wmem_schedule() to set
sk->sk_forward_alloc to a value close to INT_MAX. Further memory
allocation requests would then cause sk_forward_alloc to wrap around and
become negative.

[1]: https://syzkaller.appspot.com/bug?extid=de6565462ab540f50e47

Reported-by: syzbot+de6565462ab540f50e47@syzkaller.appspotmail.com
Fixes: 270a1c3de4 ("tcp: Support MSG_SPLICE_PAGES")
Signed-off-by: Jiayuan Chen <jiayuan.chen@linux.dev>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: David Howells <dhowells@redhat.com>
Link: https://patch.msgid.link/20250707054112.101081-1-jiayuan.chen@linux.dev
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2025-07-17 18:35:09 +02:00
..
bpfilter
netfilter netfilter: fib: check correct rtable in vrf setups 2024-10-17 15:24:28 +02:00
af_inet.c net: inet: do not leave a dangling sk pointer in inet_create() 2024-12-14 20:00:04 +01:00
ah4.c
arp.c arp: switch to dev_getbyhwaddr() in arp_req_set_public() 2025-02-27 04:10:49 -08:00
bpf_tcp_ca.c
cipso_ipv4.c net: use unrcu_pointer() helper 2024-12-09 10:32:10 +01:00
datagram.c
devinet.c ipv4: use RCU protection in inet_select_addr() 2025-02-21 13:57:20 +01:00
esp4_offload.c
esp4.c espintcp: remove encap socket caching to avoid reference leak 2025-06-04 14:42:17 +02:00
fib_frontend.c ipv4: fib: Move fib_valid_key_len() to rtm_to_fib_config(). 2025-06-04 14:42:03 +02:00
fib_lookup.h
fib_notifier.c
fib_rules.c ip: fib_rules: Fetch net from fib_rule in fib[46]_rule_configure(). 2025-06-04 14:42:11 +02:00
fib_semantics.c net: remove NULL-pointer net parameter in ip_metrics_convert 2024-09-08 07:54:45 +02:00
fib_trie.c ipv4: fib: Move fib_valid_key_len() to rtm_to_fib_config(). 2025-06-04 14:42:03 +02:00
fou_bpf.c
fou_core.c fou: fix initialization of grc 2024-09-18 19:24:09 +02:00
fou_nl.c
fou_nl.h
gre_demux.c
gre_offload.c
icmp.c ipv4: Convert ip_route_input() to dscp_t. 2025-03-07 16:45:39 +01:00
igmp.c
inet_connection_sock.c tcp: Fix use-after-free of nreq in reqsk_timer_handler(). 2024-12-09 10:32:35 +01:00
inet_diag.c sock_diag: allow concurrent operation in sock_diag_rcv_msg() 2024-12-09 10:32:10 +01:00
inet_fragment.c net: Rename mono_delivery_time to tstamp_type for scalabilty 2025-05-09 09:43:57 +02:00
inet_hashtables.c tcp: bring back NUMA dispersion in inet_ehash_locks_alloc() 2025-06-04 14:42:01 +02:00
inet_timewait_sock.c tcp/dccp: do not care about families in inet_twsk_purge() 2024-08-29 17:33:46 +02:00
inetpeer.c inetpeer: do not get a refcount in inet_getpeer() 2025-02-08 09:51:53 +01:00
ip_forward.c
ip_fragment.c net: Rename mono_delivery_time to tstamp_type for scalabilty 2025-05-09 09:43:57 +02:00
ip_gre.c ipv4: ip_gre: Fix set but not used warning in ipgre_err() if IPv4-only 2025-06-04 14:42:12 +02:00
ip_input.c
ip_options.c ipv4: Convert ip_route_input() to dscp_t. 2025-03-07 16:45:39 +01:00
ip_output.c net: Rename mono_delivery_time to tstamp_type for scalabilty 2025-05-09 09:43:57 +02:00
ip_sockglue.c
ip_tunnel_core.c net: fix geneve_opt length integer overflow 2025-04-10 14:37:40 +02:00
ip_tunnel.c ipv4: ip_tunnel: Fix suspicious RCU usage warning in ip_tunnel_find() 2025-02-01 18:37:55 +01:00
ip_vti.c
ipcomp.c
ipconfig.c
ipip.c
ipmr_base.c ipmr: do not call mr_mfc_uses_dev() for unres entries 2025-02-08 09:52:29 +01:00
ipmr.c inet: ipmr: fix data-races 2025-02-08 09:52:02 +01:00
Kconfig
Makefile
metrics.c net: remove NULL-pointer net parameter in ip_metrics_convert 2024-09-08 07:54:45 +02:00
netfilter.c
netlink.c
nexthop.c net: nexthop: Initialize all fields in dumped nexthops 2024-08-03 08:54:38 +02:00
ping.c
proc.c net: fix IPSTATS_MIB_OUTPKGS increment in OutForwDatagrams. 2024-04-03 15:28:39 +02:00
protocol.c
raw_diag.c
raw.c ipv4: Fix uninit-value access in __ip_make_skb() 2024-05-17 12:02:07 +02:00
route.c ipv4/route: Use this_cpu_inc() for stats on PREEMPT_RT 2025-06-27 11:08:54 +01:00
syncookies.c tcp: annotate data-races around tp->window_clamp 2024-08-11 12:47:19 +02:00
sysctl_net_ipv4.c
tcp_bbr.c
tcp_bic.c
tcp_bpf.c bpf: Fix wrong copied_seq calculation 2025-02-27 04:10:50 -08:00
tcp_cdg.c
tcp_cong.c net: remove NULL-pointer net parameter in ip_metrics_convert 2024-09-08 07:54:45 +02:00
tcp_cubic.c tcp_cubic: fix incorrect HyStart round start detection 2025-02-08 09:52:04 +01:00
tcp_dctcp.c tcp: Fix shift-out-of-bounds in dctcp_update_alpha(). 2024-06-12 11:12:48 +02:00
tcp_dctcp.h
tcp_diag.c
tcp_fastopen.c tcp: fix passive TFO socket having invalid NAPI ID 2025-06-27 11:09:02 +01:00
tcp_highspeed.c
tcp_htcp.c
tcp_hybla.c
tcp_illinois.c
tcp_input.c tcp: fix tcp_packet_delayed() for tcp_is_non_sack_preventing_reopen() behavior 2025-06-27 11:09:02 +01:00
tcp_ipv4.c tcp: drop secpath at the same time as we currently drop dst 2025-02-27 04:10:49 -08:00
tcp_lp.c
tcp_metrics.c tcp_metrics: optimize tcp_metrics_flush_all() 2024-08-19 06:04:25 +02:00
tcp_minisocks.c tcp: Defer ts_recent changes until req is owned 2025-03-07 16:45:41 +01:00
tcp_nv.c
tcp_offload.c net-timestamp: support TCP GSO case for a few missing flags 2025-03-13 12:58:32 +01:00
tcp_output.c net: Rename mono_delivery_time to tstamp_type for scalabilty 2025-05-09 09:43:57 +02:00
tcp_plb.c
tcp_rate.c
tcp_recovery.c
tcp_scalable.c
tcp_timer.c tcp: new TCP_INFO stats for RTO events 2024-10-17 15:24:23 +02:00
tcp_ulp.c
tcp_vegas.c
tcp_vegas.h
tcp_veno.c
tcp_westwood.c
tcp_yeah.c
tcp.c tcp: Correct signedness in skb remaining space calculation 2025-07-17 18:35:09 +02:00
tunnel4.c
udp_bpf.c
udp_diag.c
udp_impl.h
udp_offload.c net: fix udp gso skb_segment after pull from frag_list 2025-06-19 15:28:33 +02:00
udp_tunnel_core.c
udp_tunnel_nic.c
udp_tunnel_stub.c
udp.c udp: Fix memory accounting leak. 2025-04-10 14:37:40 +02:00
udplite.c
xfrm4_input.c xfrm: Preserve vlan tags for transport mode software GRO 2024-05-17 12:02:20 +02:00
xfrm4_output.c
xfrm4_policy.c xfrm: respect ip protocols rules criteria when performing dst lookups 2024-11-01 01:58:28 +01:00
xfrm4_protocol.c
xfrm4_state.c
xfrm4_tunnel.c