mirror of
https://github.com/git/git.git
synced 2024-12-24 09:13:59 +08:00
sparse-checkout: fix OOM error with mixed patterns
Add a test to t1091-sparse-checkout-builtin.sh that would result in an infinite loop and out-of-memory error before this change. The issue relies on having non-cone-mode patterns while trying to modify the patterns in cone-mode. The fix is simple, allowing us to break from the loop when the input path does not contain a slash, as the "dir" pattern we added does not. This is only a fix to the critical out-of-memory error. A better response to such a strange state will follow in a later change. Reported-by: Calbabreaker <calbabreaker@gmail.com> Helped-by: Taylor Blau <me@ttaylorr.com> Reviewed-by: Elijah Newren <newren@gmail.com> Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
a481d4378c
commit
391c3a1020
@ -483,7 +483,7 @@ static void insert_recursive_pattern(struct pattern_list *pl, struct strbuf *pat
|
|||||||
char *oldpattern = e->pattern;
|
char *oldpattern = e->pattern;
|
||||||
size_t newlen;
|
size_t newlen;
|
||||||
|
|
||||||
if (slash == e->pattern)
|
if (!slash || slash == e->pattern)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
newlen = slash - e->pattern;
|
newlen = slash - e->pattern;
|
||||||
|
@ -103,6 +103,17 @@ test_expect_success 'clone --sparse' '
|
|||||||
check_files clone a
|
check_files clone a
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'switching to cone mode with non-cone mode patterns' '
|
||||||
|
git init bad-patterns &&
|
||||||
|
(
|
||||||
|
cd bad-patterns &&
|
||||||
|
git sparse-checkout init &&
|
||||||
|
git sparse-checkout add dir &&
|
||||||
|
git config core.sparseCheckoutCone true &&
|
||||||
|
git sparse-checkout add dir
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success 'interaction with clone --no-checkout (unborn index)' '
|
test_expect_success 'interaction with clone --no-checkout (unborn index)' '
|
||||||
git clone --no-checkout "file://$(pwd)/repo" clone_no_checkout &&
|
git clone --no-checkout "file://$(pwd)/repo" clone_no_checkout &&
|
||||||
git -C clone_no_checkout sparse-checkout init --cone &&
|
git -C clone_no_checkout sparse-checkout init --cone &&
|
||||||
|
Loading…
Reference in New Issue
Block a user