Message ID | 20250224152846.13650-1-ahuang12@lenovo.com (mailing list archive) |
---|---|
State | New |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [1/1] af_unix: Fix memory leak in unix_dgram_sendmsg() | expand |
From: Adrian Huang <adrianhuang0701@gmail.com> Date: Mon, 24 Feb 2025 23:28:46 +0800 > From: Adrian Huang <ahuang12@lenovo.com> > > After running the 'sendmsg02' program of Linux Test Project (LTP), > kmemleak reports the following memory leak: > > # cat /sys/kernel/debug/kmemleak > unreferenced object 0xffff888243866800 (size 2048): > comm "sendmsg02", pid 67, jiffies 4294903166 > hex dump (first 32 bytes): > 00 00 00 00 00 00 00 00 5e 00 00 00 00 00 00 00 ........^....... > 01 00 07 40 00 00 00 00 00 00 00 00 00 00 00 00 ...@............ > backtrace (crc 7e96a3f2): > kmemleak_alloc+0x56/0x90 > kmem_cache_alloc_noprof+0x209/0x450 > sk_prot_alloc.constprop.0+0x60/0x160 > sk_alloc+0x32/0xc0 > unix_create1+0x67/0x2b0 > unix_create+0x47/0xa0 > __sock_create+0x12e/0x200 > __sys_socket+0x6d/0x100 > __x64_sys_socket+0x1b/0x30 > x64_sys_call+0x7e1/0x2140 > do_syscall_64+0x54/0x110 > entry_SYSCALL_64_after_hwframe+0x76/0x7e > > Commit 689c398885cc ("af_unix: Defer sock_put() to clean up path in > unix_dgram_sendmsg().") defers sock_put() in the error handling path. > However, it fails to account for the condition 'msg->msg_namelen != 0', > resulting in a memory leak when the code jumps to the 'lookup' label. > > Fix issue by calling sock_put() if 'msg->msg_namelen != 0' is met. > > Fixes: 689c398885cc ("af_unix: Defer sock_put() to clean up path in unix_dgram_sendmsg().") > Signed-off-by: Adrian Huang <ahuang12@lenovo.com> > --- > net/unix/af_unix.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c > index 34945de1fb1f..cf37a1f92831 100644 > --- a/net/unix/af_unix.c > +++ b/net/unix/af_unix.c > @@ -2100,6 +2100,8 @@ static int unix_dgram_sendmsg(struct socket *sock, struct msghdr *msg, > if (!msg->msg_namelen) { > err = -ECONNRESET; > goto out_sock_put; > + } else { > + sock_put(other); > } > > goto lookup; nit: else is not needed: if (!msg->msg_namelen) { err = -ECONNRESET; goto out_sock_put; } sock_put(other); goto lookup; Thanks!
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 34945de1fb1f..cf37a1f92831 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -2100,6 +2100,8 @@ static int unix_dgram_sendmsg(struct socket *sock, struct msghdr *msg, if (!msg->msg_namelen) { err = -ECONNRESET; goto out_sock_put; + } else { + sock_put(other); } goto lookup;