apply: report input location in binary and garbage patch errors

Several binary parsing paths in apply.c still report only line
numbers. When more than one patch input is fed to a single
invocation, that does not tell the user which input the line belongs
to.

Report the patch input location for corrupt and unrecognized binary
patches, as well as the "patch with only garbage" case, and update
the related tests.

Signed-off-by: Jialong Wang <jerrywang183@yahoo.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Jialong Wang 2026-03-17 12:23:21 -04:00 committed by Junio C Hamano
parent 838c0ba500
commit 2ef795b027
3 changed files with 37 additions and 5 deletions

10
apply.c
View File

@ -2110,8 +2110,8 @@ static struct fragment *parse_binary_hunk(struct apply_state *state,
corrupt:
free(data);
*status_p = -1;
error(_("corrupt binary patch at line %d: %.*s"),
state->linenr-1, llen-1, buffer);
error(_("corrupt binary patch at %s:%d: %.*s"),
state->patch_input_file, state->linenr-1, llen-1, buffer);
return NULL;
}

@ -2147,7 +2147,8 @@ static int parse_binary(struct apply_state *state,
forward = parse_binary_hunk(state, &buffer, &size, &status, &used);
if (!forward && !status)
/* there has to be one hunk (forward hunk) */
return error(_("unrecognized binary patch at line %d"), state->linenr-1);
return error(_("unrecognized binary patch at %s:%d"),
state->patch_input_file, state->linenr-1);
if (status)
/* otherwise we already gave an error message */
return status;
@ -2309,7 +2310,8 @@ static int parse_chunk(struct apply_state *state, char *buffer, unsigned long si
*/
if ((state->apply || state->check) &&
(!patch->is_binary && !metadata_changes(patch))) {
error(_("patch with only garbage at line %d"), state->linenr);
error(_("patch with only garbage at %s:%d"),
state->patch_input_file, state->linenr);
return -128;
}
}

View File

@ -125,4 +125,16 @@ test_expect_success 'applying a patch with an invalid mode reports the input' '
EOF
test_cmp expect err
'

test_expect_success 'applying a patch with only garbage reports the input' '
cat >garbage.patch <<-\EOF &&
diff --git a/f b/f
--- a/f
+++ b/f
this is garbage
EOF
test_must_fail git apply garbage.patch 2>err &&
echo "error: patch with only garbage at garbage.patch:4" >expect &&
test_cmp expect err
'
test_done

View File

@ -179,6 +179,24 @@ test_expect_success PERL_TEST_HELPERS 'reject truncated binary diff' '
" <patch >patch.trunc &&

do_reset &&
test_must_fail git apply patch.trunc
test_must_fail git apply patch.trunc 2>err &&
line=$(awk "END { print NR + 1 }" patch.trunc) &&
grep "error: corrupt binary patch at patch.trunc:$line: " err
'

test_expect_success 'reject unrecognized binary diff' '
cat >patch.bad <<-\EOF &&
diff --git a/f b/f
new file mode 100644
index 0000000..7898192
GIT binary patch
bogus
EOF
test_must_fail git apply patch.bad 2>err &&
cat >expect <<-\EOF &&
error: unrecognized binary patch at patch.bad:4
error: No valid patches in input (allow with "--allow-empty")
EOF
test_cmp expect err
'
test_done