diff options
author | Jeff King <peff@peff.net> | 2020-02-12 21:16:33 -0500 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2020-02-13 09:08:58 -0800 |
commit | acac50dd8c2c9725841b3e9143d78c6345dc076c (patch) | |
tree | afa32ba98f25de1dff2bd6cae0ea4f3cda6b8fc9 | |
parent | pack-bitmap: factor out type iterator initialization (diff) | |
download | tgif-acac50dd8c2c9725841b3e9143d78c6345dc076c.tar.xz |
pack-bitmap: fix leak of haves/wants object lists
When we do a bitmap-aware revision traversal, we create an object_list
for each of the "haves" and "wants" tips. After creating the result
bitmaps these are no longer needed or used, but we never free the list
memory.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | object.c | 9 | ||||
-rw-r--r-- | object.h | 2 | ||||
-rw-r--r-- | pack-bitmap.c | 5 |
3 files changed, 16 insertions, 0 deletions
@@ -307,6 +307,15 @@ int object_list_contains(struct object_list *list, struct object *obj) return 0; } +void object_list_free(struct object_list **list) +{ + while (*list) { + struct object_list *p = *list; + *list = p->next; + free(p); + } +} + /* * A zero-length string to which object_array_entry::name can be * initialized without requiring a malloc/free. @@ -151,6 +151,8 @@ struct object_list *object_list_insert(struct object *item, int object_list_contains(struct object_list *list, struct object *obj); +void object_list_free(struct object_list **list); + /* Object array handling .. */ void add_object_array(struct object *obj, const char *name, struct object_array *array); void add_object_array_with_path(struct object *obj, const char *name, struct object_array *array, unsigned mode, const char *path); diff --git a/pack-bitmap.c b/pack-bitmap.c index 9ca356ee29..6c06099dc7 100644 --- a/pack-bitmap.c +++ b/pack-bitmap.c @@ -787,10 +787,15 @@ struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs) bitmap_git->result = wants_bitmap; bitmap_git->haves = haves_bitmap; + object_list_free(&wants); + object_list_free(&haves); + return bitmap_git; cleanup: free_bitmap_index(bitmap_git); + object_list_free(&wants); + object_list_free(&haves); return NULL; } |