]> git.ipfire.org Git - thirdparty/git.git/commitdiff
shallow: fix leak when unregistering last shallow root
authorPatrick Steinhardt <ps@pks.im>
Tue, 24 Sep 2024 21:50:39 +0000 (17:50 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 25 Sep 2024 17:24:52 +0000 (10:24 -0700)
When unregistering a shallow root we shrink the array of grafts by one
and move remaining grafts one to the left. This can of course only
happen when there are any grafts left, because otherwise there is
nothing to move. As such, this code is guarded by a condition that only
performs the move in case there are grafts after the position of the
graft to be unregistered.

By mistake we also put the call to free the unregistered graft into that
condition. But that doesn't make any sense, as we want to always free
the graft when it exists. Fix the resulting memory leak by doing so.

This leak is exposed by t5500, but plugging it does not make the whole
test suite pass.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
shallow.c

index dcebc263d704ce9cb2eb63047617b8b6e2c702a9..4bb1518dbc80747d2641a5a80291ab159270804c 100644 (file)
--- a/shallow.c
+++ b/shallow.c
@@ -51,12 +51,11 @@ int unregister_shallow(const struct object_id *oid)
        int pos = commit_graft_pos(the_repository, oid);
        if (pos < 0)
                return -1;
-       if (pos + 1 < the_repository->parsed_objects->grafts_nr) {
-               free(the_repository->parsed_objects->grafts[pos]);
+       free(the_repository->parsed_objects->grafts[pos]);
+       if (pos + 1 < the_repository->parsed_objects->grafts_nr)
                MOVE_ARRAY(the_repository->parsed_objects->grafts + pos,
                           the_repository->parsed_objects->grafts + pos + 1,
                           the_repository->parsed_objects->grafts_nr - pos - 1);
-       }
        the_repository->parsed_objects->grafts_nr--;
        return 0;
 }