pack-bitmap-write: deep-clear the `bb_commit` slab

The `bb_commit` commit slab is used by the pack-bitmap-write machinery
to track various pieces of bookkeeping used to generate reachability
bitmaps.

Even though we clear the slab when freeing the bitmap_builder struct
(with `bitmap_builder_clear()`), there are still pointers which point to
locations in memory that have not yet been freed, resulting in a leak.

Plug the leak by introducing a suitable `free_fn` for the `struct
bb_commit` type, and make sure it is called on each member of the slab
via the `deep_clear_bb_data()` function.

Note that it is possible for both of the arguments to `bitmap_free()` to
be NULL, but `bitmap_free()` is a noop for NULL arguments, so it is OK
to pass them unconditionally.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Taylor Blau 2023-12-14 17:23:42 -05:00 committed by Junio C Hamano
parent 66f0c71073
commit 6cdb67b97d
1 changed files with 8 additions and 1 deletions

View File

@ -198,6 +198,13 @@ struct bb_commit {
unsigned idx; /* within selected array */
};

static void clear_bb_commit(struct bb_commit *commit)
{
free_commit_list(commit->reverse_edges);
bitmap_free(commit->commit_mask);
bitmap_free(commit->bitmap);
}

define_commit_slab(bb_data, struct bb_commit);

struct bitmap_builder {
@ -339,7 +346,7 @@ next:

static void bitmap_builder_clear(struct bitmap_builder *bb)
{
clear_bb_data(&bb->data);
deep_clear_bb_data(&bb->data, clear_bb_commit);
free(bb->commits);
bb->commits_nr = bb->commits_alloc = 0;
}