revisions API: have release_revisions() release "cmdline"

Extend the the release_revisions() function so that it frees the
"cmdline" in the "struct rev_info". This in combination with a
preceding change to free "commits" and "mailmap" means that we can
whitelist another test under "TEST_PASSES_SANITIZE_LEAK=true".

There was a proposal in [1] to do away with xstrdup()-ing this
add_rev_cmdline(), perhaps that would be worthwhile, but for now let's
just free() it.

We could also make that a "char *" in "struct rev_cmdline_entry"
itself, but since we own it let's expose it as a constant to outside
callers. I proposed that in [2] but have since changed my mind. See
14d30cdfc0 (ref-filter: fix memory leak in `free_array_item()`,
2019-07-10), c514c62a4f (checkout: fix leak of non-existent branch
names, 2020-08-14) and other log history hits for "free((char *)" for
prior art.

This includes the tests we had false-positive passes on before my
6798b08e84 (perl Git.pm: don't ignore signalled failure in
_cmd_close(), 2022-02-01), now they pass for real.

Since there are 66 tests matching t/t[0-9]*git-svn*.sh it's easier to
list those that don't pass than to touch most of those 66. So let's
introduce a "TEST_FAILS_SANITIZE_LEAK=true", which if set in the tests
won't cause lib-git-svn.sh to set "TEST_PASSES_SANITIZE_LEAK=true.

This change also marks all the tests that we removed
"TEST_FAILS_SANITIZE_LEAK=true" from in an earlier commit due to
removing the UNLEAK() from cmd_format_patch(), we can now assert that
its API use doesn't leak any "struct rev_info" memory.

This change also made commit "t5503-tagfollow.sh" pass on current
master, but that would regress when combined with
ps/fetch-atomic-fixup's de004e848a (t5503: simplify setup of test
which exercises failure of backfill, 2022-03-03) (through no fault of
that topic, that change started using "git clone" in the test, which
has an outstanding leak). Let's leave that test out for now to avoid
in-flight semantic conflicts.

1. https://lore.kernel.org/git/YUj%2FgFRh6pwrZalY@carlos-mbp.lan/
2. https://lore.kernel.org/git/87o88obkb1.fsf@evledraar.gmail.com/

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Ævar Arnfjörð Bjarmason 2022-04-13 22:01:47 +02:00 committed by Junio C Hamano
parent a52f07afcb
commit 7a98d9ab00
36 changed files with 58 additions and 0 deletions

View File

