From: Kevin Backhouse <kevinbackhouse@xxxxxxxxxx> To reproduce (with an ASAN build): ``` mkdir test cd test git init echo x > x.txt git add . git commit -m "WIP" git checkout -b dev echo y > x.txt git add . git commit -m "WIP" git checkout main echo z > x.txt git add . git commit -m "WIP" echo a > x.txt git add . git merge dev ``` The fix is to call free_commit_list(merge_bases) when an error occurs. Signed-off-by: Kevin Backhouse <kevinbackhouse@xxxxxxxxxx> --- This fixes a minor memory leak (detected by LeakSanitizer) in git merge To reproduce (with an ASAN build): mkdir test cd test git init echo x > x.txt git add . git commit -m "WIP" git checkout -b dev echo y > x.txt git add . git commit -m "WIP" git checkout main echo z > x.txt git add . git commit -m "WIP" echo a > x.txt git add . git merge dev The fix is to call free_commit_list(merge_bases) when an error occurs. Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1577%2Fkevinbackhouse%2Ffree-merge-bases-v1 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1577/kevinbackhouse/free-merge-bases-v1 Pull-Request: https://github.com/gitgitgadget/git/pull/1577 merge-ort-wrappers.c | 4 +++- merge-ort.c | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/merge-ort-wrappers.c b/merge-ort-wrappers.c index 4acedf3c338..aeb56c9970c 100644 --- a/merge-ort-wrappers.c +++ b/merge-ort-wrappers.c @@ -54,8 +54,10 @@ int merge_ort_recursive(struct merge_options *opt, struct tree *head = repo_get_commit_tree(opt->repo, side1); struct merge_result tmp; - if (unclean(opt, head)) + if (unclean(opt, head)) { + free_commit_list(merge_bases); return -1; + } memset(&tmp, 0, sizeof(tmp)); merge_incore_recursive(opt, merge_bases, side1, side2, &tmp); diff --git a/merge-ort.c b/merge-ort.c index 8631c997002..a0eb91fb011 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -5070,8 +5070,10 @@ static void merge_ort_internal(struct merge_options *opt, opt->branch1 = "Temporary merge branch 1"; opt->branch2 = "Temporary merge branch 2"; merge_ort_internal(opt, NULL, prev, next, result); - if (result->clean < 0) + if (result->clean < 0) { + free_commit_list(merge_bases); return; + } opt->branch1 = saved_b1; opt->branch2 = saved_b2; opt->priv->call_depth--; base-commit: f9972720e9a405e4f6924a7cde0ed5880687f4d0 -- gitgitgadget