Merge branch 'tb/cap-patch-at-1gb'

"git apply" limits its input to a bit less than 1 GiB.

* tb/cap-patch-at-1gb:
  apply: reject patches larger than ~1 GiB
This commit is contained in:
Taylor Blau 2022-10-30 21:04:43 -04:00
commit c41ec63ef5
2 changed files with 34 additions and 1 deletions

12
apply.c
View File

@ -386,9 +386,19 @@ static void say_patch_name(FILE *output, const char *fmt, struct patch *patch)
#define SLOP (16)
/*
* apply.c isn't equipped to handle arbitrarily large patches, because
* it intermingles `unsigned long` with `int` for the type used to store
* buffer lengths.
*
* Only process patches that are just shy of 1 GiB large in order to
* avoid any truncation or overflow issues.
*/
#define MAX_APPLY_SIZE (1024UL * 1024 * 1023)
static int read_patch_file(struct strbuf *sb, int fd)
{
if (strbuf_read(sb, fd, 0) < 0)
if (strbuf_read(sb, fd, 0) < 0 || sb->len >= MAX_APPLY_SIZE)
return error_errno("git apply: failed to read");
/*

23
t/t4141-apply-too-large.sh Executable file
View File

@ -0,0 +1,23 @@
#!/bin/sh
test_description='git apply with too-large patch'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh
test_expect_success EXPENSIVE 'git apply rejects patches that are too large' '
sz=$((1024 * 1024 * 1023)) &&
{
cat <<-\EOF &&
diff --git a/file b/file
new file mode 100644
--- /dev/null
+++ b/file
@@ -0,0 +1 @@
EOF
test-tool genzeros
} | test_copy_bytes $sz | test_must_fail git apply 2>err &&
grep "git apply: failed to read" err
'
test_done