Denton Liu <liu.denton@xxxxxxxxx> writes: > When `git stash show --include-untracked` or > `git stash show --only-untracked` is run on a stash that doesn't include > an untracked entry, a segfault occurs. This happens because we do not > check whether the untracked entry is actually present and just attempt > to blindly dereference it. > > Ensure that the untracked entry is present before actually attempting to > dereference it. Makes sense. Thanks. > > Signed-off-by: Denton Liu <liu.denton@xxxxxxxxx> > --- > builtin/stash.c | 8 ++++++-- > t/t3905-stash-include-untracked.sh | 15 +++++++++++++++ > 2 files changed, 21 insertions(+), 2 deletions(-) > > diff --git a/builtin/stash.c b/builtin/stash.c > index 8922a1240c..82e4829d44 100644 > --- a/builtin/stash.c > +++ b/builtin/stash.c > @@ -900,10 +900,14 @@ static int show_stash(int argc, const char **argv, const char *prefix) > diff_tree_oid(&info.b_commit, &info.w_commit, "", &rev.diffopt); > break; > case UNTRACKED_ONLY: > - diff_root_tree_oid(&info.u_tree, "", &rev.diffopt); > + if (info.has_u) > + diff_root_tree_oid(&info.u_tree, "", &rev.diffopt); > break; > case UNTRACKED_INCLUDE: > - diff_include_untracked(&info, &rev.diffopt); > + if (info.has_u) > + diff_include_untracked(&info, &rev.diffopt); > + else > + diff_tree_oid(&info.b_commit, &info.w_commit, "", &rev.diffopt); > break; > } > log_tree_diff_flush(&rev); > diff --git a/t/t3905-stash-include-untracked.sh b/t/t3905-stash-include-untracked.sh > index 2e6796725b..1c9765928d 100755 > --- a/t/t3905-stash-include-untracked.sh > +++ b/t/t3905-stash-include-untracked.sh > @@ -405,4 +405,19 @@ test_expect_success 'stash show --include-untracked errors on duplicate files' ' > test_i18ngrep "worktree and untracked commit have duplicate entries: tracked" err > ' > > +test_expect_success 'stash show --{include,only}-untracked on stashes without untracked entries' ' > + git reset --hard && > + git clean -xf && > + >tracked && > + git add tracked && > + git stash && > + > + git stash show >expect && > + git stash show --include-untracked >actual && > + test_cmp expect actual && > + > + git stash show --only-untracked >actual && > + test_must_be_empty actual > +' > + > test_done