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 <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Patrick Steinhardt committed
Sep 30, 2024 at 11:13 UTC
55e563a90cabacd144b529b8bab7c4bb1cecbc49
4 files changed
+31
-2
pack-bitmap-write.c
+8
@@ -64,6 +64,12 @@ static void free_pseudo_merge_commit_idx(struct pseudo_merge_commit_idx *idx)
64
free(idx);
65
}
66
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
+
73
void bitmap_writer_free(struct bitmap_writer *writer)
74
{
75
uint32_t i;
@@ -82,6 +88,8 @@ void bitmap_writer_free(struct bitmap_writer *writer)
88
kh_foreach_value(writer->pseudo_merge_commits, idx,
89
free_pseudo_merge_commit_idx(idx));
90
kh_destroy_oid_map(writer->pseudo_merge_commits);
91
+ string_list_clear_func(&writer->pseudo_merge_groups,
92
+ pseudo_merge_group_release_cb);
93
94
for (i = 0; i < writer->selected_nr; i++) {
95
struct bitmapped_commit *bc = &writer->selected[i];
pack-bitmap.c
+2
-2
@@ -1390,8 +1390,8 @@ static struct bitmap *find_objects(struct bitmap_index *bitmap_git,
1390
}
1391
1392
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);
1395
}
1396
1397
/*
pseudo-merge.c
+19
@@ -97,6 +97,25 @@ static void pseudo_merge_group_init(struct pseudo_merge_group *group)
97
group->stable_size = DEFAULT_PSEUDO_MERGE_STABLE_SIZE;
98
}
99
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
+
119
static int pseudo_merge_config(const char *var, const char *value,
120
const struct config_context *ctx,
121
void *cb_data)
pseudo-merge.h
+2
@@ -51,6 +51,8 @@ struct pseudo_merge_group {
51
timestamp_t stable_threshold;
52
};
53
54
+void pseudo_merge_group_release(struct pseudo_merge_group *group);
55
+
56
struct pseudo_merge_matches {
57
struct commit **stable;
58
struct commit **unstable;