From: Jialong Wang Date: Mon, 16 Mar 2026 11:34:59 GMT Subject: [GSoC PATCH v2] apply: report the location of corrupt patches Message-ID: <20260316113459.77794-1-jerrywang183@yahoo.com> In-Reply-To: <20260315231538.68586-1-jerrywang183@yahoo.com> When parsing a corrupt patch, git apply reports only the line number. That does not tell the user which input the line number refers to. Include the patch input path in the error message, and reset the line number for each patch input so the reported location remains useful when multiple patch files are provided. Add tests for file input, standard input, and multiple patch inputs. Signed-off-by: Jialong Wang --- Changes since v1: - reset the line number for each patch input - add a test for multiple patch inputs where one input is corrupted apply.c | 4 +++- t/t4100-apply-stat.sh | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/apply.c b/apply.c index b6dd1066a0..b7b0a201b3 100644 --- a/apply.c +++ b/apply.c @@ -1875,7 +1875,8 @@ static int parse_single_patch(struct apply_state *state, len = parse_fragment(state, line, size, patch, fragment); if (len <= 0) { free(fragment); - return error(_("corrupt patch at line %d"), state->linenr); + return error(_("corrupt patch at %s:%d"), + state->patch_input_file, state->linenr); } fragment->patch = line; fragment->size = len; @@ -4825,6 +4826,7 @@ static int apply_patch(struct apply_state *state, int flush_attributes = 0; state->patch_input_file = filename; + state->linenr = 1; if (read_patch_file(&buf, fd) < 0) return -128; offset = 0; diff --git a/t/t4100-apply-stat.sh b/t/t4100-apply-stat.sh index a5664f3eb3..b19fc9fe50 100755 --- a/t/t4100-apply-stat.sh +++ b/t/t4100-apply-stat.sh @@ -48,7 +48,43 @@ test_expect_success 'applying a hunk header which overflows fails' ' +b EOF test_must_fail git apply patch 2>err && - echo "error: corrupt patch at line 4" >expect && + echo "error: corrupt patch at patch:4" >expect && + test_cmp expect err +' + +test_expect_success 'applying a hunk header which overflows from stdin fails' ' + cat >patch <<-\EOF && + diff -u a/file b/file + --- a/file + +++ b/file + @@ -98765432109876543210 +98765432109876543210 @@ + -a + +b + EOF + test_must_fail git apply err && + echo "error: corrupt patch at :4" >expect && + test_cmp expect err +' + +test_expect_success 'applying multiple patches reports the corrupted input' ' + cat >good.patch <<-\EOF && + diff -u a/file b/file + --- a/file + +++ b/file + @@ -1 +1 @@ + -a + +b + EOF + cat >bad.patch <<-\EOF && + diff -u a/file b/file + --- a/file + +++ b/file + @@ -98765432109876543210 +98765432109876543210 @@ + -a + +b + EOF + test_must_fail git apply --stat --summary good.patch bad.patch 2>err && + echo "error: corrupt patch at bad.patch:4" >expect && test_cmp expect err ' test_done -- 2.51.0