Am 27.02.2017 um 23:18 schrieb René Scharfe: > Am 27.02.2017 um 21:10 schrieb Junio C Hamano: >> René Scharfe <l.s.r@xxxxxx> writes: >> >>> Would it make sense to mirror the previously existing condition and >>> check for is_new instead? I.e.: >>> >>> if ((!patch->is_delete && !patch->new_name) || >>> (!patch->is_new && !patch->old_name)) { >>> >> >> Yes, probably. So let's actually do it! -- >8 -- Subject: [PATCH] apply: check git diffs for missing old filenames 2c93286a (fix "git apply --index ..." not to deref NULL) added a check for git patches missing a +++ line, preventing a segfault. Check for missing --- lines as well, and add a test for each case. Found by Vegard Nossum using AFL. Original-patch-by: Vegard Nossum <vegard.nossum@xxxxxxxxxx> Signed-off-by: Rene Scharfe <l.s.r@xxxxxx> --- apply.c | 3 ++- t/t4133-apply-filenames.sh | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/apply.c b/apply.c index b963d7d8fb..8cd6435c74 100644 --- a/apply.c +++ b/apply.c @@ -1575,7 +1575,8 @@ static int find_header(struct apply_state *state, patch->old_name = xstrdup(patch->def_name); patch->new_name = xstrdup(patch->def_name); } - if (!patch->is_delete && !patch->new_name) { + if ((!patch->new_name && !patch->is_delete) || + (!patch->old_name && !patch->is_new)) { error(_("git diff header lacks filename information " "(line %d)"), state->linenr); return -128; diff --git a/t/t4133-apply-filenames.sh b/t/t4133-apply-filenames.sh index 2ecb4216b7..c5ed3b17c4 100755 --- a/t/t4133-apply-filenames.sh +++ b/t/t4133-apply-filenames.sh @@ -35,4 +35,28 @@ test_expect_success 'apply diff with inconsistent filenames in headers' ' test_i18ngrep "inconsistent old filename" err ' +test_expect_success 'apply diff with new filename missing from headers' ' + cat >missing_new_filename.diff <<-\EOF && + diff --git a/f b/f + index 0000000..d00491f + --- a/f + @@ -0,0 +1 @@ + +1 + EOF + test_must_fail git apply missing_new_filename.diff 2>err && + test_i18ngrep "lacks filename information" err +' + +test_expect_success 'apply diff with old filename missing from headers' ' + cat >missing_old_filename.diff <<-\EOF && + diff --git a/f b/f + index d00491f..0000000 + +++ b/f + @@ -1 +0,0 @@ + -1 + EOF + test_must_fail git apply missing_old_filename.diff 2>err && + test_i18ngrep "lacks filename information" err +' + test_done -- 2.13.2