]> git.ipfire.org Git - thirdparty/git.git/commit
checkout: fix "branch info" memory leaks
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Tue, 16 Nov 2021 18:27:38 +0000 (19:27 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 18 Nov 2021 22:32:26 +0000 (14:32 -0800)
commit9081a421a6dbeeda637df8edb0ebf0da11a05b69
treeffeba69496f95b52228df43cb18ab869c36dfb17
parentcd3e606211bb1cf8bc57f7d76bab98cc17a150bc
checkout: fix "branch info" memory leaks

The "checkout" command is one of the main sources of leaks in the test
suite, let's fix the common ones by not leaking from the "struct
branch_info".

Doing this is rather straightforward, albeit verbose, we need to
xstrdup() constant strings going into the struct, and free() the ones
we clobber as we go along.

This also means that we can delete previous partial leak fixes in this
area, i.e. the "path_to_free" accounting added by 96ec7b1e708 (Convert
resolve_ref+xstrdup to new resolve_refdup function, 2011-12-13).

There was some discussion about whether "we should retain the "const
char *" here and cast at free() time, or have it be a "char *". Since
this is not a public API with any sort of API boundary let's use
"char *", as is already being done for the "refname" member of the
same struct.

The tests to mark as passing were found with:

    rm .prove; GIT_SKIP_TESTS=t0027 prove -j8 --state=save t[0-9]*.sh :: --immediate
    # apply & compile this change
    prove -j8 --state=failed :: --immediate

I.e. the ones that were newly passing when the --state=failed command
was run. I left out "t3040-subprojects-basic.sh" and
"t4131-apply-fake-ancestor.sh" to to optimization-level related
differences similar to the ones noted in[1], except that these would
be something the current 'linux-leaks' job would run into.

1. https://lore.kernel.org/git/cover-v3-0.6-00000000000-20211022T175227Z-avarab@gmail.com/

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
36 files changed:
builtin/checkout.c
t/t0020-crlf.sh
t/t1005-read-tree-reset.sh
t/t1008-read-tree-overlay.sh
t/t1403-show-ref.sh
t/t1406-submodule-ref-store.sh
t/t1505-rev-parse-last.sh
t/t2007-checkout-symlink.sh
t/t2008-checkout-subdir.sh
t/t2009-checkout-statinfo.sh
t/t2010-checkout-ambiguous.sh
t/t2011-checkout-invalid-head.sh
t/t2014-checkout-switch.sh
t/t2017-checkout-orphan.sh
t/t2019-checkout-ambiguous-ref.sh
t/t2021-checkout-overwrite.sh
t/t2022-checkout-paths.sh
t/t2026-checkout-pathspec-file.sh
t/t2106-update-index-assume-unchanged.sh
t/t3040-subprojects-basic.sh
t/t3305-notes-fanout.sh
t/t3422-rebase-incompatible-options.sh
t/t4115-apply-symlink.sh
t/t4121-apply-diffs.sh
t/t4204-patch-id.sh
t/t5410-receive-pack-alternates.sh
t/t5609-clone-branch.sh
t/t6407-merge-binary.sh
t/t6414-merge-rename-nocruft.sh
t/t7113-post-index-change-hook.sh
t/t7509-commit-authorship.sh
t/t7815-grep-binary.sh
t/t9102-git-svn-deep-rmdir.sh
t/t9123-git-svn-rebuild-with-rewriteroot.sh
t/t9128-git-svn-cmd-branch.sh
t/t9167-git-svn-cmd-branch-subproject.sh