]> git.ipfire.org Git - thirdparty/git.git/commitdiff
http-push: clean up local_refs at exit
authorJeff King <peff@peff.net>
Tue, 24 Sep 2024 22:12:39 +0000 (18:12 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 25 Sep 2024 17:24:58 +0000 (10:24 -0700)
We allocate a list of ref structs from get_local_heads() but never clean
it up. We should do so before exiting to avoid complaints from the
leak-checker. Note that we have to initialize it to NULL, because
there's one code path that can jump to the cleanup label before we
assign to it.

Fixing this lets us mark t5540 as leak-free.

Curiously building with SANITIZE=leak and gcc does not seem to find this
problem, but switching to clang does. It seems like a fairly obvious
leak, though.

I was curious that the matching remote_refs did not have the same leak.
But that is because we store the list in a global variable, so it's
still reachable after we exit. Arguably we could treat it the same as
future-proofing, but I didn't bother (now that the script is marked
leak-free, anybody moving it to a stack variable will notice).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
http-push.c
t/t5540-http-push-webdav.sh

index b36b1f9e35bc6ac6885881dcd1205ea2c6e494bd..aad89f2eab3b52765711f1f8a1852c79f877dcac 100644 (file)
@@ -1719,7 +1719,7 @@ int cmd_main(int argc, const char **argv)
        int rc = 0;
        int i;
        int new_refs;
-       struct ref *ref, *local_refs;
+       struct ref *ref, *local_refs = NULL;
 
        CALLOC_ARRAY(repo, 1);
 
@@ -1997,6 +1997,7 @@ int cmd_main(int argc, const char **argv)
        }
 
        refspec_clear(&rs);
+       free_refs(local_refs);
 
        return rc;
 }
index 37db3dec0c5b3939c9cb6f2e6f6e383c80045c87..27389b09081fbe46fe700bfcf117188303ed1753 100755 (executable)
@@ -10,6 +10,7 @@ This test runs various sanity checks on http-push.'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 if git http-push > /dev/null 2>&1 || [ $? -eq 128 ]