]> git.ipfire.org Git - thirdparty/git.git/commitdiff
pack-bitmap.c: more aggressively free in free_bitmap_index()
authorTaylor Blau <me@ttaylorr.com>
Tue, 26 Oct 2021 21:01:26 +0000 (17:01 -0400)
committerJunio C Hamano <gitster@pobox.com>
Thu, 28 Oct 2021 22:32:14 +0000 (15:32 -0700)
The function free_bitmap_index() is somewhat lax in what it frees. There
are two notable examples:

  - While it does call kh_destroy_oid_map on the "bitmaps" map, which
    maps commit OIDs to their corresponding bitmaps, the bitmaps
    themselves are not freed. Note here that we recycle already-freed
    ewah_bitmaps into a pool, but these are handled correctly by
    ewah_pool_free().

  - We never bother to free the extended index's "positions" map, which
    we always allocate in load_bitmap().

Fix both of these.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
pack-bitmap.c

index 3d81425c29b63382473306e0a8e3891e6738f860..a56ceb944107bef504d42ba90a379ca87063793c 100644 (file)
@@ -1859,9 +1859,17 @@ void free_bitmap_index(struct bitmap_index *b)
        ewah_pool_free(b->trees);
        ewah_pool_free(b->blobs);
        ewah_pool_free(b->tags);
+       if (b->bitmaps) {
+               struct stored_bitmap *sb;
+               kh_foreach_value(b->bitmaps, sb, {
+                       ewah_pool_free(sb->root);
+                       free(sb);
+               });
+       }
        kh_destroy_oid_map(b->bitmaps);
        free(b->ext_index.objects);
        free(b->ext_index.hashes);
+       kh_destroy_oid_pos(b->ext_index.positions);
        bitmap_free(b->result);
        bitmap_free(b->haves);
        if (bitmap_is_midx(b)) {