Skip to content

Commit c70b5e7

Browse files
committed
Merge branch 'en/plug-leaks-in-merge'
Leakfix. * en/plug-leaks-in-merge: merge: fix memory leaks in cmd_merge() merge-ort: fix memory leak in merge_ort_internal()
2 parents c70bc33 + 6046f7a commit c70b5e7

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed

builtin/merge.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1273,7 +1273,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
12731273
int best_cnt = -1, merge_was_ok = 0, automerge_was_ok = 0;
12741274
struct commit_list *common = NULL;
12751275
const char *best_strategy = NULL, *wt_strategy = NULL;
1276-
struct commit_list *remoteheads, *p;
1276+
struct commit_list *remoteheads = NULL, *p;
12771277
void *branch_to_free;
12781278
int orig_argc = argc;
12791279

@@ -1752,6 +1752,10 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
17521752
ret = suggest_conflicts();
17531753

17541754
done:
1755+
if (!automerge_was_ok) {
1756+
free_commit_list(common);
1757+
free_commit_list(remoteheads);
1758+
}
17551759
strbuf_release(&buf);
17561760
free(branch_to_free);
17571761
return ret;

merge-ort.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4579,7 +4579,7 @@ static void merge_ort_internal(struct merge_options *opt,
45794579
struct commit *h2,
45804580
struct merge_result *result)
45814581
{
4582-
struct commit_list *iter;
4582+
struct commit *next;
45834583
struct commit *merged_merge_bases;
45844584
const char *ancestor_name;
45854585
struct strbuf merge_base_abbrev = STRBUF_INIT;
@@ -4608,7 +4608,8 @@ static void merge_ort_internal(struct merge_options *opt,
46084608
ancestor_name = merge_base_abbrev.buf;
46094609
}
46104610

4611-
for (iter = merge_bases; iter; iter = iter->next) {
4611+
for (next = pop_commit(&merge_bases); next;
4612+
next = pop_commit(&merge_bases)) {
46124613
const char *saved_b1, *saved_b2;
46134614
struct commit *prev = merged_merge_bases;
46144615

@@ -4625,7 +4626,7 @@ static void merge_ort_internal(struct merge_options *opt,
46254626
saved_b2 = opt->branch2;
46264627
opt->branch1 = "Temporary merge branch 1";
46274628
opt->branch2 = "Temporary merge branch 2";
4628-
merge_ort_internal(opt, NULL, prev, iter->item, result);
4629+
merge_ort_internal(opt, NULL, prev, next, result);
46294630
if (result->clean < 0)
46304631
return;
46314632
opt->branch1 = saved_b1;
@@ -4636,8 +4637,7 @@ static void merge_ort_internal(struct merge_options *opt,
46364637
result->tree,
46374638
"merged tree");
46384639
commit_list_insert(prev, &merged_merge_bases->parents);
4639-
commit_list_insert(iter->item,
4640-
&merged_merge_bases->parents->next);
4640+
commit_list_insert(next, &merged_merge_bases->parents->next);
46414641

46424642
clear_or_reinit_internal_opts(opt->priv, 1);
46434643
}

0 commit comments

Comments
 (0)