[PATCH bpf v2 0/2] bpf: Fix socket leaks around connect(AF_UNSPEC)+listen()
Michal Luczaj <[email protected]> Mon, 03 Aug 2026 11:00:41 +0200
| Newsgroups | org.kernel.vger.bpf,org.kernel.vger.linux-kernel,org.kernel.vger.netdev |
|---|---|
| Message-ID | <[email protected]> |
This is a follow-up to Sashiko's report[1].
Several BPF socket helpers acquire a socket reference only when
sk_is_refcounted() == true, and release it, independently, by
re-evaluating sk_is_refcounted() again at the time the release runs. TCP
connect(AF_UNSPEC)+listen() sets SOCK_RCU_FREE on an established socket.
If that happens while a reference is outstanding, the release side sees
sk_is_refcounted() == false and skips the put; the socket is leaked.
unreferenced object 0xffff88811617ce00 (size 3200):
comm "softirq", pid 0, jiffies 4294848512
hex dump (first 32 bytes):
7f 00 00 01 7f 00 00 01 4d 43 02 f6 00 00 00 00 ........MC......
02 00 07 41 00 00 00 00 00 00 00 00 00 00 00 00 ...A............
backtrace (crc fb5bd4c8):
kmem_cache_alloc_noprof+0x53e/0x640
sk_prot_alloc+0x69/0x240
sk_clone+0x79/0x1230
inet_csk_clone_lock+0x30/0x760
tcp_create_openreq_child+0x34/0x2750
tcp_v4_syn_recv_sock+0x12e/0x1080
tcp_check_req+0x447/0x2310
tcp_v4_rcv+0x1026/0x3c90
ip_protocol_deliver_rcu+0x93/0x340
ip_local_deliver_finish+0x356/0x5c0
ip_local_deliver+0x184/0x4a0
ip_rcv+0x4f4/0x5b0
__netif_receive_skb_one_core+0x153/0x1b0
process_backlog+0x28d/0x1190
__napi_poll+0xab/0x520
net_rx_action+0x3f0/0xca0
The approach taken is to make acquire and release unconditional and
symmetric.
[1]: https://lore.kernel.org/bpf/[email protected]/
Signed-off-by: Michal Luczaj <[email protected]>
---
Changes in v2:
- Defer "Use sock_hold() instead of refcount_inc_not_zero() in lookup" to
bpf-next [John]
- Fix comment style [Sashiko]
- Link to v1: https://patch.msgid.link/[email protected]
To: Alexei Starovoitov <[email protected]>
To: Daniel Borkmann <[email protected]>
To: Andrii Nakryiko <[email protected]>
To: Eduard Zingerman <[email protected]>
To: Kumar Kartikeya Dwivedi <[email protected]>
To: Martin KaFai Lau <[email protected]>
To: Song Liu <[email protected]>
To: Yonghong Song <[email protected]>
To: Jiri Olsa <[email protected]>
To: Emil Tsalapatis <[email protected]>
To: John Fastabend <[email protected]>
To: Stanislav Fomichev <[email protected]>
To: "David S. Miller" <[email protected]>
To: Eric Dumazet <[email protected]>
To: Jakub Kicinski <[email protected]>
To: Paolo Abeni <[email protected]>
To: Simon Horman <[email protected]>
To: Kuniyuki Iwashima <[email protected]>
To: Willem de Bruijn <[email protected]>
To: Jakub Sitnicki <[email protected]>
To: Jiayuan Chen <[email protected]>
To: Joe Stringer <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
---
Michal Luczaj (2):
bpf: Extract shared reqsk-to-listener upgrade
bpf: Unconditionally take socket references in lookup helpers
net/core/filter.c | 83 +++++++++++++++++++++++++++--------------------------
net/core/sock_map.c | 4 +--
2 files changed, 45 insertions(+), 42 deletions(-)
---
base-commit: e5fd3f514e27db1f05fbd72ba615d74941e23c51
change-id: 20260628-sockmap-lookup-tcp-leak-bdaba3e083c5
Best regards,
--
Michal Luczaj <[email protected]>