remote: fix leaking tracking refs

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>

Patrick Steinhardt committed Sep 5, 2024 at 12:08 UTC cdbb7208c80661754b3f1a73aef086c08f88dcff
1 file changed +4 -1
remote.c
+4 -1
@@ -1097,6 +1097,7 @@ void free_one_ref(struct ref *ref)
1097 return;
1098 free_one_ref(ref->peer_ref);
1099 free(ref->remote_status);
1100 + free(ref->tracking_ref);
1101 free(ref->symref);
1102 free(ref);
1103 }
@@ -2577,8 +2578,10 @@ static int remote_tracking(struct remote *remote, const char *refname,
2578 dst = apply_refspecs(&remote->fetch, refname);
2579 if (!dst)
2580 return -1; /* no tracking ref for refname at remote */
2580 - if (refs_read_ref(get_main_ref_store(the_repository), dst, oid))
2581 + if (refs_read_ref(get_main_ref_store(the_repository), dst, oid)) {
2582 + free(dst);
2583 return -1; /* we know what the tracking ref is but we cannot read it */
2584 + }
2585
2586 *dst_refname = dst;
2587 return 0;