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:
12
apply.c
12
apply.c
@ -386,9 +386,19 @@ static void say_patch_name(FILE *output, const char *fmt, struct patch *patch)
|
|||||||
|
|
||||||
#define SLOP (16)
|
#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)
|
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");
|
return error_errno("git apply: failed to read");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
23
t/t4141-apply-too-large.sh
Executable file
23
t/t4141-apply-too-large.sh
Executable 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
|
Reference in New Issue
Block a user