]> git.ipfire.org Git - thirdparty/git.git/commitdiff
pseudo-merge: fix various memory leaks
authorPatrick Steinhardt <ps@pks.im>
Mon, 30 Sep 2024 09:13:51 +0000 (11:13 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 30 Sep 2024 18:23:06 +0000 (11:23 -0700)
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>
pack-bitmap-write.c
pack-bitmap.c
pseudo-merge.c
pseudo-merge.h

index 4dc0fe8e404347a84080913c5c5c4a678d00f923..6413dd1731eb728fe78b410af4bf8007ae412fdb 100644 (file)
@@ -64,6 +64,12 @@ static void free_pseudo_merge_commit_idx(struct pseudo_merge_commit_idx *idx)
        free(idx);
 }
 
+static void pseudo_merge_group_release_cb(void *payload, const char *name UNUSED)
+{
+       pseudo_merge_group_release(payload);
+       free(payload);
+}
+
 void bitmap_writer_free(struct bitmap_writer *writer)
 {
        uint32_t i;
@@ -82,6 +88,8 @@ void bitmap_writer_free(struct bitmap_writer *writer)
        kh_foreach_value(writer->pseudo_merge_commits, idx,
                         free_pseudo_merge_commit_idx(idx));
        kh_destroy_oid_map(writer->pseudo_merge_commits);
+       string_list_clear_func(&writer->pseudo_merge_groups,
+                              pseudo_merge_group_release_cb);
 
        for (i = 0; i < writer->selected_nr; i++) {
                struct bitmapped_commit *bc = &writer->selected[i];
index 9d9b8c4bfbcc86f79792c91696eda8b3d4d91d4f..32b222a7afce26082e308ca5e6c24a494e9ab5d1 100644 (file)
@@ -1390,8 +1390,8 @@ static struct bitmap *find_objects(struct bitmap_index *bitmap_git,
                }
 
                base = bitmap_new();
-               if (!cascade_pseudo_merges_1(bitmap_git, base, roots_bitmap))
-                       bitmap_free(roots_bitmap);
+               cascade_pseudo_merges_1(bitmap_git, base, roots_bitmap);
+               bitmap_free(roots_bitmap);
        }
 
        /*
index 10ebd9a4e9639bc455d720a02dc649b5ed89819b..28782a31c6e08692c53d7557dfa1c80b409b6d08 100644 (file)
@@ -97,6 +97,25 @@ static void pseudo_merge_group_init(struct pseudo_merge_group *group)
        group->stable_size = DEFAULT_PSEUDO_MERGE_STABLE_SIZE;
 }
 
+void pseudo_merge_group_release(struct pseudo_merge_group *group)
+{
+       struct hashmap_iter iter;
+       struct strmap_entry *e;
+
+       regfree(group->pattern);
+       free(group->pattern);
+
+       strmap_for_each_entry(&group->matches, &iter, e) {
+               struct pseudo_merge_matches *matches = e->value;
+               free(matches->stable);
+               free(matches->unstable);
+               free(matches);
+       }
+       strmap_clear(&group->matches, 0);
+
+       free(group->merges);
+}
+
 static int pseudo_merge_config(const char *var, const char *value,
                               const struct config_context *ctx,
                               void *cb_data)
index 4b5febaa63e6fe5ab26b8239b8c71de3ff573456..29df8a32ecf3be751d5dd11349e1a49aa4ab5125 100644 (file)
@@ -51,6 +51,8 @@ struct pseudo_merge_group {
        timestamp_t stable_threshold;
 };
 
+void pseudo_merge_group_release(struct pseudo_merge_group *group);
+
 struct pseudo_merge_matches {
        struct commit **stable;
        struct commit **unstable;