prune_refs(): also free the linked list
At least since v1.7, the elements of the `refs_to_prune` linked list have been leaked. Fix the leak by teaching `prune_refs()` to free the list elements as it processes them. Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Michael Haggerty committed
Sep 8, 2017 at 15:51 UTC
22b09cdfadf7a48f6503fddf51082c66541cf1d6
1 file changed
+10
-4
refs/files-backend.c
+10
-4
@@ -1057,11 +1057,17 @@ static void prune_ref(struct files_ref_store *refs, struct ref_to_prune *r)
1057
strbuf_release(&err);
1058
}
1059
1060
-static void prune_refs(struct files_ref_store *refs, struct ref_to_prune *r)
1060
+/*
1061
+ * Prune the loose versions of the references in the linked list
1062
+ * `*refs_to_prune`, freeing the entries in the list as we go.
1063
+ */
1064
+static void prune_refs(struct files_ref_store *refs, struct ref_to_prune **refs_to_prune)
1065
{
1062
- while (r) {
1066
+ while (*refs_to_prune) {
1067
+ struct ref_to_prune *r = *refs_to_prune;
1068
+ *refs_to_prune = r->next;
1069
prune_ref(refs, r);
1064
- r = r->next;
1070
+ free(r);
1071
}
1072
}
1073
@@ -1148,7 +1154,7 @@ static int files_pack_refs(struct ref_store *ref_store, unsigned int flags)
1154
1155
packed_refs_unlock(refs->packed_ref_store);
1156
1151
- prune_refs(refs, refs_to_prune);
1157
+ prune_refs(refs, &refs_to_prune);
1158
strbuf_release(&err);
1159
return 0;
1160
}