]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/merge: release output buffer after performing merge
authorPatrick Steinhardt <ps@pks.im>
Tue, 5 Nov 2024 06:17:49 +0000 (07:17 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 5 Nov 2024 06:37:57 +0000 (22:37 -0800)
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>
builtin/merge.c
t/t6424-merge-unrelated-index-changes.sh

index 84d0f3604bc36c77f98a68377d1f078b7d241824..51038eaca849fa44cf7225d91c1aa828e8fc4d83 100644 (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);
index 7677c5f08d0e8fb66dd243c05e9a9b892b6114df..a7ea8acb8451cde95fe462f6e63912ec849737a2 100755 (executable)
@@ -2,6 +2,7 @@
 
 test_description="merges with unrelated index changes"
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # Testcase for some simple merges