git/list[1] front-page[2] threads[3] people[4] search[5] about
wed 2026-10-07 16:53 UTC

[PATCH v4 1/3] apply: report the location of corrupt patches

From
JWJialong Wang <jerrywang183@yahoo.com>
Date
Mar 17, 2026, 16:23 UTC
Message-ID
<20260317162321.71812-2-jerrywang183@yahoo.com>
In-Reply-To
<20260317162321.71812-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 so the reported location is easier to use.

Reset the line number for each patch input so the reported location stays correct when multiple input files are provided.

Add tests for file input, standard input, multiple patch inputs, and existing binary-diff corrupt patch cases.

Signed-off-by: Jialong Wang <jerrywang183@yahoo.com>
---
 apply.c                |  4 +++-
 t/t4012-diff-binary.sh |  4 ++--
 t/t4100-apply-stat.sh  | 38 +++++++++++++++++++++++++++++++++++++-
 3 files changed, 42 insertions(+), 4 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/t4012-diff-binary.sh b/t/t4012-diff-binary.sh
index d1d30ac2a9..97b5ac0407 100755
--- a/t/t4012-diff-binary.sh
+++ b/t/t4012-diff-binary.sh
@@ -68,7 +68,7 @@ test_expect_success 'apply detecting corrupt patch correctly' '
 	sed -e "s/-CIT/xCIT/" <output >broken &&
 	test_must_fail git apply --stat --summary broken 2>detected &&
 	detected=$(cat detected) &&
-	detected=$(expr "$detected" : "error.*at line \\([0-9]*\\)\$") &&
+	detected=$(expr "$detected" : "error.*broken:\\([0-9]*\\)\$") &&
 	detected=$(sed -ne "${detected}p" broken) &&
 	test "$detected" = xCIT
 '
@@ -77,7 +77,7 @@ test_expect_success 'apply detecting corrupt patch correctly' '
 	git diff --binary | sed -e "s/-CIT/xCIT/" >broken &&
 	test_must_fail git apply --stat --summary broken 2>detected &&
 	detected=$(cat detected) &&
-	detected=$(expr "$detected" : "error.*at line \\([0-9]*\\)\$") &&
+	detected=$(expr "$detected" : "error.*broken:\\([0-9]*\\)\$") &&
 	detected=$(sed -ne "${detected}p" broken) &&
 	test "$detected" = xCIT
 '
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 <patch 2>err &&
+	echo "error: corrupt patch at <stdin>: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
Previous: Jialong Wang
Message 14 of 14 in “apply: report the location of corrupt patches”
  1. apply: report the location of corrupt patchesJialong Wang, Mar 15, 2026
  2. Karthik NayakMar 16, 2026
  3. Jialong WangMar 16, 2026
  4. apply: report the location of corrupt patchesJialong Wang, Mar 16, 2026
  5. apply: report the location of corrupt patchesJialong Wang, Mar 16, 2026
  6. Junio C HamanoMar 16, 2026
  7. Jialong WangMar 16, 2026
  8. apply: report input location in header parsing errorsJialong Wang, Mar 16, 2026
  9. apply: report input location in header parsing errorsJialong Wang, Mar 16, 2026
  10. Junio C HamanoMar 16, 2026
  11. 0/3 apply: report input file for more parse errorsJialong Wang, Mar 17, 2026
  12. 2/3 apply: report input location in header parsing errorsJialong Wang, Mar 17, 2026
  13. 3/3 apply: report input location in binary and garbage patch errorsJialong Wang, Mar 17, 2026
  14. 1/3 apply: report the location of corrupt patchesJialong Wang, Mar 17, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.