Skip to content

Commit 49c15ce

Browse files
pks-tgitster
authored andcommitted
scalar: free result of remote_default_branch()
We don't free the result of `remote_default_branch()`, leading to a memory leak. This leak is exposed by t9211, but only when run with Meson via `meson setup -Dsanitize=leak`: Direct leak of 5 byte(s) in 1 object(s) allocated from: #0 0x5555555cfb93 in malloc (scalar+0x7bb93) #1 0x5555556b05c2 in do_xmalloc ../wrapper.c:55:8 #2 0x5555556b06c4 in do_xmallocz ../wrapper.c:89:8 #3 0x5555556b0656 in xmallocz ../wrapper.c:97:9 #4 0x5555556b0728 in xmemdupz ../wrapper.c:113:16 #5 0x5555556b07a7 in xstrndup ../wrapper.c:119:9 #6 0x5555555d3a4b in remote_default_branch ../scalar.c:338:14 #7 0x5555555d20e6 in cmd_clone ../scalar.c:493:28 #8 0x5555555d196b in cmd_main ../scalar.c:992:14 #9 0x5555557c4059 in main ../common-main.c:64:11 #10 0x7ffff7a2a1fb in __libc_start_call_main (/nix/store/h7zcxabfxa7v5xdna45y2hplj31ncf8a-glibc-2.40-36/lib/libc.so.6+0x2a1fb) (BuildId: 0a855678aa0cb573cecbb2bcc73ab8239ec472d0) #11 0x7ffff7a2a2b8 in __libc_start_main@GLIBC_2.2.5 (/nix/store/h7zcxabfxa7v5xdna45y2hplj31ncf8a-glibc-2.40-36/lib/libc.so.6+0x2a2b8) (BuildId: 0a855678aa0cb573cecbb2bcc73ab8239ec472d0) #12 0x555555592054 in _start (scalar+0x3e054) DEDUP_TOKEN: __interceptor_malloc--do_xmalloc--do_xmallocz--xmallocz--xmemdupz--xstrndup--remote_default_branch--cmd_clone--cmd_main--main--__libc_start_call_main--__libc_start_main@GLIBC_2.2.5--_start SUMMARY: LeakSanitizer: 5 byte(s) leaked in 1 allocation(s). As the `branch` variable may contain a string constant obtained from parsing command line arguments we cannot free the leaking variable directly. Instead, introduce a new `branch_to_free` variable that only ever gets assigned the allocated string and free that one to plug the leak. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent bc85424 commit 49c15ce

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

scalar.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,7 @@ void load_builtin_commands(const char *prefix, struct cmdnames *cmds)
408408
static int cmd_clone(int argc, const char **argv)
409409
{
410410
const char *branch = NULL;
411+
char *branch_to_free = NULL;
411412
int full_clone = 0, single_branch = 0, show_progress = isatty(2);
412413
int src = 1;
413414
struct option clone_options[] = {
@@ -487,7 +488,7 @@ static int cmd_clone(int argc, const char **argv)
487488
/* common-main already logs `argv` */
488489
trace2_def_repo(the_repository);
489490

490-
if (!branch && !(branch = remote_default_branch(url))) {
491+
if (!branch && !(branch = branch_to_free = remote_default_branch(url))) {
491492
res = error(_("failed to get default branch for '%s'"), url);
492493
goto cleanup;
493494
}
@@ -542,6 +543,7 @@ static int cmd_clone(int argc, const char **argv)
542543
res = register_dir();
543544

544545
cleanup:
546+
free(branch_to_free);
545547
free(enlistment);
546548
free(dir);
547549
strbuf_release(&buf);

0 commit comments

Comments
 (0)