From 46ec510ac088ac2669e617a4c8c35e6218dabecc Mon Sep 17 00:00:00 2001 From: Clemens Buchacher Date: Tue, 28 May 2013 00:49:57 +0200 Subject: fix segfault with git log -c --follow In diff_tree_combined we make a copy of diffopts. In try_to_follow_renames, called via diff_tree_sha1, we free and re-initialize diffopts->pathspec->items. Since we did not make a deep copy of diffopts in diff_tree_combined, the original diffopts does not get the update. By the time we return from diff_tree_combined, rev->diffopt->pathspec->items points to an invalid memory address. We get a segfault next time we try to access that pathspec. Instead, along with the copy of diffopts, make a copy pathspec->items as well. We would also have to make a copy of pathspec->raw to keep it consistent with pathspec->items, but nobody seems to rely on that. Signed-off-by: Clemens Buchacher Signed-off-by: Junio C Hamano --- t/t4202-log.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 't') diff --git a/t/t4202-log.sh b/t/t4202-log.sh index fa686b887d..d9e587a96e 100755 --- a/t/t4202-log.sh +++ b/t/t4202-log.sh @@ -542,6 +542,20 @@ test_expect_success 'show added path under "--follow -M"' ' ) ' +test_expect_success 'git log -c --follow' ' + test_create_repo follow-c && + ( + cd follow-c && + test_commit initial file original && + git rm file && + test_commit rename file2 original && + git reset --hard initial && + test_commit modify file foo && + git merge -m merge rename && + git log -c --follow file2 + ) +' + cat >expect <<\EOF * commit COMMIT_OBJECT_NAME |\ Merge: MERGE_PARENTS -- cgit v1.2.3