From: Junio C Hamano <gitster@pobox.com>
To: Patrick Steinhardt <ps@pks.im>
Cc: git@vger.kernel.org
Subject: Re: [PATCH 1/2] unix-socket: fix memory leak when chdir(3p) fails
Date: Wed, 29 Jan 2025 09:21:39 -0800 [thread overview]
Message-ID: <xmqq34h1k02k.fsf@gitster.g> (raw)
In-Reply-To: <20250129-b4-pks-memory-leaks-v1-1-79e41299eb0c@pks.im> (Patrick Steinhardt's message of "Wed, 29 Jan 2025 17:24:14 +0100")
Patrick Steinhardt <ps@pks.im> writes:
> When trying to create a Unix socket in a path that exceeds the maximum
> socket name length we try to first change the directory into the parent
> folder before creating the socket to reduce the length of the name. When
> this fails we error out of `unix_sockaddr_init()` with an error code,
> which indicates to the caller that the context has not been initialized.
> Consequently, they don't release that context.
>
> This leads to a memory leak: when we have already populated the context
> with the original directory that we need to chdir(3p) back into, but
> then the chdir(3p) into the socket's parent directory fails, then we
> won't release the original directory's path. The leak is exposed by
> t0301, but only via Meson with `meson setup -Dsanitize=leak`:
Did you mean
$ meson configure -Db_sanitize=leak
$ meson test t0301-credential-cache
I'll need to figure out how to make various tweaks at runtime
working with meson based build tree. The next thing I need to
figure out is to see how to get verbose error output from the tests,
as I cannot just go back to the source tree and say "cd t && sh
t0301-credential-cache -v -i -x" because the build is out of tree.
> Direct leak of 129 byte(s) in 1 object(s) allocated from:
> #0 0x5555555e85c6 in realloc.part.0 lsan_interceptors.cpp.o
> #1 0x55555590e3d6 in xrealloc ../wrapper.c:140:8
> #2 0x5555558c8fc6 in strbuf_grow ../strbuf.c:114:2
> #3 0x5555558cacab in strbuf_getcwd ../strbuf.c:605:3
> #4 0x555555923ff6 in unix_sockaddr_init ../unix-socket.c:65:7
> #5 0x555555923e42 in unix_stream_connect ../unix-socket.c:84:6
> #6 0x55555562a984 in send_request ../builtin/credential-cache.c:46:11
> #7 0x55555562a89e in do_cache ../builtin/credential-cache.c:108:6
> #8 0x55555562a655 in cmd_credential_cache ../builtin/credential-cache.c:178:3
> #9 0x555555700547 in run_builtin ../git.c:480:11
> #10 0x5555556ff0e0 in handle_builtin ../git.c:740:9
> #11 0x5555556ffee8 in run_argv ../git.c:807:4
> #12 0x5555556fee6b in cmd_main ../git.c:947:19
> #13 0x55555593f689 in main ../common-main.c:64:11
> #14 0x7ffff7a2a1fb in __libc_start_call_main (/nix/store/h7zcxabfxa7v5xdna45y2hplj31ncf8a-glibc-2.40-36/lib/libc.so.6+0x2a1fb) (BuildId: 0a855678aa0cb573cecbb2bcc73ab8239ec472d0)
> #15 0x7ffff7a2a2b8 in __libc_start_main@GLIBC_2.2.5 (/nix/store/h7zcxabfxa7v5xdna45y2hplj31ncf8a-glibc-2.40-36/lib/libc.so.6+0x2a2b8) (BuildId: 0a855678aa0cb573cecbb2bcc73ab8239ec472d0)
> #16 0x5555555ad1d4 in _start (git+0x591d4)
>
> DEDUP_TOKEN: ___interceptor_realloc.part.0--xrealloc--strbuf_grow--strbuf_getcwd--unix_sockaddr_init--unix_stream_connect--send_request--do_cache--cmd_credential_cache--run_builtin--handle_builtin--run_argv--cmd_main--main--__libc_start_call_main--__libc_start_main@GLIBC_2.2.5--_start
> SUMMARY: LeakSanitizer: 129 byte(s) leaked in 1 allocation(s).
>
> Fix this leak.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
> unix-socket.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
Thanks. The analysis and the fix looked superbly clear.
Will queue.
> diff --git a/unix-socket.c b/unix-socket.c
> index 483c9c448c..8860203c3f 100644
> --- a/unix-socket.c
> +++ b/unix-socket.c
> @@ -65,8 +65,10 @@ static int unix_sockaddr_init(struct sockaddr_un *sa, const char *path,
> if (strbuf_getcwd(&cwd))
> return -1;
> ctx->orig_dir = strbuf_detach(&cwd, NULL);
> - if (chdir_len(dir, slash - dir) < 0)
> + if (chdir_len(dir, slash - dir) < 0) {
> + FREE_AND_NULL(ctx->orig_dir);
> return -1;
> + }
> }
>
> memset(sa, 0, sizeof(*sa));
next prev parent reply other threads:[~2025-01-29 17:21 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-29 16:24 [PATCH 0/2] Plug two memory leaks exposed via Meson Patrick Steinhardt
2025-01-29 16:24 ` [PATCH 1/2] unix-socket: fix memory leak when chdir(3p) fails Patrick Steinhardt
2025-01-29 17:21 ` Junio C Hamano [this message]
2025-01-29 20:07 ` Jeff King
2025-01-30 6:02 ` Patrick Steinhardt
2025-01-30 17:35 ` Junio C Hamano
2025-01-29 16:24 ` [PATCH 2/2] scalar: free result of `remote_default_branch()` Patrick Steinhardt
2025-01-29 20:05 ` [PATCH 0/2] Plug two memory leaks exposed via Meson Jeff King
2025-01-30 6:04 ` Patrick Steinhardt
2025-01-30 6:17 ` [PATCH v2 " Patrick Steinhardt
2025-01-30 6:17 ` [PATCH v2 1/2] unix-socket: fix memory leak when chdir(3p) fails Patrick Steinhardt
2025-01-30 6:17 ` [PATCH v2 2/2] scalar: free result of `remote_default_branch()` Patrick Steinhardt
2025-01-30 19:19 ` [PATCH v2 0/2] Plug two memory leaks exposed via Meson Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqq34h1k02k.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=ps@pks.im \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).