]> git.ipfire.org Git - thirdparty/git.git/commitdiff
remote: fix leaking tracking refs
authorPatrick Steinhardt <ps@pks.im>
Thu, 5 Sep 2024 10:08:59 +0000 (12:08 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 5 Sep 2024 15:49:11 +0000 (08:49 -0700)
When computing the remote tracking ref we cause two memory leaks:

  - We leak when `remote_tracking()` fails.

  - We leak when the call to `remote_tracking()` succeeds and sets
    `ref->tracking_ref()`.

Fix both of these leaks.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
remote.c

index 7d5b8f750d8b76182dc75a1aa0ca722a60cae535..8d666c16410fb6f91ce395e561630371610f0621 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -1097,6 +1097,7 @@ void free_one_ref(struct ref *ref)
                return;
        free_one_ref(ref->peer_ref);
        free(ref->remote_status);
+       free(ref->tracking_ref);
        free(ref->symref);
        free(ref);
 }
@@ -2577,8 +2578,10 @@ static int remote_tracking(struct remote *remote, const char *refname,
        dst = apply_refspecs(&remote->fetch, refname);
        if (!dst)
                return -1; /* no tracking ref for refname at remote */
-       if (refs_read_ref(get_main_ref_store(the_repository), dst, oid))
+       if (refs_read_ref(get_main_ref_store(the_repository), dst, oid)) {
+               free(dst);
                return -1; /* we know what the tracking ref is but we cannot read it */
+       }
 
        *dst_refname = dst;
        return 0;