builtin/merge: release output buffer after performing merge

The `obuf` member of `struct merge_options` is used to buffer output in
some cases. In order to not discard its allocated memory we only release
its contents in `merge_finalize()` when we're not currently recursing
into a subtree.

This results in some situations where we seemingly do not release the
buffer reliably. We thus have calls to `strbuf_release()` for this
buffer scattered across the codebase. But we're missing one callsite in
git-merge(1), which causes a memory leak.

We should ideally refactor this interface so that callers don't have to
know about any such internals. But for now, paper over the issue by
adding one more `strbuf_release()` call.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Patrick Steinhardt 2024-11-05 07:17:49 +01:00 committed by Junio C Hamano
parent 813b12b6f7
commit ff67083ccd
2 changed files with 2 additions and 0 deletions

View File

@ -754,6 +754,7 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common,
clean = merge_recursive(&o, head, remoteheads->item,
reversed, &result);
free_commit_list(reversed);
strbuf_release(&o.obuf);

if (clean < 0) {
rollback_lock_file(&lock);

View File

@ -2,6 +2,7 @@

test_description="merges with unrelated index changes"

TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh

# Testcase for some simple merges