diff: munmap() file contents before running external diff
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Thu, 11 Jul 2019 08:23:41 +0000 (01:23 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 11 Jul 2019 19:11:54 +0000 (12:11 -0700)
When running an external diff from, say, a diff tool, it is safe to
assume that we want to write the files in question. On Windows, that
means that there cannot be any other process holding an open handle to
said files, or even just a mapped region.

So let's make sure that `git diff` itself is not holding any open handle
to the files in question.

In fact, we will just release the file pair right away, as the external
diff uses the files we just wrote, so we do not need to hold the file
contents in memory anymore.

This fixes https://github.com/git-for-windows/git/issues/1315

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff.c
diff --git a/diff.c b/diff.c
index 5306c48652db59e84c26383d68cf4a7d896647d4..0d2b287300f9d7f72c672e6e377958f24ff2124c 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -4207,6 +4207,8 @@ static void run_external_diff(const char *pgm,
        argv_array_pushf(&env, "GIT_DIFF_PATH_COUNTER=%d", ++o->diff_path_counter);
        argv_array_pushf(&env, "GIT_DIFF_PATH_TOTAL=%d", q->nr);
 
+       diff_free_filespec_data(one);
+       diff_free_filespec_data(two);
        if (run_command_v_opt_cd_env(argv.argv, RUN_USING_SHELL, NULL, env.argv))
                die(_("external diff died, stopping at %s"), name);