mirror of
https://github.com/git/git.git
synced 2026-01-18 06:34:21 +00:00
stash: fix segmentation fault when files were added with intent
After `git add -N <file>`, the index is in a special state. A state for which the built-in stash was not prepared, as it failed to initialize the `rev` structure in that case before using `&rev.pending`. If `reset_tree()` returns a non-zero value, `stash_working_tree()` calls `object_array_clear()` with `&rev.pending`. If `rev` is not initialized, this causes a segmentation fault. Prevent this by initializing `rev` before calling `reset_tree()`. This fixes https://github.com/git-for-windows/git/issues/2006. [jes: modified the commit message in preparation for sending this patch to the Git mailing list.] Signed-off-by: Matthew Kraai <mkraai@its.jnj.com> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Johannes Schindelin
parent
a9fba51eb4
commit
a8472bd329
@@ -1050,6 +1050,8 @@ static int stash_working_tree(struct stash_info *info, struct pathspec ps)
|
||||
struct strbuf diff_output = STRBUF_INIT;
|
||||
struct index_state istate = { NULL };
|
||||
|
||||
init_revisions(&rev, NULL);
|
||||
|
||||
set_alternate_index_output(stash_index_path.buf);
|
||||
if (reset_tree(&info->i_tree, 0, 0)) {
|
||||
ret = -1;
|
||||
@@ -1057,7 +1059,6 @@ static int stash_working_tree(struct stash_info *info, struct pathspec ps)
|
||||
}
|
||||
set_alternate_index_output(NULL);
|
||||
|
||||
init_revisions(&rev, NULL);
|
||||
rev.prune_data = ps;
|
||||
rev.diffopt.output_format = DIFF_FORMAT_CALLBACK;
|
||||
rev.diffopt.format_callback = add_diff_to_buf;
|
||||
|
||||
@@ -287,6 +287,14 @@ test_expect_success 'stash an added file' '
|
||||
test new = "$(cat file3)"
|
||||
'
|
||||
|
||||
test_expect_success 'stash --intent-to-add file' '
|
||||
git reset --hard &&
|
||||
echo new >file4 &&
|
||||
git add --intent-to-add file4 &&
|
||||
test_when_finished "git rm -f file4" &&
|
||||
test_must_fail git stash
|
||||
'
|
||||
|
||||
test_expect_success 'stash rm then recreate' '
|
||||
git reset --hard &&
|
||||
git rm file &&
|
||||
|
||||
Reference in New Issue
Block a user