Skip to content

Commit 32f6325

Browse files
committed
fmt-merge-msg: free newly allocated temporary strings when done
origin starts off pointing to somewhere within line, which is owned by the caller. Later we might allocate a new string using xmemdupz() or xstrfmt(). To avoid leaking these new strings, we introduce a to_free pointer - which allows us to safely free the newly allocated string when we're done (we cannot just free origin directly as it might still be pointing to line). LSAN output from t0090: Direct leak of 8 byte(s) in 1 object(s) allocated from: #0 0x49a82d in malloc ../projects/compiler-rt/lib/asan/asan_malloc_linux.cpp:145:3 #1 0xa71f49 in do_xmalloc wrapper.c:41:8 #2 0xa720b0 in do_xmallocz wrapper.c:75:8 #3 0xa720b0 in xmallocz wrapper.c:83:9 #4 0xa720b0 in xmemdupz wrapper.c:99:16 #5 0x8092ba in handle_line fmt-merge-msg.c:187:23 #6 0x8092ba in fmt_merge_msg fmt-merge-msg.c:666:7 #7 0x5ce2e6 in prepare_merge_message builtin/merge.c:1119:2 git#8 0x5ce2e6 in collect_parents builtin/merge.c:1215:3 git#9 0x5c9c1e in cmd_merge builtin/merge.c:1454:16 git#10 0x4ce83e in run_builtin git.c:475:11 git#11 0x4ccafe in handle_builtin git.c:729:3 git#12 0x4cb01c in run_argv git.c:818:4 git#13 0x4cb01c in cmd_main git.c:949:19 git#14 0x6b3fad in main common-main.c:52:11 git#15 0x7fb929620349 in __libc_start_main (/lib64/libc.so.6+0x24349) SUMMARY: AddressSanitizer: 8 byte(s) leaked in 1 allocation(s). Signed-off-by: Andrzej Hunt <andrzej@ahunt.org>
1 parent e1b3270 commit 32f6325

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

fmt-merge-msg.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ static int handle_line(char *line, struct merge_parents *merge_parents)
108108
struct origin_data *origin_data;
109109
char *src;
110110
const char *origin, *tag_name;
111+
char *to_free = NULL;
111112
struct src_data *src_data;
112113
struct string_list_item *item;
113114
int pulling_head = 0;
@@ -183,12 +184,13 @@ static int handle_line(char *line, struct merge_parents *merge_parents)
183184
if (!strcmp(".", src) || !strcmp(src, origin)) {
184185
int len = strlen(origin);
185186
if (origin[0] == '\'' && origin[len - 1] == '\'')
186-
origin = xmemdupz(origin + 1, len - 2);
187+
origin = to_free = xmemdupz(origin + 1, len - 2);
187188
} else
188-
origin = xstrfmt("%s of %s", origin, src);
189+
origin = to_free = xstrfmt("%s of %s", origin, src);
189190
if (strcmp(".", src))
190191
origin_data->is_local_branch = 0;
191192
string_list_append(&origins, origin)->util = origin_data;
193+
free(to_free);
192194
return 0;
193195
}
194196

0 commit comments

Comments
 (0)