Skip to content

Commit 55e563a

Browse files
pks-tgitster
authored andcommitted
pseudo-merge: fix various memory leaks
Fix various memory leaks hit by the pseudo-merge machinery. These leaks are exposed by t5333, but plugging them does not yet make the whole test suite pass. Signed-off-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 5ce08ed commit 55e563a

File tree

4 files changed

+31
-2
lines changed

4 files changed

+31
-2
lines changed

pack-bitmap-write.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,12 @@ static void free_pseudo_merge_commit_idx(struct pseudo_merge_commit_idx *idx)
6464
free(idx);
6565
}
6666

67+
static void pseudo_merge_group_release_cb(void *payload, const char *name UNUSED)
68+
{
69+
pseudo_merge_group_release(payload);
70+
free(payload);
71+
}
72+
6773
void bitmap_writer_free(struct bitmap_writer *writer)
6874
{
6975
uint32_t i;
@@ -82,6 +88,8 @@ void bitmap_writer_free(struct bitmap_writer *writer)
8288
kh_foreach_value(writer->pseudo_merge_commits, idx,
8389
free_pseudo_merge_commit_idx(idx));
8490
kh_destroy_oid_map(writer->pseudo_merge_commits);
91+
string_list_clear_func(&writer->pseudo_merge_groups,
92+
pseudo_merge_group_release_cb);
8593

8694
for (i = 0; i < writer->selected_nr; i++) {
8795
struct bitmapped_commit *bc = &writer->selected[i];

pack-bitmap.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1390,8 +1390,8 @@ static struct bitmap *find_objects(struct bitmap_index *bitmap_git,
13901390
}
13911391

13921392
base = bitmap_new();
1393-
if (!cascade_pseudo_merges_1(bitmap_git, base, roots_bitmap))
1394-
bitmap_free(roots_bitmap);
1393+
cascade_pseudo_merges_1(bitmap_git, base, roots_bitmap);
1394+
bitmap_free(roots_bitmap);
13951395
}
13961396

13971397
/*

pseudo-merge.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,25 @@ static void pseudo_merge_group_init(struct pseudo_merge_group *group)
9797
group->stable_size = DEFAULT_PSEUDO_MERGE_STABLE_SIZE;
9898
}
9999

100+
void pseudo_merge_group_release(struct pseudo_merge_group *group)
101+
{
102+
struct hashmap_iter iter;
103+
struct strmap_entry *e;
104+
105+
regfree(group->pattern);
106+
free(group->pattern);
107+
108+
strmap_for_each_entry(&group->matches, &iter, e) {
109+
struct pseudo_merge_matches *matches = e->value;
110+
free(matches->stable);
111+
free(matches->unstable);
112+
free(matches);
113+
}
114+
strmap_clear(&group->matches, 0);
115+
116+
free(group->merges);
117+
}
118+
100119
static int pseudo_merge_config(const char *var, const char *value,
101120
const struct config_context *ctx,
102121
void *cb_data)

pseudo-merge.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ struct pseudo_merge_group {
5151
timestamp_t stable_threshold;
5252
};
5353

54+
void pseudo_merge_group_release(struct pseudo_merge_group *group);
55+
5456
struct pseudo_merge_matches {
5557
struct commit **stable;
5658
struct commit **unstable;

0 commit comments

Comments
 (0)