projects
/
linux-block.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
2b6ffcd
)
net: fix memory leak in tcp_conn_request()
author
Wang Liang
<wangliang74@huawei.com>
Thu, 19 Dec 2024 07:28:59 +0000
(15:28 +0800)
committer
Jakub Kicinski
<kuba@kernel.org>
Mon, 23 Dec 2024 18:03:12 +0000
(10:03 -0800)
If inet_csk_reqsk_queue_hash_add() return false, tcp_conn_request() will
return without free the dst memory, which allocated in af_ops->route_req.
Here is the kmemleak stack:
unreferenced object 0xffff8881198631c0 (size 240):
comm "softirq", pid 0, jiffies
4299266571
(age 1802.392s)
hex dump (first 32 bytes):
00 10 9b 03 81 88 ff ff 80 98 da bc ff ff ff ff ................
81 55 18 bb ff ff ff ff 00 00 00 00 00 00 00 00 .U..............
backtrace:
[<
ffffffffb93e8d4c
>] kmem_cache_alloc+0x60c/0xa80
[<
ffffffffba11b4c5
>] dst_alloc+0x55/0x250
[<
ffffffffba227bf6
>] rt_dst_alloc+0x46/0x1d0
[<
ffffffffba23050a
>] __mkroute_output+0x29a/0xa50
[<
ffffffffba23456b
>] ip_route_output_key_hash+0x10b/0x240
[<
ffffffffba2346bd
>] ip_route_output_flow+0x1d/0x90
[<
ffffffffba254855
>] inet_csk_route_req+0x2c5/0x500
[<
ffffffffba26b331
>] tcp_conn_request+0x691/0x12c0
[<
ffffffffba27bd08
>] tcp_rcv_state_process+0x3c8/0x11b0
[<
ffffffffba2965c6
>] tcp_v4_do_rcv+0x156/0x3b0
[<
ffffffffba299c98
>] tcp_v4_rcv+0x1cf8/0x1d80
[<
ffffffffba239656
>] ip_protocol_deliver_rcu+0xf6/0x360
[<
ffffffffba2399a6
>] ip_local_deliver_finish+0xe6/0x1e0
[<
ffffffffba239b8e
>] ip_local_deliver+0xee/0x360
[<
ffffffffba239ead
>] ip_rcv+0xad/0x2f0
[<
ffffffffba110943
>] __netif_receive_skb_one_core+0x123/0x140
Call dst_release() to free the dst memory when
inet_csk_reqsk_queue_hash_add() return false in tcp_conn_request().
Fixes:
ff46e3b44219
("Fix race for duplicate reqsk on identical SYN")
Signed-off-by: Wang Liang <wangliang74@huawei.com>
Link:
https://patch.msgid.link/20241219072859.3783576-1-wangliang74@huawei.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv4/tcp_input.c
patch
|
blob
|
blame
|
history
diff --git
a/net/ipv4/tcp_input.c
b/net/ipv4/tcp_input.c
index 5bdf13ac26ef03615fd441d9401334b35bf06bd6..4811727b8a02258ec6fa1fd129beecf7cbb0f90e 100644
(file)
--- a/
net/ipv4/tcp_input.c
+++ b/
net/ipv4/tcp_input.c
@@
-7328,6
+7328,7
@@
int tcp_conn_request(struct request_sock_ops *rsk_ops,
if (unlikely(!inet_csk_reqsk_queue_hash_add(sk, req,
req->timeout))) {
reqsk_free(req);
+ dst_release(dst);
return 0;
}