@ -2926,6 +2926,15 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
return left; return left;
} }
static void release_revisions_cmdline(struct rev_cmdline_info *cmdline)
{
unsigned int i;
for (i = 0; i < cmdline->nr; i++)
free((char *)cmdline->rev[i].name);
free(cmdline->rev);
}
static void release_revisions_mailmap(struct string_list *mailmap) static void release_revisions_mailmap(struct string_list *mailmap)
{ {
if (!mailmap) if (!mailmap)
@ -2938,6 +2947,7 @@ void release_revisions(struct rev_info *revs)
{ {
free_commit_list(revs->commits); free_commit_list(revs->commits);
object_array_clear(&revs->pending); object_array_clear(&revs->pending);
release_revisions_cmdline(&revs->cmdline);
release_revisions_mailmap(revs->mailmap); release_revisions_mailmap(revs->mailmap);
} }

View File

@ -1,3 +1,7 @@
if test -z "$TEST_FAILS_SANITIZE_LEAK"
then
TEST_PASSES_SANITIZE_LEAK=true
fi
. ./test-lib.sh . ./test-lib.sh
if test -n "$NO_SVN_TESTS" if test -n "$NO_SVN_TESTS"

View File

@ -5,6 +5,7 @@
test_description='Test revision walking api' test_description='Test revision walking api'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
cat >run_twice_expected <<-EOF cat >run_twice_expected <<-EOF

View File

@ -1,6 +1,8 @@
#!/bin/sh #!/bin/sh
test_description='various @{whatever} syntax tests' test_description='various @{whatever} syntax tests'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'setup' ' test_expect_success 'setup' '

View File

@ -1,6 +1,7 @@
#!/bin/sh #!/bin/sh
test_description='see how we handle various forms of corruption' test_description='see how we handle various forms of corruption'
. ./test-lib.sh . ./test-lib.sh
# convert "1234abcd" to ".git/objects/12/34abcd" # convert "1234abcd" to ".git/objects/12/34abcd"

View File

@ -5,6 +5,7 @@ test_description='Test commit notes organized in subtrees'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
number_of_commits=100 number_of_commits=100

View File

@ -2,6 +2,7 @@
test_description='Test that adding/removing many notes triggers automatic fanout restructuring' test_description='Test that adding/removing many notes triggers automatic fanout restructuring'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
path_has_fanout() { path_has_fanout() {

View File

@ -5,6 +5,7 @@ test_description='rebasing a commit with multi-line first paragraph.'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success setup ' test_expect_success setup '

View File

@ -2,6 +2,7 @@
test_description='difference in submodules' test_description='difference in submodules'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
. "$TEST_DIRECTORY"/lib-diff.sh . "$TEST_DIRECTORY"/lib-diff.sh

View File

@ -2,6 +2,7 @@
test_description='apply same filename' test_description='apply same filename'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'setup' ' test_expect_success 'setup' '

View File

@ -2,6 +2,7 @@
test_description='git log with invalid commit headers' test_description='git log with invalid commit headers'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'setup' ' test_expect_success 'setup' '

View File

@ -14,6 +14,7 @@ export GIT_TEST_PROTOCOL_VERSION
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
build_script () { build_script () {

View File

@ -8,6 +8,7 @@ test_description='fetch exit status test'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success setup ' test_expect_success setup '

View File

@ -4,6 +4,7 @@
# #
test_description='Tests git rev-list --bisect functionality' test_description='Tests git rev-list --bisect functionality'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
. "$TEST_DIRECTORY"/lib-t6000.sh # t6xxx specific functions . "$TEST_DIRECTORY"/lib-t6000.sh # t6xxx specific functions

View File

@ -5,6 +5,7 @@
test_description='Tests git rev-list --topo-order functionality' test_description='Tests git rev-list --topo-order functionality'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
. "$TEST_DIRECTORY"/lib-t6000.sh # t6xxx specific functions . "$TEST_DIRECTORY"/lib-t6000.sh # t6xxx specific functions

View File

@ -2,6 +2,7 @@
test_description='git rev-list --max-count and --skip test' test_description='git rev-list --max-count and --skip test'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'setup' ' test_expect_success 'setup' '

View File

@ -5,6 +5,7 @@ test_description='rev-list/rev-parse --glob'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
commit () { commit () {

View File

@ -2,6 +2,7 @@
test_description='rev-list testing in-commit-order' test_description='rev-list testing in-commit-order'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'setup a commit history with trees, blobs' ' test_expect_success 'setup a commit history with trees, blobs' '

View File

@ -8,6 +8,7 @@ test_description='git svn basic tests'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh
prepare_utf8_locale prepare_utf8_locale

View File

@ -4,6 +4,8 @@
# #
test_description='git svn property tests' test_description='git svn property tests'
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh
mkdir import mkdir import

View File

@ -4,6 +4,8 @@
# #
test_description='git svn fetching' test_description='git svn fetching'
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh
test_expect_success 'initialize repo' ' test_expect_success 'initialize repo' '

View File

@ -2,6 +2,8 @@
# #
# Copyright (c) 2006 Eric Wong # Copyright (c) 2006 Eric Wong
test_description='git svn commit-diff clobber' test_description='git svn commit-diff clobber'
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh
test_expect_success 'initialize repo' ' test_expect_success 'initialize repo' '

View File

@ -5,6 +5,7 @@
test_description='git svn dcommit can commit renames of files with ugly names' test_description='git svn dcommit can commit renames of files with ugly names'
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh
test_expect_success 'load repository with strange names' ' test_expect_success 'load repository with strange names' '

View File

@ -4,6 +4,8 @@
# #
test_description='git svn log tests' test_description='git svn log tests'
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh
test_expect_success 'setup repository and import' ' test_expect_success 'setup repository and import' '

View File

@ -1,6 +1,8 @@
#!/bin/sh #!/bin/sh
test_description='git svn authorship' test_description='git svn authorship'
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh
test_expect_success 'setup svn repository' ' test_expect_success 'setup svn repository' '

View File

@ -4,6 +4,8 @@
# #
test_description='git svn partial-rebuild tests' test_description='git svn partial-rebuild tests'
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh
test_expect_success 'initialize svnrepo' ' test_expect_success 'initialize svnrepo' '

View File

@ -4,6 +4,7 @@
test_description='git svn honors i18n.commitEncoding in config' test_description='git svn honors i18n.commitEncoding in config'
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh
compare_git_head_with () { compare_git_head_with () {

View File

@ -2,6 +2,7 @@
test_description='test that git handles an svn repository with empty symlinks' test_description='test that git handles an svn repository with empty symlinks'
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh
test_expect_success 'load svn dumpfile' ' test_expect_success 'load svn dumpfile' '
svnadmin load "$rawsvnrepo" <<EOF svnadmin load "$rawsvnrepo" <<EOF

View File

@ -4,6 +4,7 @@
test_description='git svn refuses to dcommit non-UTF8 messages' test_description='git svn refuses to dcommit non-UTF8 messages'
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh
# ISO-2022-JP can pass for valid UTF-8, so skipping that in this test # ISO-2022-JP can pass for valid UTF-8, so skipping that in this test

View File

@ -3,6 +3,8 @@
# Copyright (c) 2009 Eric Wong # Copyright (c) 2009 Eric Wong
test_description='git svn creates empty directories' test_description='git svn creates empty directories'
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh
test_expect_success 'initialize repo' ' test_expect_success 'initialize repo' '

View File

@ -5,6 +5,7 @@
test_description='git svn propset tests' test_description='git svn propset tests'
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh
test_expect_success 'setup propset via import' ' test_expect_success 'setup propset via import' '

View File

@ -5,6 +5,7 @@
test_description='git-svn svn mergeinfo properties' test_description='git-svn svn mergeinfo properties'
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh
test_expect_success 'load svn dump' " test_expect_success 'load svn dump' "

View File

@ -9,6 +9,7 @@ This test uses git to clone a Subversion repository that contains empty
directories, and checks that corresponding directories are created in the directories, and checks that corresponding directories are created in the
local Git repository with placeholder files.' local Git repository with placeholder files.'
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh
GIT_REPO=git-svn-repo GIT_REPO=git-svn-repo

View File

@ -3,6 +3,8 @@
# Copyright (c) 2011 Frédéric Heitzmann # Copyright (c) 2011 Frédéric Heitzmann
test_description='git svn dcommit --interactive series' test_description='git svn dcommit --interactive series'
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh
test_expect_success 'initialize repo' ' test_expect_success 'initialize repo' '

View File

@ -4,6 +4,8 @@
# #
test_description='concurrent git svn dcommit' test_description='concurrent git svn dcommit'
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh

View File

@ -13,6 +13,7 @@ code and message.'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./lib-gitweb.sh . ./lib-gitweb.sh
# #