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:
Derrick Stolee 2021-12-16 16:13:41 +00:00 committed by Junio C Hamano
parent a481d4378c
commit 391c3a1020
2 changed files with 12 additions and 1 deletions

View File

@ -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;

View File

@ -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 &&