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@xxxxxxxxxxxx> Cc: Junio C Hamano <gitster@xxxxxxxxx> Cc: René Scharfe <l.s.r@xxxxxx> Cc: Taylor Blau <me@xxxxxxxxxxxx> Cc: Patrick Steinhardt <ps@xxxxxx> --- 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