Eric Dumazet
602b338e3c
tcp: fix tcp_mtup_probe_success vs wrong snd_cwnd
commit 11825765291a93d8e7f44230da67b9f607c777bf upstream.
syzbot got a new report [1] finally pointing to a very old bug,
added in initial support for MTU probing.
tcp_mtu_probe() has checks about starting an MTU probe if
tcp_snd_cwnd(tp) >= 11.
But nothing prevents tcp_snd_cwnd(tp) to be reduced later
and before the MTU probe succeeds.
This bug would lead to potential zero-divides.
Debugging added in commit 40570375356c ("tcp: add accessors
to read/set tp->snd_cwnd") has paid off :)
While we are at it, address potential overflows in this code.
[1]
WARNING: CPU: 1 PID: 14132 at include/net/tcp.h:1219 tcp_mtup_probe_success+0x366/0x570 net/ipv4/tcp_input.c:2712
Modules linked in:
CPU: 1 PID: 14132 Comm: syz-executor.2 Not tainted 5.18.0-syzkaller-07857-gbabf0bb978e3 #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
RIP: 0010:tcp_snd_cwnd_set include/net/tcp.h:1219 [inline]
RIP: 0010:tcp_mtup_probe_success+0x366/0x570 net/ipv4/tcp_input.c:2712
Code: 74 08 48 89 ef e8 da 80 17 f9 48 8b 45 00 65 48 ff 80 80 03 00 00 48 83 c4 30 5b 41 5c 41 5d 41 5e 41 5f 5d c3 e8 aa b0 c5 f8 <0f> 0b e9 16 fe ff ff 48 8b 4c 24 08 80 e1 07 38 c1 0f 8c c7 fc ff
RSP: 0018:ffffc900079e70f8 EFLAGS: 00010287
RAX: ffffffff88c0f7f6 RBX: ffff8880756e7a80 RCX: 0000000000040000
RDX: ffffc9000c6c4000 RSI: 0000000000031f9e RDI: 0000000000031f9f
RBP: 0000000000000000 R08: ffffffff88c0f606 R09: ffffc900079e7520
R10: ffffed101011226d R11: 1ffff1101011226c R12: 1ffff1100eadcf50
R13: ffff8880756e72c0 R14: 1ffff1100eadcf89 R15: dffffc0000000000
FS: 00007f643236e700(0000) GS:ffff8880b9b00000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007f1ab3f1e2a0 CR3: 0000000064fe7000 CR4: 00000000003506e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
Call Trace:
<TASK>
tcp_clean_rtx_queue+0x223a/0x2da0 net/ipv4/tcp_input.c:3356
tcp_ack+0x1962/0x3c90 net/ipv4/tcp_input.c:3861
tcp_rcv_established+0x7c8/0x1ac0 net/ipv4/tcp_input.c:5973
tcp_v6_do_rcv+0x57b/0x1210 net/ipv6/tcp_ipv6.c:1476
sk_backlog_rcv include/net/sock.h:1061 [inline]
__release_sock+0x1d8/0x4c0 net/core/sock.c:2849
release_sock+0x5d/0x1c0 net/core/sock.c:3404
sk_stream_wait_memory+0x700/0xdc0 net/core/stream.c:145
tcp_sendmsg_locked+0x111d/0x3fc0 net/ipv4/tcp.c:1410
tcp_sendmsg+0x2c/0x40 net/ipv4/tcp.c:1448
sock_sendmsg_nosec net/socket.c:714 [inline]
sock_sendmsg net/socket.c:734 [inline]
__sys_sendto+0x439/0x5c0 net/socket.c:2119
__do_sys_sendto net/socket.c:2131 [inline]
__se_sys_sendto net/socket.c:2127 [inline]
__x64_sys_sendto+0xda/0xf0 net/socket.c:2127
do_syscall_x64 arch/x86/entry/common.c:50 [inline]
do_syscall_64+0x2b/0x70 arch/x86/entry/common.c:80
entry_SYSCALL_64_after_hwframe+0x46/0xb0
RIP: 0033:0x7f6431289109
Code: ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b8 ff ff ff f7 d8 64 89 01 48
RSP: 002b:00007f643236e168 EFLAGS: 00000246 ORIG_RAX: 000000000000002c
RAX: ffffffffffffffda RBX: 00007f643139c100 RCX: 00007f6431289109
RDX: 00000000d0d0c2ac RSI: 0000000020000080 RDI: 000000000000000a
RBP: 00007f64312e308d R08: 0000000000000000 R09: 0000000000000000
R10: 0000000000000001 R11: 0000000000000246 R12: 0000000000000000
R13: 00007fff372533af R14: 00007f643236e300 R15: 0000000000022000
Fixes: 5d424d5a67 ("[TCP]: MTU probing")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reported-by: syzbot <syzkaller@googlegroups.com>
Acked-by: Yuchung Cheng <ycheng@google.com>
Acked-by: Neal Cardwell <ncardwell@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
2022-06-14 18:12:03 +02:00 |
| .. |
|
6lowpan
|
6lowpan: iphc: Fix an off-by-one check of array index
|
2021-09-15 09:47:31 +02:00 |
|
9p
|
xen/9p: use alloc/free_pages_exact()
|
2022-03-11 11:22:39 +01:00 |
|
802
|
net/802/garp: fix memleak in garp_request_join()
|
2021-07-31 08:19:38 +02:00 |
|
8021q
|
net: vlan: fix underflow for the real_dev refcnt
|
2021-12-01 09:23:34 +01:00 |
|
appletalk
|
appletalk: Fix skb allocation size in loopback case
|
2021-04-07 14:47:41 +02:00 |
|
atm
|
atm: fix a memory leak of vcc->user_back
|
2020-10-01 13:17:58 +02:00 |
|
ax25
|
ax25: Fix UAF bugs in ax25 timers
|
2022-04-20 09:19:40 +02:00 |
|
batman-adv
|
batman-adv: Don't skb_split skbuffs with frag_list
|
2022-05-18 09:47:24 +02:00 |
|
bluetooth
|
Bluetooth: fix dangling sco_conn and use-after-free in sco_sock_timeout
|
2022-06-14 18:11:37 +02:00 |
|
bpf
|
|
|
|
bpfilter
|
bpfilter: Specify the log level for the kmsg message
|
2021-07-14 16:53:33 +02:00 |
|
bridge
|
net: bridge: Clear offload_fwd_mark when passing frame up bridge interface.
|
2022-05-25 09:14:36 +02:00 |
|
caif
|
net-caif: avoid user-triggerable WARN_ON(1)
|
2021-09-22 12:26:40 +02:00 |
|
can
|
can: j1939: j1939_tp_cmd_recv(): check the dst address of TP.CM_BAM
|
2021-12-08 09:01:08 +01:00 |
|
ceph
|
libceph: clear con->out_msg on Policy::stateful_server faults
|
2020-11-05 11:43:34 +01:00 |
|
core
|
bpf: Enlarge offset check value to INT_MAX in bpf_skb_{load,store}_bytes
|
2022-06-06 08:33:51 +02:00 |
|
dcb
|
net: dcb: disable softirqs in dcbnl_flush_dev()
|
2022-03-08 19:07:51 +01:00 |
|
dccp
|
tcp: fix race condition when creating child sockets from syncookies
|
2022-04-27 13:50:45 +02:00 |
|
decnet
|
net: decnet: Fix sleeping inside in af_decnet
|
2021-07-28 13:30:56 +02:00 |
|
dns_resolver
|
|
|
|
dsa
|
net: dsa: Add missing of_node_put() in dsa_port_parse_of
|
2022-03-23 09:12:07 +01:00 |
|
ethernet
|
|
|
|
hsr
|
hsr: use netdev_err() instead of WARN_ONCE()
|
2021-05-14 09:44:10 +02:00 |
|
ieee802154
|
net: ieee802154: Return meaningful error codes from the netlink helpers
|
2022-02-08 18:24:31 +01:00 |
|
ife
|
|
|
|
ipv4
|
tcp: fix tcp_mtup_probe_success vs wrong snd_cwnd
|
2022-06-14 18:12:03 +02:00 |
|
ipv6
|
net: ipv6: unexport __init-annotated seg6_hmac_init()
|
2022-06-14 18:11:58 +02:00 |
|
iucv
|
net/af_iucv: remove WARN_ONCE on malformed RX packets
|
2021-03-07 12:20:42 +01:00 |
|
kcm
|
|
|
|
key
|
Revert "net: af_key: add check for pfkey_broadcast in function pfkey_process"
|
2022-06-14 18:12:01 +02:00 |
|
l2tp
|
net/l2tp: Fix reference count leak in l2tp_udp_recv_core
|
2021-09-22 12:26:41 +02:00 |
|
l3mdev
|
l3mdev: l3mdev_master_upper_ifindex_by_index_rcu should be using netdev_master_upper_dev_get_rcu
|
2022-04-27 13:50:47 +02:00 |
|
lapb
|
net: lapb: Copy the skb before sending a packet
|
2021-02-10 09:25:28 +01:00 |
|
llc
|
llc: only change llc->dev when bind() succeeds
|
2022-03-28 08:46:48 +02:00 |
|
mac80211
|
mac80211: upgrade passive scan to active scan on DFS channels after beacon rx
|
2022-06-14 18:11:48 +02:00 |
|
mac802154
|
net: mac802154: Fix general protection fault
|
2021-04-14 08:24:18 +02:00 |
|
mpls
|
net: mpls: Fix notifications when deleting a device
|
2021-12-08 09:01:12 +01:00 |
|
ncsi
|
net/ncsi: check for error return from call to nla_put_u32
|
2022-01-05 12:37:45 +01:00 |
|
netfilter
|
netfilter: nf_tables: memleak flow rule from commit path
|
2022-06-14 18:11:57 +02:00 |
|
netlabel
|
netlabel: fix out-of-bounds memory accesses
|
2022-04-15 14:18:35 +02:00 |
|
netlink
|
netlink: do not reset transport header in netlink_recvmsg()
|
2022-05-18 09:47:25 +02:00 |
|
netrom
|
netrom: Decrease sock refcount when sock timers expire
|
2021-07-28 13:30:56 +02:00 |
|
nfc
|
NFC: NULL out the dev->rfkill to prevent UAF
|
2022-06-14 18:11:33 +02:00 |
|
nsh
|
|
|
|
openvswitch
|
openvswitch: fix OOB access in reserve_sfa_size()
|
2022-04-27 13:50:49 +02:00 |
|
packet
|
net/packet: fix packet_sock xmit return value checking
|
2022-04-27 13:50:47 +02:00 |
|
phonet
|
phonet: refcount leak in pep_sock_accep
|
2022-01-11 15:23:33 +01:00 |
|
psample
|
|
|
|
qrtr
|
net: qrtr: fix another OOB Read in qrtr_endpoint_post
|
2021-09-03 10:08:12 +02:00 |
|
rds
|
rds: memory leak in __rds_conn_create()
|
2021-12-22 09:29:37 +01:00 |
|
rfkill
|
rfkill: Fix use-after-free in rfkill_resume()
|
2020-11-24 13:29:05 +01:00 |
|
rose
|
rose: Fix Null pointer dereference in rose_send_frame()
|
2020-12-08 10:40:23 +01:00 |
|
rxrpc
|
rxrpc: Fix decision on when to generate an IDLE ACK
|
2022-06-14 18:11:38 +02:00 |
|
sched
|
net/sched: act_pedit: sanitize shift argument before usage
|
2022-05-25 09:14:35 +02:00 |
|
sctp
|
sctp: read sk->sk_bound_dev_if once in sctp_rcv()
|
2022-06-14 18:11:37 +02:00 |
|
smc
|
net/smc: postpone sk_refcnt increment in connect()
|
2022-06-14 18:11:39 +02:00 |
|
strparser
|
bpf: sockmap, strparser, and tls are reusing qdisc_skb_cb and colliding
|
2021-11-17 09:48:48 +01:00 |
|
sunrpc
|
SUNRPC: Fix the calculation of xdr->end in xdr_get_next_encode_buffer()
|
2022-06-14 18:11:58 +02:00 |
|
switchdev
|
net: switchdev: do not propagate bridge updates across bridges
|
2021-10-27 09:54:24 +02:00 |
|
tipc
|
tipc: check attribute length for bearer name
|
2022-06-14 18:11:56 +02:00 |
|
tls
|
tls: Skip tls_append_frag on zero copy size
|
2022-05-09 09:03:26 +02:00 |
|
unix
|
af_unix: Fix a data-race in unix_dgram_peer_wake_me().
|
2022-06-14 18:11:57 +02:00 |
|
vmw_vsock
|
vsock: remove vsock from connected table when connect is interrupted by a signal
|
2022-02-23 11:59:57 +01:00 |
|
wimax
|
|
|
|
wireless
|
nl80211: show SSID for P2P_GO interfaces
|
2022-06-14 18:11:32 +02:00 |
|
x25
|
net/x25: Fix null-ptr-deref caused by x25_disconnect
|
2022-04-15 14:18:21 +02:00 |
|
xdp
|
Revert "xsk: Do not sleep in poll() when need_wakeup set"
|
2021-12-22 09:29:40 +01:00 |
|
xfrm
|
xfrm: fix tunnel model fragmentation behavior
|
2022-04-15 14:17:56 +02:00 |
|
compat.c
|
net: Return the correct errno code
|
2021-06-18 09:59:00 +02:00 |
|
Kconfig
|
|
|
|
Makefile
|
|
|
|
socket.c
|
net: don't unconditionally copy_from_user a struct ifreq for socket ioctls
|
2021-09-03 10:08:16 +02:00 |
|
sysctl_net.c
|
|
|