From 65904b8b2b27c71a96d8a9c37c19bcc8f2d1380c Mon Sep 17 00:00:00 2001 From: Emily Shaffer Date: Mon, 30 Sep 2019 15:03:55 -0700 Subject: promisor-remote: skip move_to_tail when no-op Previously, when promisor_remote_move_to_tail() is called for a promisor_remote which is currently the final element in promisors, a cycle is created in the promisors linked list. This cycle leads to a double free later on in promisor_remote_clear() when the final element of the promisors list is removed: promisors is set to promisors->next (a no-op, as promisors->next == promisors); the previous value of promisors is free()'d; then the new value of promisors (which is equal to the previous value of promisors) is also free()'d. This double-free error was unrecoverable for the user without removing the filter or re-cloning the repo and hoping to miss this edge case. Now, when promisor_remote_move_to_tail() would be a no-op, just do a no-op. In cases of promisor_remote_move_to_tail() where r is not already at the tail of the list, it works as before. Helped-by: Jeff King Signed-off-by: Emily Shaffer Acked-by: Christian Couder Signed-off-by: Junio C Hamano --- t/t0410-partial-clone.sh | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 't/t0410-partial-clone.sh') diff --git a/t/t0410-partial-clone.sh b/t/t0410-partial-clone.sh index 2498e72a34..c5b2018a30 100755 --- a/t/t0410-partial-clone.sh +++ b/t/t0410-partial-clone.sh @@ -429,6 +429,19 @@ test_expect_success 'rev-list dies for missing objects on cmd line' ' done ' +test_expect_success 'single promisor remote can be re-initialized gracefully' ' + # ensure one promisor is in the promisors list + rm -rf repo && + test_create_repo repo && + test_create_repo other && + git -C repo remote add foo "file://$(pwd)/other" && + git -C repo config remote.foo.promisor true && + git -C repo config extensions.partialclone foo && + + # reinitialize the promisors list + git -C repo fetch --filter=blob:none foo +' + test_expect_success 'gc repacks promisor objects separately from non-promisor objects' ' rm -rf repo && test_create_repo repo && -- cgit v1.2.3