[PATCH] builtin/difftool: intialize some hashmap variables
- From
- Simon Marchi <simon.marchi@efficios.com>
- Date
- Nov 11, 2024, 16:21 UTC
- Message-ID
- <20241111162148.337375-1-simon.marchi@efficios.com>
When running a dir-diff command that produces no diff, variables `wt_modified` and `tmp_modified` are used while uninitialized, causing:
$ /home/smarchi/src/git/git-difftool --dir-diff master
free(): invalid pointer
[1] 334004 IOT instruction (core dumped) /home/smarchi/src/git/git-difftool --dir-diff master
$ valgrind --track-origins=yes /home/smarchi/src/git/git-difftool --dir-diff master
...
Invalid free() / delete / delete[] / realloc()
at 0x48478EF: free (vg_replace_malloc.c:989)
by 0x422CAC: hashmap_clear_ (hashmap.c:208)
by 0x283830: run_dir_diff (difftool.c:667)
by 0x284103: cmd_difftool (difftool.c:801)
by 0x238E0F: run_builtin (git.c:484)
by 0x2392B9: handle_builtin (git.c:750)
by 0x2399BC: cmd_main (git.c:921)
by 0x356FEF: main (common-main.c:64)
Address 0x1ffefff180 is on thread 1's stack
in frame #2, created by run_dir_diff (difftool.c:358)
...If taking any `goto finish` path before these variables are initialized, `hashmap_clear_and_free()` operates on uninitialized data, sometimes causing a crash.
Fix it by zero-initializing these variables, making `hashmap_clear_and_free()` a no-op in that case.
Signed-off-by: Simon Marchi <simon.marchi@efficios.com> Cc: Junio C Hamano <gitster@pobox.com> Cc: René Scharfe <l.s.r@web.de> Cc: Taylor Blau <me@ttaylorr.com> Cc: Patrick Steinhardt <ps@pks.im> --- builtin/difftool.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/builtin/difftool.c b/builtin/difftool.c index ca1b0890659b..b902f5d2ae17 100644 --- a/builtin/difftool.c +++ b/builtin/difftool.c @@ -376,7 +376,8 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix, struct checkout lstate, rstate; int err = 0; struct child_process cmd = CHILD_PROCESS_INIT; - struct hashmap wt_modified, tmp_modified; + struct hashmap wt_modified = {0}; + struct hashmap tmp_modified = {0}; int indices_loaded = 0; workdir = repo_get_work_tree(the_repository); base-commit: b31fb630c0fc6869a33ed717163e8a1210460d94
-- 2.47.0