Skip to content

Commit 087740d

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 with the `-Db_sanitize=leak` option: 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. It is unclear why the leak isn't flagged when running the test via our Makefile. Signed-off-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent c5fe29f commit 087740d

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

scalar.c

Lines changed: 3 additions & 1 deletion
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)