]> git.ipfire.org Git - thirdparty/git.git/commitdiff
diff: allow passing NULL to diff_free_filespec_data()
authorJinoh Kang <luke1337@theori.io>
Fri, 6 Nov 2020 17:14:52 +0000 (17:14 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 6 Nov 2020 19:37:07 +0000 (11:37 -0800)
Commit 3aef54e8b8 ("diff: munmap() file contents before running external
diff") introduced calls to diff_free_filespec_data in
run_external_diff, which may pass NULL pointers.

Fix this and prevent any such bugs in the future by making
`diff_free_filespec_data(NULL)` a no-op.

Fixes: 3aef54e8b8 ("diff: munmap() file contents before running external diff")
Signed-off-by: Jinoh Kang <luke1337@theori.io>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff.c
t/t7800-difftool.sh

diff --git a/diff.c b/diff.c
index 2bb2f8f57e8b7ce5a6d861b7a1d598a7fbaf68e9..ffdb08d5bff4533dda5299d75ee4272b278c59b4 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -4111,6 +4111,9 @@ void diff_free_filespec_blob(struct diff_filespec *s)
 
 void diff_free_filespec_data(struct diff_filespec *s)
 {
+       if (!s)
+               return;
+
        diff_free_filespec_blob(s);
        FREE_AND_NULL(s->cnt_data);
 }
index 524f30f7dc7c2388bad3885303541d4a72ed4470..e9391abb541a9ed806e4a977bc5ace6f9cefc85a 100755 (executable)
@@ -728,6 +728,29 @@ test_expect_success 'add -N and difftool -d' '
        git difftool --dir-diff --extcmd ls
 '
 
+test_expect_success 'difftool --cached with unmerged files' '
+       test_when_finished git reset --hard &&
+       echo base >file &&
+       git add file &&
+       git commit -m base &&
+       git checkout -B conflict-a &&
+       git checkout -B conflict-b &&
+       git checkout conflict-a &&
+       echo conflict-a >>file &&
+       git add file &&
+       git commit -m conflict-a &&
+       git checkout conflict-b &&
+       echo conflict-b >>file &&
+       git add file &&
+       git commit -m conflict-b &&
+       git checkout master &&
+       git merge conflict-a &&
+       test_must_fail git merge conflict-b &&
+       : >expect &&
+       git difftool --cached --no-prompt >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'outside worktree' '
        echo 1 >1 &&
        echo 2 >2 &&