{"thread":{"id":"58093","subject":"[PATCH 3/9] test-tool {dump,scrap}-cache-tree: fix memory leaks","startedAt":"2022-06-30T23:47:29Z","lastAt":"2022-07-01T20:43:18Z","messageCount":26,"participants":["Ævar Arnfjörð Bjarmason","Junio C Hamano","Eric Sunshine"],"isPatch":true,"patchVersion":1,"patchTotal":9},"messages":[{"id":"458299","messageId":"patch-3.9-7a0064860ad-20220630T180129Z-avarab@gmail.com","threadId":"58093","inReplyTo":"cover-0.9-00000000000-20220630T180129Z-avarab@gmail.com","subject":"[PATCH 3/9] test-tool {dump,scrap}-cache-tree: fix memory leaks","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-06-30T23:47:03Z","receivedAt":"2022-06-30T23:47:29Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Fix memory leaks in two test-tools used by t0090-cache-tree.sh. As a\nresult we can mark the test as passing with SANITIZE=leak using\n\"TEST_PASSES_SANITIZE_LEAK=true\".\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n t/helper/test-dump-cache-tree.c  | 7 ++++++-\n t/helper/test-scrap-cache-tree.c | 1 +\n t/t0090-cache-tree.sh            | 2 ++\n 3 files changed, 9 insertions(+), 1 deletion(-)\n\ndiff --git a/t/helper/test-dump-cache-tree.c b/t/helper/test-dump-cache-tree.c\nindex 6a3f88f5f5d..0d6d7f1ecbf 100644\n--- a/t/helper/test-dump-cache-tree.c\n+++ b/t/helper/test-dump-cache-tree.c\n@@ -59,11 +59,16 @@ int cmd__dump_cache_tree(int ac, const char **av)\n {\n \tstruct index_state istate;\n \tstruct cache_tree *another = cache_tree();\n+\tint ret;\n+\n \tsetup_git_directory();\n \tif (read_cache() < 0)\n \t\tdie(\"unable to read index file\");\n \tistate = the_index;\n \tistate.cache_tree = another;\n \tcache_tree_update(&istate, WRITE_TREE_DRY_RUN);\n-\treturn dump_cache_tree(active_cache_tree, another, \"\");\n+\tret = dump_cache_tree(active_cache_tree, another, \"\");\n+\tcache_tree_free(&another);\n+\n+\treturn ret;\n }\ndiff --git a/t/helper/test-scrap-cache-tree.c b/t/helper/test-scrap-cache-tree.c\nindex 393f1604ff9..026c802479d 100644\n--- a/t/helper/test-scrap-cache-tree.c\n+++ b/t/helper/test-scrap-cache-tree.c\n@@ -12,6 +12,7 @@ int cmd__scrap_cache_tree(int ac, const char **av)\n \thold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);\n \tif (read_cache() < 0)\n \t\tdie(\"unable to read index file\");\n+\tcache_tree_free(&active_cache_tree);\n \tactive_cache_tree = NULL;\n \tif (write_locked_index(&the_index, &index_lock, COMMIT_LOCK))\n \t\tdie(\"unable to write index file\");\ndiff --git a/t/t0090-cache-tree.sh b/t/t0090-cache-tree.sh\nindex 90675726484..d8e2fc42e15 100755\n--- a/t/t0090-cache-tree.sh\n+++ b/t/t0090-cache-tree.sh\n@@ -5,6 +5,8 @@ test_description=\"Test whether cache-tree is properly updated\n Tests whether various commands properly update and/or rewrite the\n cache-tree extension.\n \"\n+\n+TEST_PASSES_SANITIZE_LEAK=true\n  . ./test-lib.sh\n \n cmp_cache_tree () {\n-- \n2.37.0.874.g7d3439f13c4\n\n"},{"id":"458300","messageId":"patch-2.9-06b2dcf4f12-20220630T180129Z-avarab@gmail.com","threadId":"58093","inReplyTo":"cover-0.9-00000000000-20220630T180129Z-avarab@gmail.com","subject":"[PATCH 2/9] test-tool path-utils: fix a memory leak","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-06-30T23:47:02Z","receivedAt":"2022-06-30T23:47:31Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Fix a memory leak in \"test-tool path-utils\", as a result we can mark\nthe corresponding test as passing with SANITIZE=leak using\n\"TEST_PASSES_SANITIZE_LEAK=true\".\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n t/helper/test-path-utils.c | 10 ++++++++--\n t/t0060-path-utils.sh      |  1 +\n 2 files changed, 9 insertions(+), 2 deletions(-)\n\ndiff --git a/t/helper/test-path-utils.c b/t/helper/test-path-utils.c\nindex 229ed416b0e..380437cfe02 100644\n--- a/t/helper/test-path-utils.c\n+++ b/t/helper/test-path-utils.c\n@@ -294,11 +294,13 @@ static int protect_ntfs_hfs_benchmark(int argc, const char **argv)\n int cmd__path_utils(int argc, const char **argv)\n {\n \tif (argc == 3 && !strcmp(argv[1], \"normalize_path_copy\")) {\n-\t\tchar *buf = xmallocz(strlen(argv[2]));\n+\t\tchar *to_free = NULL;\n+\t\tchar *buf = to_free = xmallocz(strlen(argv[2]));\n \t\tint rv = normalize_path_copy(buf, argv[2]);\n \t\tif (rv)\n \t\t\tbuf = \"++failed++\";\n \t\tputs(buf);\n+\t\tfree(to_free);\n \t\treturn 0;\n \t}\n \n@@ -356,7 +358,10 @@ int cmd__path_utils(int argc, const char **argv)\n \t\tint nongit_ok;\n \t\tsetup_git_directory_gently(&nongit_ok);\n \t\twhile (argc > 3) {\n-\t\t\tputs(prefix_path(prefix, prefix_len, argv[3]));\n+\t\t\tchar *pfx = prefix_path(prefix, prefix_len, argv[3]);\n+\n+\t\t\tputs(pfx);\n+\t\t\tfree(pfx);\n \t\t\targc--;\n \t\t\targv++;\n \t\t}\n@@ -366,6 +371,7 @@ int cmd__path_utils(int argc, const char **argv)\n \tif (argc == 4 && !strcmp(argv[1], \"strip_path_suffix\")) {\n \t\tchar *prefix = strip_path_suffix(argv[2], argv[3]);\n \t\tprintf(\"%s\\n\", prefix ? prefix : \"(null)\");\n+\t\tfree(prefix);\n \t\treturn 0;\n \t}\n \ndiff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh\nindex aa35350b6f3..1f2007e62b7 100755\n--- a/t/t0060-path-utils.sh\n+++ b/t/t0060-path-utils.sh\n@@ -5,6 +5,7 @@\n \n test_description='Test various path utilities'\n \n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n norm_path() {\n-- \n2.37.0.874.g7d3439f13c4\n\n"},{"id":"458301","messageId":"patch-1.9-4406fedba80-20220630T180129Z-avarab@gmail.com","threadId":"58093","inReplyTo":"cover-0.9-00000000000-20220630T180129Z-avarab@gmail.com","subject":"[PATCH 1/9] test-tool test-hash: fix a memory leak","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-06-30T23:47:01Z","receivedAt":"2022-06-30T23:47:32Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Fix a memory leak in \"test-tool test-hash\" which has been there since\nb57cbbf8a86 (test-sha1: test hashing large buffer, 2006-06-24), as a\nresult we can mark more tests as passing with SANITIZE=leak using\n\"TEST_PASSES_SANITIZE_LEAK=true\".\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n t/helper/test-hash.c              | 1 +\n t/t0015-hash.sh                   | 3 ++-\n t/t5308-pack-detect-duplicates.sh | 2 ++\n t/t5309-pack-delta-cycles.sh      | 2 ++\n t/t5321-pack-large-objects.sh     | 2 ++\n 5 files changed, 9 insertions(+), 1 deletion(-)\n\ndiff --git a/t/helper/test-hash.c b/t/helper/test-hash.c\nindex 261c545b9d1..5860dab0ffa 100644\n--- a/t/helper/test-hash.c\n+++ b/t/helper/test-hash.c\n@@ -54,5 +54,6 @@ int cmd_hash_impl(int ac, const char **av, int algo)\n \t\tfwrite(hash, 1, algop->rawsz, stdout);\n \telse\n \t\tputs(hash_to_hex_algop(hash, algop));\n+\tfree(buffer);\n \treturn 0;\n }\ndiff --git a/t/t0015-hash.sh b/t/t0015-hash.sh\nindex 086822fc45b..0a087a1983d 100755\n--- a/t/t0015-hash.sh\n+++ b/t/t0015-hash.sh\n@@ -1,8 +1,9 @@\n #!/bin/sh\n \n test_description='test basic hash implementation'\n-. ./test-lib.sh\n \n+TEST_PASSES_SANITIZE_LEAK=true\n+. ./test-lib.sh\n \n test_expect_success 'test basic SHA-1 hash values' '\n \ttest-tool sha1 </dev/null >actual &&\ndiff --git a/t/t5308-pack-detect-duplicates.sh b/t/t5308-pack-detect-duplicates.sh\nindex 693b2411c89..655cafa0541 100755\n--- a/t/t5308-pack-detect-duplicates.sh\n+++ b/t/t5308-pack-detect-duplicates.sh\n@@ -1,6 +1,8 @@\n #!/bin/sh\n \n test_description='handling of duplicate objects in incoming packfiles'\n+\n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-pack.sh\n \ndiff --git a/t/t5309-pack-delta-cycles.sh b/t/t5309-pack-delta-cycles.sh\nindex 55b787630fc..4e910c5b9d2 100755\n--- a/t/t5309-pack-delta-cycles.sh\n+++ b/t/t5309-pack-delta-cycles.sh\n@@ -1,6 +1,8 @@\n #!/bin/sh\n \n test_description='test index-pack handling of delta cycles in packfiles'\n+\n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-pack.sh\n \ndiff --git a/t/t5321-pack-large-objects.sh b/t/t5321-pack-large-objects.sh\nindex 8a56d98a0e8..70770fe274d 100755\n--- a/t/t5321-pack-large-objects.sh\n+++ b/t/t5321-pack-large-objects.sh\n@@ -6,6 +6,8 @@\n test_description='git pack-object with \"large\" deltas\n \n '\n+\n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-pack.sh\n \n-- \n2.37.0.874.g7d3439f13c4\n\n"},{"id":"458302","messageId":"cover-0.9-00000000000-20220630T180129Z-avarab@gmail.com","threadId":"58093","inReplyTo":null,"subject":"[PATCH 0/9] test-tool: fix memory leaks","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-06-30T23:47:00Z","receivedAt":"2022-06-30T23:47:34Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"This is a series of trivial leak-fixes which allows us to mark various\ntests as entirely passing under SANITIZE=leak, the reasn they weren't\npassing before was because we'd spot memory leaks in test-tool, rather\nthan git itself.\n\nThis is a sibling series to my just-submitted series for fixing memory\nleaks in built-ins[1], but the the two do not textually or\nsemantically conflict.\n\nThere are still a few other test-tool memory leaks, but these are the\nones I had patches ready for, having focused on trying to get t00*.sh\npassing first, and then picking some low-hanging fruit after that.\n\nPassing CI for this series can be found at [2].\n\n1. https://lore.kernel.org/git/cover-00.11-00000000000-20220630T175714Z-avarab@gmail.com/\n2. https://github.com/avar/git/tree/avar/test-tool-memory-leaks\n\nÆvar Arnfjörð Bjarmason (9):\n  test-tool test-hash: fix a memory leak\n  test-tool path-utils: fix a memory leak\n  test-tool {dump,scrap}-cache-tree: fix memory leaks\n  test-tool urlmatch-normalization: fix a memory leak\n  test-tool regex: call regfree(), fix memory leaks\n  test-tool json-writer: fix memory leaks\n  test-tool bloom: fix a memory leak\n  test-tool ref-store: fix a memory leak\n  test-tool delta: fix a memory leak\n\n t/helper/test-bloom.c                  |  2 ++\n t/helper/test-delta.c                  | 21 +++++++++-----\n t/helper/test-dump-cache-tree.c        |  7 ++++-\n t/helper/test-hash.c                   |  1 +\n t/helper/test-json-writer.c            | 16 ++++++++---\n t/helper/test-path-utils.c             | 10 +++++--\n t/helper/test-ref-store.c              |  1 +\n t/helper/test-regex.c                  | 40 ++++++++++++++++----------\n t/helper/test-scrap-cache-tree.c       |  1 +\n t/helper/test-urlmatch-normalization.c | 11 +++++--\n t/t0015-hash.sh                        |  3 +-\n t/t0019-json-writer.sh                 |  2 ++\n t/t0060-path-utils.sh                  |  1 +\n t/t0090-cache-tree.sh                  |  2 ++\n t/t0095-bloom.sh                       |  2 +-\n t/t0110-urlmatch-normalization.sh      |  2 ++\n t/t5303-pack-corruption-resilience.sh  |  2 ++\n t/t5308-pack-detect-duplicates.sh      |  2 ++\n t/t5309-pack-delta-cycles.sh           |  2 ++\n t/t5321-pack-large-objects.sh          |  2 ++\n t/t7812-grep-icase-non-ascii.sh        |  1 +\n 21 files changed, 97 insertions(+), 34 deletions(-)\n\n-- \n2.37.0.874.g7d3439f13c4\n\n"},{"id":"458303","messageId":"patch-8.9-6becefc754e-20220630T180129Z-avarab@gmail.com","threadId":"58093","inReplyTo":"cover-0.9-00000000000-20220630T180129Z-avarab@gmail.com","subject":"[PATCH 8/9] test-tool ref-store: fix a memory leak","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-06-30T23:47:08Z","receivedAt":"2022-06-30T23:47:36Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Fix a memory leak introduced in fa099d23227 (worktree.c: kill\nparse_ref() in favor of refs_resolve_ref_unsafe(), 2017-04-24), as a\nresult we can mark another test as passing with SANITIZE=leak using\n\"TEST_PASSES_SANITIZE_LEAK=true\".\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n t/helper/test-ref-store.c | 1 +\n 1 file changed, 1 insertion(+)\n\ndiff --git a/t/helper/test-ref-store.c b/t/helper/test-ref-store.c\nindex 9646d85fc84..4d18bfb1ca5 100644\n--- a/t/helper/test-ref-store.c\n+++ b/t/helper/test-ref-store.c\n@@ -96,6 +96,7 @@ static const char **get_store(const char **argv, struct ref_store **refs)\n \t\t\tdie(\"no such worktree: %s\", gitdir);\n \n \t\t*refs = get_worktree_ref_store(*p);\n+\t\tfree_worktrees(worktrees);\n \t} else\n \t\tdie(\"unknown backend %s\", argv[0]);\n \n-- \n2.37.0.874.g7d3439f13c4\n\n"},{"id":"458304","messageId":"patch-4.9-a450aff8904-20220630T180129Z-avarab@gmail.com","threadId":"58093","inReplyTo":"cover-0.9-00000000000-20220630T180129Z-avarab@gmail.com","subject":"[PATCH 4/9] test-tool urlmatch-normalization: fix a memory leak","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-06-30T23:47:04Z","receivedAt":"2022-06-30T23:47:38Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Fix a memory leak in \"test-tool urlmatch-normalization\", as a result\nwe can mark the corresponding test as passing with SANITIZE=leak using\n\"TEST_PASSES_SANITIZE_LEAK=true\".\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n t/helper/test-urlmatch-normalization.c | 11 ++++++++---\n t/t0110-urlmatch-normalization.sh      |  2 ++\n 2 files changed, 10 insertions(+), 3 deletions(-)\n\ndiff --git a/t/helper/test-urlmatch-normalization.c b/t/helper/test-urlmatch-normalization.c\nindex 8f4d67e6469..86edd454f5c 100644\n--- a/t/helper/test-urlmatch-normalization.c\n+++ b/t/helper/test-urlmatch-normalization.c\n@@ -5,8 +5,9 @@\n int cmd__urlmatch_normalization(int argc, const char **argv)\n {\n \tconst char usage[] = \"test-tool urlmatch-normalization [-p | -l] <url1> | <url1> <url2>\";\n-\tchar *url1, *url2;\n+\tchar *url1 = NULL, *url2 = NULL;\n \tint opt_p = 0, opt_l = 0;\n+\tint ret = 0;\n \n \t/*\n \t * For one url, succeed if url_normalize succeeds on it, fail otherwise.\n@@ -39,7 +40,7 @@ int cmd__urlmatch_normalization(int argc, const char **argv)\n \t\t\tprintf(\"%s\\n\", url1);\n \t\tif (opt_l)\n \t\t\tprintf(\"%u\\n\", (unsigned)info.url_len);\n-\t\treturn 0;\n+\t\tgoto cleanup;\n \t}\n \n \tif (opt_p || opt_l)\n@@ -47,5 +48,9 @@ int cmd__urlmatch_normalization(int argc, const char **argv)\n \n \turl1 = url_normalize(argv[1], NULL);\n \turl2 = url_normalize(argv[2], NULL);\n-\treturn (url1 && url2 && !strcmp(url1, url2)) ? 0 : 1;\n+\tret = (url1 && url2 && !strcmp(url1, url2)) ? 0 : 1;\n+cleanup:\n+\tfree(url1);\n+\tfree(url2);\n+\treturn ret;\n }\ndiff --git a/t/t0110-urlmatch-normalization.sh b/t/t0110-urlmatch-normalization.sh\nindex 4dc9fecf724..12d817fbd34 100755\n--- a/t/t0110-urlmatch-normalization.sh\n+++ b/t/t0110-urlmatch-normalization.sh\n@@ -1,6 +1,8 @@\n #!/bin/sh\n \n test_description='urlmatch URL normalization'\n+\n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # The base name of the test url files\n-- \n2.37.0.874.g7d3439f13c4\n\n"},{"id":"458305","messageId":"patch-5.9-fe2a8d898f6-20220630T180129Z-avarab@gmail.com","threadId":"58093","inReplyTo":"cover-0.9-00000000000-20220630T180129Z-avarab@gmail.com","subject":"[PATCH 5/9] test-tool regex: call regfree(), fix memory leaks","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-06-30T23:47:05Z","receivedAt":"2022-06-30T23:47:39Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Fix memory leaks in \"test-tool regex\" which have been there since\nc91841594c2 (test-regex: Add a test to check for a bug in the regex\nroutines, 2012-09-01), as a result we can mark a test as passing with\nSANITIZE=leak using \"TEST_PASSES_SANITIZE_LEAK=true\".\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n t/helper/test-regex.c           | 40 ++++++++++++++++++++-------------\n t/t7812-grep-icase-non-ascii.sh |  1 +\n 2 files changed, 26 insertions(+), 15 deletions(-)\n\ndiff --git a/t/helper/test-regex.c b/t/helper/test-regex.c\nindex d6f28ca8d14..a37d1f7a546 100644\n--- a/t/helper/test-regex.c\n+++ b/t/helper/test-regex.c\n@@ -24,27 +24,35 @@ static int test_regex_bug(void)\n \tchar *str = \"={}\\nfred\";\n \tregex_t r;\n \tregmatch_t m[1];\n+\tint err = 0;\n \n \tif (regcomp(&r, pat, REG_EXTENDED | REG_NEWLINE))\n \t\tdie(\"failed regcomp() for pattern '%s'\", pat);\n-\tif (regexec(&r, str, 1, m, 0))\n-\t\tdie(\"no match of pattern '%s' to string '%s'\", pat, str);\n+\tif (regexec(&r, str, 1, m, 0)) {\n+\t\terr = error(\"no match of pattern '%s' to string '%s'\", pat, str);\n+\t\tgoto cleanup;\n+\t}\n \n \t/* http://sourceware.org/bugzilla/show_bug.cgi?id=3957  */\n-\tif (m[0].rm_so == 3) /* matches '\\n' when it should not */\n-\t\tdie(\"regex bug confirmed: re-build git with NO_REGEX=1\");\n+\tif (m[0].rm_so == 3) { /* matches '\\n' when it should not */\n+\t\terr = error(\"regex bug confirmed: re-build git with NO_REGEX=1\");\n+\t\tgoto cleanup;\n+\t}\n \n-\treturn 0;\n+cleanup:\n+\tregfree(&r);\n+\treturn err < 0 ? 1 : 0;\n }\n \n int cmd__regex(int argc, const char **argv)\n {\n \tconst char *pat;\n \tconst char *str;\n-\tint ret, silent = 0, flags = 0;\n+\tint silent = 0, flags = 0;\n \tregex_t r;\n \tregmatch_t m[1];\n \tchar errbuf[64];\n+\tint ret = 0;\n \n \targv++;\n \targc--;\n@@ -85,27 +93,29 @@ int cmd__regex(int argc, const char **argv)\n \t}\n \tgit_setup_gettext();\n \n-\tret = regcomp(&r, pat, flags);\n-\tif (ret) {\n+\tif (regcomp(&r, pat, flags)) {\n \t\tif (silent)\n-\t\t\treturn ret;\n+\t\t\treturn 1;\n \n \t\tregerror(ret, &r, errbuf, sizeof(errbuf));\n \t\tdie(\"failed regcomp() for pattern '%s' (%s)\", pat, errbuf);\n \t}\n \tif (!str)\n-\t\treturn 0;\n+\t\tgoto cleanup;\n \n-\tret = regexec(&r, str, 1, m, 0);\n-\tif (ret) {\n+\tif (regexec(&r, str, 1, m, 0)) {\n+\t\tret = 1;\n \t\tif (silent || ret == REG_NOMATCH)\n-\t\t\treturn ret;\n+\t\t\tgoto cleanup;\n \n \t\tregerror(ret, &r, errbuf, sizeof(errbuf));\n-\t\tdie(\"failed regexec() for subject '%s' (%s)\", str, errbuf);\n+\t\terror(\"failed regexec() for subject '%s' (%s)\", str, errbuf);\n+\t\tgoto cleanup;\n \t}\n \n-\treturn 0;\n+cleanup:\n+\tregfree(&r);\n+\treturn ret;\n usage:\n \tusage(\"\\ttest-tool regex --bug\\n\"\n \t      \"\\ttest-tool regex [--silent] <pattern>\\n\"\ndiff --git a/t/t7812-grep-icase-non-ascii.sh b/t/t7812-grep-icase-non-ascii.sh\nindex ac7be547145..31c66b63c2c 100755\n--- a/t/t7812-grep-icase-non-ascii.sh\n+++ b/t/t7812-grep-icase-non-ascii.sh\n@@ -2,6 +2,7 @@\n \n test_description='grep icase on non-English locales'\n \n+TEST_PASSES_SANITIZE_LEAK=true\n . ./lib-gettext.sh\n \n doalarm () {\n-- \n2.37.0.874.g7d3439f13c4\n\n"},{"id":"458306","messageId":"patch-7.9-bdb467d1414-20220630T180129Z-avarab@gmail.com","threadId":"58093","inReplyTo":"cover-0.9-00000000000-20220630T180129Z-avarab@gmail.com","subject":"[PATCH 7/9] test-tool bloom: fix a memory leak","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-06-30T23:47:07Z","receivedAt":"2022-06-30T23:47:43Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Fix memory leaks introduced with these tests in f1294eaf7fb (bloom.c:\nintroduce core Bloom filter constructs, 2020-03-30), as a result we\ncan mark almost the entirety of t0095-bloom.sh as passing with\nSANITIZE=leak using \"TEST_PASSES_SANITIZE_LEAK=true\", there's still an\nunrelated memory leak in \"git commit\" in one of the tests, let's skip\nthat one under SANITIZE_LEAK for now.\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n t/helper/test-bloom.c | 2 ++\n t/t0095-bloom.sh      | 2 +-\n 2 files changed, 3 insertions(+), 1 deletion(-)\n\ndiff --git a/t/helper/test-bloom.c b/t/helper/test-bloom.c\nindex ad3ef1cd77a..6c900ca6684 100644\n--- a/t/helper/test-bloom.c\n+++ b/t/helper/test-bloom.c\n@@ -16,6 +16,7 @@ static void add_string_to_filter(const char *data, struct bloom_filter *filter)\n \t\t}\n \t\tprintf(\"\\n\");\n \t\tadd_key_to_filter(&key, filter, &settings);\n+\t\tclear_bloom_key(&key);\n }\n \n static void print_bloom_filter(struct bloom_filter *filter) {\n@@ -80,6 +81,7 @@ int cmd__bloom(int argc, const char **argv)\n \t\t}\n \n \t\tprint_bloom_filter(&filter);\n+\t\tfree(filter.data);\n \t}\n \n \tif (!strcmp(argv[1], \"get_filter_for_commit\")) {\ndiff --git a/t/t0095-bloom.sh b/t/t0095-bloom.sh\nindex 5945973552a..daeb4a5e3e7 100755\n--- a/t/t0095-bloom.sh\n+++ b/t/t0095-bloom.sh\n@@ -67,7 +67,7 @@ test_expect_success 'compute bloom key for test string 2' '\n \ttest_cmp expect actual\n '\n \n-test_expect_success 'get bloom filters for commit with no changes' '\n+test_expect_success !SANITIZE_LEAK 'get bloom filters for commit with no changes' '\n \tgit init &&\n \tgit commit --allow-empty -m \"c0\" &&\n \tcat >expect <<-\\EOF &&\n-- \n2.37.0.874.g7d3439f13c4\n\n"},{"id":"458307","messageId":"patch-9.9-5341b413bda-20220630T180129Z-avarab@gmail.com","threadId":"58093","inReplyTo":"cover-0.9-00000000000-20220630T180129Z-avarab@gmail.com","subject":"[PATCH 9/9] test-tool delta: fix a memory leak","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-06-30T23:47:09Z","receivedAt":"2022-06-30T23:47:44Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Fix a memory leak introduced in a310d434946 ([PATCH] Deltification\nlibrary work by Nicolas Pitre., 2005-05-19), as a result we can mark\nanother test as passing with SANITIZE=leak using\n\"TEST_PASSES_SANITIZE_LEAK=true\".\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n t/helper/test-delta.c                 | 21 ++++++++++++++-------\n t/t5303-pack-corruption-resilience.sh |  2 ++\n 2 files changed, 16 insertions(+), 7 deletions(-)\n\ndiff --git a/t/helper/test-delta.c b/t/helper/test-delta.c\nindex e749a49c88e..b15481ea596 100644\n--- a/t/helper/test-delta.c\n+++ b/t/helper/test-delta.c\n@@ -20,8 +20,9 @@ int cmd__delta(int argc, const char **argv)\n {\n \tint fd;\n \tstruct stat st;\n-\tvoid *from_buf, *data_buf, *out_buf;\n+\tvoid *from_buf = NULL, *data_buf = NULL, *out_buf = NULL;\n \tunsigned long from_size, data_size, out_size;\n+\tint ret = 1;\n \n \tif (argc != 5 || (strcmp(argv[1], \"-d\") && strcmp(argv[1], \"-p\"))) {\n \t\tfprintf(stderr, \"usage: %s\\n\", usage_str);\n@@ -38,21 +39,21 @@ int cmd__delta(int argc, const char **argv)\n \tif (read_in_full(fd, from_buf, from_size) < 0) {\n \t\tperror(argv[2]);\n \t\tclose(fd);\n-\t\treturn 1;\n+\t\tgoto cleanup;\n \t}\n \tclose(fd);\n \n \tfd = open(argv[3], O_RDONLY);\n \tif (fd < 0 || fstat(fd, &st)) {\n \t\tperror(argv[3]);\n-\t\treturn 1;\n+\t\tgoto cleanup;\n \t}\n \tdata_size = st.st_size;\n \tdata_buf = xmalloc(data_size);\n \tif (read_in_full(fd, data_buf, data_size) < 0) {\n \t\tperror(argv[3]);\n \t\tclose(fd);\n-\t\treturn 1;\n+\t\tgoto cleanup;\n \t}\n \tclose(fd);\n \n@@ -66,14 +67,20 @@ int cmd__delta(int argc, const char **argv)\n \t\t\t\t      &out_size);\n \tif (!out_buf) {\n \t\tfprintf(stderr, \"delta operation failed (returned NULL)\\n\");\n-\t\treturn 1;\n+\t\tgoto cleanup;\n \t}\n \n \tfd = open (argv[4], O_WRONLY|O_CREAT|O_TRUNC, 0666);\n \tif (fd < 0 || write_in_full(fd, out_buf, out_size) < 0) {\n \t\tperror(argv[4]);\n-\t\treturn 1;\n+\t\tgoto cleanup;\n \t}\n \n-\treturn 0;\n+\tret = 0;\n+cleanup:\n+\tfree(from_buf);\n+\tfree(data_buf);\n+\tfree(out_buf);\n+\n+\treturn ret;\n }\ndiff --git a/t/t5303-pack-corruption-resilience.sh b/t/t5303-pack-corruption-resilience.sh\nindex 41e6dc4dcfc..2926e8dfc41 100755\n--- a/t/t5303-pack-corruption-resilience.sh\n+++ b/t/t5303-pack-corruption-resilience.sh\n@@ -4,6 +4,8 @@\n #\n \n test_description='resilience to pack corruptions with redundant objects'\n+\n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Note: the test objects are created with knowledge of their pack encoding\n-- \n2.37.0.874.g7d3439f13c4\n\n"},{"id":"458308","messageId":"patch-6.9-97448b9056e-20220630T180129Z-avarab@gmail.com","threadId":"58093","inReplyTo":"cover-0.9-00000000000-20220630T180129Z-avarab@gmail.com","subject":"[PATCH 6/9] test-tool json-writer: fix memory leaks","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-06-30T23:47:06Z","receivedAt":"2022-06-30T23:47:47Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Fix memory leaks introduced with these tests in\n75459410edd (json_writer: new routines to create JSON data,\n2018-07-13), as a result we can mark a test as passing with\nSANITIZE=leak using \"TEST_PASSES_SANITIZE_LEAK=true\".\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n t/helper/test-json-writer.c | 16 ++++++++++++----\n t/t0019-json-writer.sh      |  2 ++\n 2 files changed, 14 insertions(+), 4 deletions(-)\n\ndiff --git a/t/helper/test-json-writer.c b/t/helper/test-json-writer.c\nindex 37c452535f8..8c3edacc000 100644\n--- a/t/helper/test-json-writer.c\n+++ b/t/helper/test-json-writer.c\n@@ -181,12 +181,18 @@ static struct json_writer nest1 = JSON_WRITER_INIT;\n \n static void make_nest1(int pretty)\n {\n+\tmake_obj1(0);\n+\tmake_arr1(0);\n+\n \tjw_object_begin(&nest1, pretty);\n \t{\n \t\tjw_object_sub_jw(&nest1, \"obj1\", &obj1);\n \t\tjw_object_sub_jw(&nest1, \"arr1\", &arr1);\n \t}\n \tjw_end(&nest1);\n+\n+\tjw_release(&obj1);\n+\tjw_release(&arr1);\n }\n \n static char *expect_inline1 =\n@@ -313,6 +319,9 @@ static void make_mixed1(int pretty)\n \t\tjw_object_sub_jw(&mixed1, \"arr1\", &arr1);\n \t}\n \tjw_end(&mixed1);\n+\n+\tjw_release(&obj1);\n+\tjw_release(&arr1);\n }\n \n static void cmp(const char *test, const struct json_writer *jw, const char *exp)\n@@ -325,8 +334,8 @@ static void cmp(const char *test, const struct json_writer *jw, const char *exp)\n \texit(1);\n }\n \n-#define t(v) do { make_##v(0); cmp(#v, &v, expect_##v); } while (0)\n-#define p(v) do { make_##v(1); cmp(#v, &v, pretty_##v); } while (0)\n+#define t(v) do { make_##v(0); cmp(#v, &v, expect_##v); jw_release(&v); } while (0)\n+#define p(v) do { make_##v(1); cmp(#v, &v, pretty_##v); jw_release(&v); } while (0)\n \n /*\n  * Run some basic regression tests with some known patterns.\n@@ -381,7 +390,6 @@ static int unit_tests(void)\n \n \t/* mixed forms */\n \tt(mixed1);\n-\tjw_init(&mixed1);\n \tp(mixed1);\n \n \treturn 0;\n@@ -544,7 +552,7 @@ static int scripted(void)\n \n \tprintf(\"%s\\n\", jw.json.buf);\n \n-\tstrbuf_release(&jw.json);\n+\tjw_release(&jw);\n \treturn 0;\n }\n \ndiff --git a/t/t0019-json-writer.sh b/t/t0019-json-writer.sh\nindex 3b0c336b38e..19a730c29ed 100755\n--- a/t/t0019-json-writer.sh\n+++ b/t/t0019-json-writer.sh\n@@ -1,6 +1,8 @@\n #!/bin/sh\n \n test_description='test json-writer JSON generation'\n+\n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'unit test of json-writer routines' '\n-- \n2.37.0.874.g7d3439f13c4\n\n"},{"id":"458325","messageId":"xmqq8rpda850.fsf@gitster.g","threadId":"58093","inReplyTo":"patch-5.9-fe2a8d898f6-20220630T180129Z-avarab@gmail.com","subject":"Re: [PATCH 5/9] test-tool regex: call regfree(), fix memory leaks","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2022-07-01T02:17:47Z","receivedAt":"2022-07-01T02:17:54Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Ævar Arnfjörð Bjarmason  <avarab@gmail.com> writes:\n\n> diff --git a/t/helper/test-regex.c b/t/helper/test-regex.c\n> index d6f28ca8d14..a37d1f7a546 100644\n> --- a/t/helper/test-regex.c\n> +++ b/t/helper/test-regex.c\n> @@ -24,27 +24,35 @@ static int test_regex_bug(void)\n>  \tchar *str = \"={}\\nfred\";\n>  \tregex_t r;\n>  \tregmatch_t m[1];\n> +\tint err = 0;\n>  \n>  \tif (regcomp(&r, pat, REG_EXTENDED | REG_NEWLINE))\n>  \t\tdie(\"failed regcomp() for pattern '%s'\", pat);\n> -\tif (regexec(&r, str, 1, m, 0))\n> -\t\tdie(\"no match of pattern '%s' to string '%s'\", pat, str);\n> +\tif (regexec(&r, str, 1, m, 0)) {\n> +\t\terr = error(\"no match of pattern '%s' to string '%s'\", pat, str);\n> +\t\tgoto cleanup;\n> +\t}\n\nHmph.  Does it count as leaking to die() while r is still on the\nstack?  I do not mind cleaning everything up thoroughly, but I am\ncurious if this is really necessary.  Apparently it is, as can be\nseen in the patch to t/t7812-grep-icase-non-ascii.sh that allows\nus to say \"PASSES\" with this patch.\n\n> @@ -85,27 +93,29 @@ int cmd__regex(int argc, const char **argv)\n>  \t}\n>  \tgit_setup_gettext();\n>  \n> -\tret = regcomp(&r, pat, flags);\n> -\tif (ret) {\n> +\tif (regcomp(&r, pat, flags)) {\n>  \t\tif (silent)\n> -\t\t\treturn ret;\n> +\t\t\treturn 1;\n>  \n>  \t\tregerror(ret, &r, errbuf, sizeof(errbuf));\n>  \t\tdie(\"failed regcomp() for pattern '%s' (%s)\", pat, errbuf);\n>  \t}\n>  \tif (!str)\n> -\t\treturn 0;\n> +\t\tgoto cleanup;\n\nAhh, OK, this one does not bother with regfree() at all.  The\nchanges to the other one may be irrelevant but the changes to this\nfunction would be necessary to mark the test with \"PASSES\".\n\n> -\tret = regexec(&r, str, 1, m, 0);\n> -\tif (ret) {\n> +\tif (regexec(&r, str, 1, m, 0)) {\n> +\t\tret = 1;\n>  \t\tif (silent || ret == REG_NOMATCH)\n> -\t\t\treturn ret;\n> +\t\t\tgoto cleanup;\n>  \n>  \t\tregerror(ret, &r, errbuf, sizeof(errbuf));\n> -\t\tdie(\"failed regexec() for subject '%s' (%s)\", str, errbuf);\n> +\t\terror(\"failed regexec() for subject '%s' (%s)\", str, errbuf);\n> +\t\tgoto cleanup;\n>  \t}\n>  \n> -\treturn 0;\n> +cleanup:\n> +\tregfree(&r);\n> +\treturn ret;\n>  usage:\n>  \tusage(\"\\ttest-tool regex --bug\\n\"\n>  \t      \"\\ttest-tool regex [--silent] <pattern>\\n\"\n> diff --git a/t/t7812-grep-icase-non-ascii.sh b/t/t7812-grep-icase-non-ascii.sh\n> index ac7be547145..31c66b63c2c 100755\n> --- a/t/t7812-grep-icase-non-ascii.sh\n> +++ b/t/t7812-grep-icase-non-ascii.sh\n> @@ -2,6 +2,7 @@\n>  \n>  test_description='grep icase on non-English locales'\n>  \n> +TEST_PASSES_SANITIZE_LEAK=true\n>  . ./lib-gettext.sh\n>  \n>  doalarm () {\n"},{"id":"458334","messageId":"CAPig+cT5jETAi5extz2tHwSzp4a=b7qqaK0S=mcjQr1m_1jAQQ@mail.gmail.com","threadId":"58093","inReplyTo":"patch-2.9-06b2dcf4f12-20220630T180129Z-avarab@gmail.com","subject":"Re: [PATCH 2/9] test-tool path-utils: fix a memory leak","fromName":"Eric Sunshine","fromEmail":"sunshine@sunshineco.com","sentAt":"2022-07-01T04:27:38Z","receivedAt":"2022-07-01T04:28:03Z","isPatch":true,"sender":{"key":"sunshine@sunshineco.com","avatar":"https://avatars.githubusercontent.com/u/163641?v=4"},"body":"On Thu, Jun 30, 2022 at 7:51 PM Ævar Arnfjörð Bjarmason\n<avarab@gmail.com> wrote:\n> Fix a memory leak in \"test-tool path-utils\", as a result we can mark\n> the corresponding test as passing with SANITIZE=leak using\n> \"TEST_PASSES_SANITIZE_LEAK=true\".\n>\n> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n> ---\n> diff --git a/t/helper/test-path-utils.c b/t/helper/test-path-utils.c\n> @@ -294,11 +294,13 @@ static int protect_ntfs_hfs_benchmark(int argc, const char **argv)\n>  int cmd__path_utils(int argc, const char **argv)\n>  {\n>         if (argc == 3 && !strcmp(argv[1], \"normalize_path_copy\")) {\n> -               char *buf = xmallocz(strlen(argv[2]));\n> +               char *to_free = NULL;\n> +               char *buf = to_free = xmallocz(strlen(argv[2]));\n\nIs there a non-obvious reason that `to_free` is initialized to NULL\nbefore being immediately overwritten with the result of xmallocz()?\n\nAlso, pure nit, but it may be a bit more idiomatic (though I could be\nwrong) written as:\n\n    char *buf, *to_free;\n    buf = to_free = xmallocz(...);\n"},{"id":"458335","messageId":"CAPig+cQeR6Ku-RCEa6qvrzq7wF+cSDYRUREofwDTeYNB-iw7JQ@mail.gmail.com","threadId":"58093","inReplyTo":"patch-7.9-bdb467d1414-20220630T180129Z-avarab@gmail.com","subject":"Re: [PATCH 7/9] test-tool bloom: fix a memory leak","fromName":"Eric Sunshine","fromEmail":"sunshine@sunshineco.com","sentAt":"2022-07-01T04:34:43Z","receivedAt":"2022-07-01T04:35:00Z","isPatch":true,"sender":{"key":"sunshine@sunshineco.com","avatar":"https://avatars.githubusercontent.com/u/163641?v=4"},"body":"On Thu, Jun 30, 2022 at 7:51 PM Ævar Arnfjörð Bjarmason\n<avarab@gmail.com> wrote:\n> test-tool bloom: fix a memory leak\n>\n> Fix memory leaks introduced with these tests in f1294eaf7fb (bloom.c:\n\npure nit: the subject talks about a single leak but the message body\ntalks about multiple leaks.\n\n> introduce core Bloom filter constructs, 2020-03-30), as a result we\n> can mark almost the entirety of t0095-bloom.sh as passing with\n> SANITIZE=leak using \"TEST_PASSES_SANITIZE_LEAK=true\", there's still an\n> unrelated memory leak in \"git commit\" in one of the tests, let's skip\n> that one under SANITIZE_LEAK for now.\n>\n> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n"},{"id":"458347","messageId":"220701.86k08xb2w4.gmgdl@evledraar.gmail.com","threadId":"58093","inReplyTo":"CAPig+cT5jETAi5extz2tHwSzp4a=b7qqaK0S=mcjQr1m_1jAQQ@mail.gmail.com","subject":"Re: [PATCH 2/9] test-tool path-utils: fix a memory leak","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-07-01T09:24:56Z","receivedAt":"2022-07-01T09:26:40Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"\nOn Fri, Jul 01 2022, Eric Sunshine wrote:\n\n> On Thu, Jun 30, 2022 at 7:51 PM Ævar Arnfjörð Bjarmason\n> <avarab@gmail.com> wrote:\n>> Fix a memory leak in \"test-tool path-utils\", as a result we can mark\n>> the corresponding test as passing with SANITIZE=leak using\n>> \"TEST_PASSES_SANITIZE_LEAK=true\".\n>>\n>> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n>> ---\n>> diff --git a/t/helper/test-path-utils.c b/t/helper/test-path-utils.c\n>> @@ -294,11 +294,13 @@ static int protect_ntfs_hfs_benchmark(int argc, const char **argv)\n>>  int cmd__path_utils(int argc, const char **argv)\n>>  {\n>>         if (argc == 3 && !strcmp(argv[1], \"normalize_path_copy\")) {\n>> -               char *buf = xmallocz(strlen(argv[2]));\n>> +               char *to_free = NULL;\n>> +               char *buf = to_free = xmallocz(strlen(argv[2]));\n>\n> Is there a non-obvious reason that `to_free` is initialized to NULL\n> before being immediately overwritten with the result of xmallocz()?\n>\n> Also, pure nit, but it may be a bit more idiomatic (though I could be\n> wrong) written as:\n>\n>     char *buf, *to_free;\n>     buf = to_free = xmallocz(...);\n\nThanks, I'll change it to be like that. I wouldn't put \"= NULL\" there\nnormally, that part snuck in from some earlier version, and escaped my\nown pre-review.\n"},{"id":"458348","messageId":"220701.86fsjlb2vj.gmgdl@evledraar.gmail.com","threadId":"58093","inReplyTo":"CAPig+cQeR6Ku-RCEa6qvrzq7wF+cSDYRUREofwDTeYNB-iw7JQ@mail.gmail.com","subject":"Re: [PATCH 7/9] test-tool bloom: fix a memory leak","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-07-01T09:25:54Z","receivedAt":"2022-07-01T09:26:52Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"\nOn Fri, Jul 01 2022, Eric Sunshine wrote:\n\n> On Thu, Jun 30, 2022 at 7:51 PM Ævar Arnfjörð Bjarmason\n> <avarab@gmail.com> wrote:\n>> test-tool bloom: fix a memory leak\n>>\n>> Fix memory leaks introduced with these tests in f1294eaf7fb (bloom.c:\n>\n> pure nit: the subject talks about a single leak but the message body\n> talks about multiple leaks.\n\nWill fix, I was copy/pasting the commit messages forward & adjusting,\nbut clearly not enough...\n"},{"id":"458356","messageId":"cover-v2-0.9-00000000000-20220701T103503Z-avarab@gmail.com","threadId":"58093","inReplyTo":"cover-0.9-00000000000-20220630T180129Z-avarab@gmail.com","subject":"[PATCH v2 0/9] test-tool: fix memory leaks","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-07-01T10:37:31Z","receivedAt":"2022-07-01T10:37:55Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Fix memory leaks in \"test-tool\", see the v1 CL for a general summary:\nhttps://lore.kernel.org/git/cover-0.9-00000000000-20220630T180129Z-avarab@gmail.com/\n\nChanges since v1:\n\n * Use a less stupid \"to_free\" pattern in 2/9 (thanks Eric!)\n * Don't go overboard with freeing memory before die() in 5/9, thanks\n   Junio.\n * Fix the commit message of 7/9 as suggested by Eric.\n\nÆvar Arnfjörð Bjarmason (9):\n  test-tool test-hash: fix a memory leak\n  test-tool path-utils: fix a memory leak\n  test-tool {dump,scrap}-cache-tree: fix memory leaks\n  test-tool urlmatch-normalization: fix a memory leak\n  test-tool regex: call regfree(), fix memory leaks\n  test-tool json-writer: fix memory leaks\n  test-tool bloom: fix memory leaks\n  test-tool ref-store: fix a memory leak\n  test-tool delta: fix a memory leak\n\n t/helper/test-bloom.c                  |  2 ++\n t/helper/test-delta.c                  | 21 ++++++++++++++-------\n t/helper/test-dump-cache-tree.c        |  7 ++++++-\n t/helper/test-hash.c                   |  1 +\n t/helper/test-json-writer.c            | 16 ++++++++++++----\n t/helper/test-path-utils.c             | 11 +++++++----\n t/helper/test-ref-store.c              |  1 +\n t/helper/test-regex.c                  |  9 ++++++---\n t/helper/test-scrap-cache-tree.c       |  1 +\n t/helper/test-urlmatch-normalization.c | 11 ++++++++---\n t/t0015-hash.sh                        |  3 ++-\n t/t0019-json-writer.sh                 |  2 ++\n t/t0060-path-utils.sh                  |  1 +\n t/t0090-cache-tree.sh                  |  2 ++\n t/t0095-bloom.sh                       |  2 +-\n t/t0110-urlmatch-normalization.sh      |  2 ++\n t/t5303-pack-corruption-resilience.sh  |  2 ++\n t/t5308-pack-detect-duplicates.sh      |  2 ++\n t/t5309-pack-delta-cycles.sh           |  2 ++\n t/t5321-pack-large-objects.sh          |  2 ++\n t/t7812-grep-icase-non-ascii.sh        |  1 +\n 21 files changed, 77 insertions(+), 24 deletions(-)\n\nRange-diff against v1:\n -:  ----------- >  1:  4406fedba80 test-tool test-hash: fix a memory leak\n 1:  06b2dcf4f12 !  2:  050766e6fa2 test-tool path-utils: fix a memory leak\n    @@ Commit message\n         Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n     \n      ## t/helper/test-path-utils.c ##\n    -@@ t/helper/test-path-utils.c: static int protect_ntfs_hfs_benchmark(int argc, const char **argv)\n    - int cmd__path_utils(int argc, const char **argv)\n    - {\n    +@@ t/helper/test-path-utils.c: int cmd__path_utils(int argc, const char **argv)\n      \tif (argc == 3 && !strcmp(argv[1], \"normalize_path_copy\")) {\n    --\t\tchar *buf = xmallocz(strlen(argv[2]));\n    -+\t\tchar *to_free = NULL;\n    -+\t\tchar *buf = to_free = xmallocz(strlen(argv[2]));\n    + \t\tchar *buf = xmallocz(strlen(argv[2]));\n      \t\tint rv = normalize_path_copy(buf, argv[2]);\n    - \t\tif (rv)\n    - \t\t\tbuf = \"++failed++\";\n    - \t\tputs(buf);\n    -+\t\tfree(to_free);\n    +-\t\tif (rv)\n    +-\t\t\tbuf = \"++failed++\";\n    +-\t\tputs(buf);\n    ++\t\tputs(rv ? \"++failed++\" : buf);\n    ++\t\tfree(buf);\n      \t\treturn 0;\n      \t}\n      \n 2:  7a0064860ad =  3:  5f9f34629c4 test-tool {dump,scrap}-cache-tree: fix memory leaks\n 3:  a450aff8904 =  4:  3f9f7bbdeb2 test-tool urlmatch-normalization: fix a memory leak\n 4:  fe2a8d898f6 !  5:  940cd5378ad test-tool regex: call regfree(), fix memory leaks\n    @@ Commit message\n         routines, 2012-09-01), as a result we can mark a test as passing with\n         SANITIZE=leak using \"TEST_PASSES_SANITIZE_LEAK=true\".\n     \n    +    We could regfree() on the die() paths here, which would make some\n    +    invocations of valgrind(1) happy, but let's just target SANITIZE=leak\n    +    for now. Variables that are still reachable when we die() are not\n    +    reported as leaks.\n    +\n         Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n     \n      ## t/helper/test-regex.c ##\n     @@ t/helper/test-regex.c: static int test_regex_bug(void)\n    - \tchar *str = \"={}\\nfred\";\n    - \tregex_t r;\n    - \tregmatch_t m[1];\n    -+\tint err = 0;\n    - \n    - \tif (regcomp(&r, pat, REG_EXTENDED | REG_NEWLINE))\n    - \t\tdie(\"failed regcomp() for pattern '%s'\", pat);\n    --\tif (regexec(&r, str, 1, m, 0))\n    --\t\tdie(\"no match of pattern '%s' to string '%s'\", pat, str);\n    -+\tif (regexec(&r, str, 1, m, 0)) {\n    -+\t\terr = error(\"no match of pattern '%s' to string '%s'\", pat, str);\n    -+\t\tgoto cleanup;\n    -+\t}\n    + \tif (m[0].rm_so == 3) /* matches '\\n' when it should not */\n    + \t\tdie(\"regex bug confirmed: re-build git with NO_REGEX=1\");\n      \n    - \t/* http://sourceware.org/bugzilla/show_bug.cgi?id=3957  */\n    --\tif (m[0].rm_so == 3) /* matches '\\n' when it should not */\n    --\t\tdie(\"regex bug confirmed: re-build git with NO_REGEX=1\");\n    -+\tif (m[0].rm_so == 3) { /* matches '\\n' when it should not */\n    -+\t\terr = error(\"regex bug confirmed: re-build git with NO_REGEX=1\");\n    -+\t\tgoto cleanup;\n    -+\t}\n    - \n    --\treturn 0;\n    -+cleanup:\n     +\tregfree(&r);\n    -+\treturn err < 0 ? 1 : 0;\n    + \treturn 0;\n      }\n      \n    - int cmd__regex(int argc, const char **argv)\n    - {\n    - \tconst char *pat;\n    - \tconst char *str;\n    --\tint ret, silent = 0, flags = 0;\n    -+\tint silent = 0, flags = 0;\n    - \tregex_t r;\n    - \tregmatch_t m[1];\n    - \tchar errbuf[64];\n    -+\tint ret = 0;\n    - \n    - \targv++;\n    - \targc--;\n     @@ t/helper/test-regex.c: int cmd__regex(int argc, const char **argv)\n    - \t}\n    - \tgit_setup_gettext();\n    - \n    --\tret = regcomp(&r, pat, flags);\n    --\tif (ret) {\n    -+\tif (regcomp(&r, pat, flags)) {\n    - \t\tif (silent)\n    --\t\t\treturn ret;\n    -+\t\t\treturn 1;\n    - \n    - \t\tregerror(ret, &r, errbuf, sizeof(errbuf));\n      \t\tdie(\"failed regcomp() for pattern '%s' (%s)\", pat, errbuf);\n      \t}\n      \tif (!str)\n     -\t\treturn 0;\n     +\t\tgoto cleanup;\n      \n    --\tret = regexec(&r, str, 1, m, 0);\n    --\tif (ret) {\n    -+\tif (regexec(&r, str, 1, m, 0)) {\n    -+\t\tret = 1;\n    + \tret = regexec(&r, str, 1, m, 0);\n    + \tif (ret) {\n      \t\tif (silent || ret == REG_NOMATCH)\n     -\t\t\treturn ret;\n     +\t\t\tgoto cleanup;\n      \n      \t\tregerror(ret, &r, errbuf, sizeof(errbuf));\n    --\t\tdie(\"failed regexec() for subject '%s' (%s)\", str, errbuf);\n    -+\t\terror(\"failed regexec() for subject '%s' (%s)\", str, errbuf);\n    -+\t\tgoto cleanup;\n    + \t\tdie(\"failed regexec() for subject '%s' (%s)\", str, errbuf);\n      \t}\n      \n     -\treturn 0;\n 5:  97448b9056e =  6:  24022fc2b3f test-tool json-writer: fix memory leaks\n 6:  bdb467d1414 !  7:  0957c99817b test-tool bloom: fix a memory leak\n    @@ Metadata\n     Author: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n     \n      ## Commit message ##\n    -    test-tool bloom: fix a memory leak\n    +    test-tool bloom: fix memory leaks\n     \n         Fix memory leaks introduced with these tests in f1294eaf7fb (bloom.c:\n         introduce core Bloom filter constructs, 2020-03-30), as a result we\n 7:  6becefc754e =  8:  937b4cdf07e test-tool ref-store: fix a memory leak\n 8:  5341b413bda =  9:  0968f549957 test-tool delta: fix a memory leak\n-- \n2.37.0.900.g4d0de1cceb2\n\n"},{"id":"458358","messageId":"patch-v2-1.9-4406fedba80-20220701T103503Z-avarab@gmail.com","threadId":"58093","inReplyTo":"cover-v2-0.9-00000000000-20220701T103503Z-avarab@gmail.com","subject":"[PATCH v2 1/9] test-tool test-hash: fix a memory leak","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-07-01T10:37:32Z","receivedAt":"2022-07-01T10:37:59Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Fix a memory leak in \"test-tool test-hash\" which has been there since\nb57cbbf8a86 (test-sha1: test hashing large buffer, 2006-06-24), as a\nresult we can mark more tests as passing with SANITIZE=leak using\n\"TEST_PASSES_SANITIZE_LEAK=true\".\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n t/helper/test-hash.c              | 1 +\n t/t0015-hash.sh                   | 3 ++-\n t/t5308-pack-detect-duplicates.sh | 2 ++\n t/t5309-pack-delta-cycles.sh      | 2 ++\n t/t5321-pack-large-objects.sh     | 2 ++\n 5 files changed, 9 insertions(+), 1 deletion(-)\n\ndiff --git a/t/helper/test-hash.c b/t/helper/test-hash.c\nindex 261c545b9d1..5860dab0ffa 100644\n--- a/t/helper/test-hash.c\n+++ b/t/helper/test-hash.c\n@@ -54,5 +54,6 @@ int cmd_hash_impl(int ac, const char **av, int algo)\n \t\tfwrite(hash, 1, algop->rawsz, stdout);\n \telse\n \t\tputs(hash_to_hex_algop(hash, algop));\n+\tfree(buffer);\n \treturn 0;\n }\ndiff --git a/t/t0015-hash.sh b/t/t0015-hash.sh\nindex 086822fc45b..0a087a1983d 100755\n--- a/t/t0015-hash.sh\n+++ b/t/t0015-hash.sh\n@@ -1,8 +1,9 @@\n #!/bin/sh\n \n test_description='test basic hash implementation'\n-. ./test-lib.sh\n \n+TEST_PASSES_SANITIZE_LEAK=true\n+. ./test-lib.sh\n \n test_expect_success 'test basic SHA-1 hash values' '\n \ttest-tool sha1 </dev/null >actual &&\ndiff --git a/t/t5308-pack-detect-duplicates.sh b/t/t5308-pack-detect-duplicates.sh\nindex 693b2411c89..655cafa0541 100755\n--- a/t/t5308-pack-detect-duplicates.sh\n+++ b/t/t5308-pack-detect-duplicates.sh\n@@ -1,6 +1,8 @@\n #!/bin/sh\n \n test_description='handling of duplicate objects in incoming packfiles'\n+\n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-pack.sh\n \ndiff --git a/t/t5309-pack-delta-cycles.sh b/t/t5309-pack-delta-cycles.sh\nindex 55b787630fc..4e910c5b9d2 100755\n--- a/t/t5309-pack-delta-cycles.sh\n+++ b/t/t5309-pack-delta-cycles.sh\n@@ -1,6 +1,8 @@\n #!/bin/sh\n \n test_description='test index-pack handling of delta cycles in packfiles'\n+\n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-pack.sh\n \ndiff --git a/t/t5321-pack-large-objects.sh b/t/t5321-pack-large-objects.sh\nindex 8a56d98a0e8..70770fe274d 100755\n--- a/t/t5321-pack-large-objects.sh\n+++ b/t/t5321-pack-large-objects.sh\n@@ -6,6 +6,8 @@\n test_description='git pack-object with \"large\" deltas\n \n '\n+\n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-pack.sh\n \n-- \n2.37.0.900.g4d0de1cceb2\n\n"},{"id":"458357","messageId":"patch-v2-2.9-050766e6fa2-20220701T103503Z-avarab@gmail.com","threadId":"58093","inReplyTo":"cover-v2-0.9-00000000000-20220701T103503Z-avarab@gmail.com","subject":"[PATCH v2 2/9] test-tool path-utils: fix a memory leak","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-07-01T10:37:33Z","receivedAt":"2022-07-01T10:38:01Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Fix a memory leak in \"test-tool path-utils\", as a result we can mark\nthe corresponding test as passing with SANITIZE=leak using\n\"TEST_PASSES_SANITIZE_LEAK=true\".\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n t/helper/test-path-utils.c | 11 +++++++----\n t/t0060-path-utils.sh      |  1 +\n 2 files changed, 8 insertions(+), 4 deletions(-)\n\ndiff --git a/t/helper/test-path-utils.c b/t/helper/test-path-utils.c\nindex 229ed416b0e..d20e1b7a18d 100644\n--- a/t/helper/test-path-utils.c\n+++ b/t/helper/test-path-utils.c\n@@ -296,9 +296,8 @@ int cmd__path_utils(int argc, const char **argv)\n \tif (argc == 3 && !strcmp(argv[1], \"normalize_path_copy\")) {\n \t\tchar *buf = xmallocz(strlen(argv[2]));\n \t\tint rv = normalize_path_copy(buf, argv[2]);\n-\t\tif (rv)\n-\t\t\tbuf = \"++failed++\";\n-\t\tputs(buf);\n+\t\tputs(rv ? \"++failed++\" : buf);\n+\t\tfree(buf);\n \t\treturn 0;\n \t}\n \n@@ -356,7 +355,10 @@ int cmd__path_utils(int argc, const char **argv)\n \t\tint nongit_ok;\n \t\tsetup_git_directory_gently(&nongit_ok);\n \t\twhile (argc > 3) {\n-\t\t\tputs(prefix_path(prefix, prefix_len, argv[3]));\n+\t\t\tchar *pfx = prefix_path(prefix, prefix_len, argv[3]);\n+\n+\t\t\tputs(pfx);\n+\t\t\tfree(pfx);\n \t\t\targc--;\n \t\t\targv++;\n \t\t}\n@@ -366,6 +368,7 @@ int cmd__path_utils(int argc, const char **argv)\n \tif (argc == 4 && !strcmp(argv[1], \"strip_path_suffix\")) {\n \t\tchar *prefix = strip_path_suffix(argv[2], argv[3]);\n \t\tprintf(\"%s\\n\", prefix ? prefix : \"(null)\");\n+\t\tfree(prefix);\n \t\treturn 0;\n \t}\n \ndiff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh\nindex aa35350b6f3..1f2007e62b7 100755\n--- a/t/t0060-path-utils.sh\n+++ b/t/t0060-path-utils.sh\n@@ -5,6 +5,7 @@\n \n test_description='Test various path utilities'\n \n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n norm_path() {\n-- \n2.37.0.900.g4d0de1cceb2\n\n"},{"id":"458359","messageId":"patch-v2-3.9-5f9f34629c4-20220701T103503Z-avarab@gmail.com","threadId":"58093","inReplyTo":"cover-v2-0.9-00000000000-20220701T103503Z-avarab@gmail.com","subject":"[PATCH v2 3/9] test-tool {dump,scrap}-cache-tree: fix memory leaks","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-07-01T10:37:34Z","receivedAt":"2022-07-01T10:38:04Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Fix memory leaks in two test-tools used by t0090-cache-tree.sh. As a\nresult we can mark the test as passing with SANITIZE=leak using\n\"TEST_PASSES_SANITIZE_LEAK=true\".\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n t/helper/test-dump-cache-tree.c  | 7 ++++++-\n t/helper/test-scrap-cache-tree.c | 1 +\n t/t0090-cache-tree.sh            | 2 ++\n 3 files changed, 9 insertions(+), 1 deletion(-)\n\ndiff --git a/t/helper/test-dump-cache-tree.c b/t/helper/test-dump-cache-tree.c\nindex 6a3f88f5f5d..0d6d7f1ecbf 100644\n--- a/t/helper/test-dump-cache-tree.c\n+++ b/t/helper/test-dump-cache-tree.c\n@@ -59,11 +59,16 @@ int cmd__dump_cache_tree(int ac, const char **av)\n {\n \tstruct index_state istate;\n \tstruct cache_tree *another = cache_tree();\n+\tint ret;\n+\n \tsetup_git_directory();\n \tif (read_cache() < 0)\n \t\tdie(\"unable to read index file\");\n \tistate = the_index;\n \tistate.cache_tree = another;\n \tcache_tree_update(&istate, WRITE_TREE_DRY_RUN);\n-\treturn dump_cache_tree(active_cache_tree, another, \"\");\n+\tret = dump_cache_tree(active_cache_tree, another, \"\");\n+\tcache_tree_free(&another);\n+\n+\treturn ret;\n }\ndiff --git a/t/helper/test-scrap-cache-tree.c b/t/helper/test-scrap-cache-tree.c\nindex 393f1604ff9..026c802479d 100644\n--- a/t/helper/test-scrap-cache-tree.c\n+++ b/t/helper/test-scrap-cache-tree.c\n@@ -12,6 +12,7 @@ int cmd__scrap_cache_tree(int ac, const char **av)\n \thold_locked_index(&index_lock, LOCK_DIE_ON_ERROR);\n \tif (read_cache() < 0)\n \t\tdie(\"unable to read index file\");\n+\tcache_tree_free(&active_cache_tree);\n \tactive_cache_tree = NULL;\n \tif (write_locked_index(&the_index, &index_lock, COMMIT_LOCK))\n \t\tdie(\"unable to write index file\");\ndiff --git a/t/t0090-cache-tree.sh b/t/t0090-cache-tree.sh\nindex 90675726484..d8e2fc42e15 100755\n--- a/t/t0090-cache-tree.sh\n+++ b/t/t0090-cache-tree.sh\n@@ -5,6 +5,8 @@ test_description=\"Test whether cache-tree is properly updated\n Tests whether various commands properly update and/or rewrite the\n cache-tree extension.\n \"\n+\n+TEST_PASSES_SANITIZE_LEAK=true\n  . ./test-lib.sh\n \n cmp_cache_tree () {\n-- \n2.37.0.900.g4d0de1cceb2\n\n"},{"id":"458360","messageId":"patch-v2-4.9-3f9f7bbdeb2-20220701T103503Z-avarab@gmail.com","threadId":"58093","inReplyTo":"cover-v2-0.9-00000000000-20220701T103503Z-avarab@gmail.com","subject":"[PATCH v2 4/9] test-tool urlmatch-normalization: fix a memory leak","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-07-01T10:37:35Z","receivedAt":"2022-07-01T10:38:06Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Fix a memory leak in \"test-tool urlmatch-normalization\", as a result\nwe can mark the corresponding test as passing with SANITIZE=leak using\n\"TEST_PASSES_SANITIZE_LEAK=true\".\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n t/helper/test-urlmatch-normalization.c | 11 ++++++++---\n t/t0110-urlmatch-normalization.sh      |  2 ++\n 2 files changed, 10 insertions(+), 3 deletions(-)\n\ndiff --git a/t/helper/test-urlmatch-normalization.c b/t/helper/test-urlmatch-normalization.c\nindex 8f4d67e6469..86edd454f5c 100644\n--- a/t/helper/test-urlmatch-normalization.c\n+++ b/t/helper/test-urlmatch-normalization.c\n@@ -5,8 +5,9 @@\n int cmd__urlmatch_normalization(int argc, const char **argv)\n {\n \tconst char usage[] = \"test-tool urlmatch-normalization [-p | -l] <url1> | <url1> <url2>\";\n-\tchar *url1, *url2;\n+\tchar *url1 = NULL, *url2 = NULL;\n \tint opt_p = 0, opt_l = 0;\n+\tint ret = 0;\n \n \t/*\n \t * For one url, succeed if url_normalize succeeds on it, fail otherwise.\n@@ -39,7 +40,7 @@ int cmd__urlmatch_normalization(int argc, const char **argv)\n \t\t\tprintf(\"%s\\n\", url1);\n \t\tif (opt_l)\n \t\t\tprintf(\"%u\\n\", (unsigned)info.url_len);\n-\t\treturn 0;\n+\t\tgoto cleanup;\n \t}\n \n \tif (opt_p || opt_l)\n@@ -47,5 +48,9 @@ int cmd__urlmatch_normalization(int argc, const char **argv)\n \n \turl1 = url_normalize(argv[1], NULL);\n \turl2 = url_normalize(argv[2], NULL);\n-\treturn (url1 && url2 && !strcmp(url1, url2)) ? 0 : 1;\n+\tret = (url1 && url2 && !strcmp(url1, url2)) ? 0 : 1;\n+cleanup:\n+\tfree(url1);\n+\tfree(url2);\n+\treturn ret;\n }\ndiff --git a/t/t0110-urlmatch-normalization.sh b/t/t0110-urlmatch-normalization.sh\nindex 4dc9fecf724..12d817fbd34 100755\n--- a/t/t0110-urlmatch-normalization.sh\n+++ b/t/t0110-urlmatch-normalization.sh\n@@ -1,6 +1,8 @@\n #!/bin/sh\n \n test_description='urlmatch URL normalization'\n+\n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # The base name of the test url files\n-- \n2.37.0.900.g4d0de1cceb2\n\n"},{"id":"458361","messageId":"patch-v2-5.9-940cd5378ad-20220701T103503Z-avarab@gmail.com","threadId":"58093","inReplyTo":"cover-v2-0.9-00000000000-20220701T103503Z-avarab@gmail.com","subject":"[PATCH v2 5/9] test-tool regex: call regfree(), fix memory leaks","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-07-01T10:37:36Z","receivedAt":"2022-07-01T10:38:08Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Fix memory leaks in \"test-tool regex\" which have been there since\nc91841594c2 (test-regex: Add a test to check for a bug in the regex\nroutines, 2012-09-01), as a result we can mark a test as passing with\nSANITIZE=leak using \"TEST_PASSES_SANITIZE_LEAK=true\".\n\nWe could regfree() on the die() paths here, which would make some\ninvocations of valgrind(1) happy, but let's just target SANITIZE=leak\nfor now. Variables that are still reachable when we die() are not\nreported as leaks.\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n t/helper/test-regex.c           | 9 ++++++---\n t/t7812-grep-icase-non-ascii.sh | 1 +\n 2 files changed, 7 insertions(+), 3 deletions(-)\n\ndiff --git a/t/helper/test-regex.c b/t/helper/test-regex.c\nindex d6f28ca8d14..bd871a735b4 100644\n--- a/t/helper/test-regex.c\n+++ b/t/helper/test-regex.c\n@@ -34,6 +34,7 @@ static int test_regex_bug(void)\n \tif (m[0].rm_so == 3) /* matches '\\n' when it should not */\n \t\tdie(\"regex bug confirmed: re-build git with NO_REGEX=1\");\n \n+\tregfree(&r);\n \treturn 0;\n }\n \n@@ -94,18 +95,20 @@ int cmd__regex(int argc, const char **argv)\n \t\tdie(\"failed regcomp() for pattern '%s' (%s)\", pat, errbuf);\n \t}\n \tif (!str)\n-\t\treturn 0;\n+\t\tgoto cleanup;\n \n \tret = regexec(&r, str, 1, m, 0);\n \tif (ret) {\n \t\tif (silent || ret == REG_NOMATCH)\n-\t\t\treturn ret;\n+\t\t\tgoto cleanup;\n \n \t\tregerror(ret, &r, errbuf, sizeof(errbuf));\n \t\tdie(\"failed regexec() for subject '%s' (%s)\", str, errbuf);\n \t}\n \n-\treturn 0;\n+cleanup:\n+\tregfree(&r);\n+\treturn ret;\n usage:\n \tusage(\"\\ttest-tool regex --bug\\n\"\n \t      \"\\ttest-tool regex [--silent] <pattern>\\n\"\ndiff --git a/t/t7812-grep-icase-non-ascii.sh b/t/t7812-grep-icase-non-ascii.sh\nindex ac7be547145..31c66b63c2c 100755\n--- a/t/t7812-grep-icase-non-ascii.sh\n+++ b/t/t7812-grep-icase-non-ascii.sh\n@@ -2,6 +2,7 @@\n \n test_description='grep icase on non-English locales'\n \n+TEST_PASSES_SANITIZE_LEAK=true\n . ./lib-gettext.sh\n \n doalarm () {\n-- \n2.37.0.900.g4d0de1cceb2\n\n"},{"id":"458362","messageId":"patch-v2-6.9-24022fc2b3f-20220701T103503Z-avarab@gmail.com","threadId":"58093","inReplyTo":"cover-v2-0.9-00000000000-20220701T103503Z-avarab@gmail.com","subject":"[PATCH v2 6/9] test-tool json-writer: fix memory leaks","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-07-01T10:37:37Z","receivedAt":"2022-07-01T10:38:11Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Fix memory leaks introduced with these tests in\n75459410edd (json_writer: new routines to create JSON data,\n2018-07-13), as a result we can mark a test as passing with\nSANITIZE=leak using \"TEST_PASSES_SANITIZE_LEAK=true\".\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n t/helper/test-json-writer.c | 16 ++++++++++++----\n t/t0019-json-writer.sh      |  2 ++\n 2 files changed, 14 insertions(+), 4 deletions(-)\n\ndiff --git a/t/helper/test-json-writer.c b/t/helper/test-json-writer.c\nindex 37c452535f8..8c3edacc000 100644\n--- a/t/helper/test-json-writer.c\n+++ b/t/helper/test-json-writer.c\n@@ -181,12 +181,18 @@ static struct json_writer nest1 = JSON_WRITER_INIT;\n \n static void make_nest1(int pretty)\n {\n+\tmake_obj1(0);\n+\tmake_arr1(0);\n+\n \tjw_object_begin(&nest1, pretty);\n \t{\n \t\tjw_object_sub_jw(&nest1, \"obj1\", &obj1);\n \t\tjw_object_sub_jw(&nest1, \"arr1\", &arr1);\n \t}\n \tjw_end(&nest1);\n+\n+\tjw_release(&obj1);\n+\tjw_release(&arr1);\n }\n \n static char *expect_inline1 =\n@@ -313,6 +319,9 @@ static void make_mixed1(int pretty)\n \t\tjw_object_sub_jw(&mixed1, \"arr1\", &arr1);\n \t}\n \tjw_end(&mixed1);\n+\n+\tjw_release(&obj1);\n+\tjw_release(&arr1);\n }\n \n static void cmp(const char *test, const struct json_writer *jw, const char *exp)\n@@ -325,8 +334,8 @@ static void cmp(const char *test, const struct json_writer *jw, const char *exp)\n \texit(1);\n }\n \n-#define t(v) do { make_##v(0); cmp(#v, &v, expect_##v); } while (0)\n-#define p(v) do { make_##v(1); cmp(#v, &v, pretty_##v); } while (0)\n+#define t(v) do { make_##v(0); cmp(#v, &v, expect_##v); jw_release(&v); } while (0)\n+#define p(v) do { make_##v(1); cmp(#v, &v, pretty_##v); jw_release(&v); } while (0)\n \n /*\n  * Run some basic regression tests with some known patterns.\n@@ -381,7 +390,6 @@ static int unit_tests(void)\n \n \t/* mixed forms */\n \tt(mixed1);\n-\tjw_init(&mixed1);\n \tp(mixed1);\n \n \treturn 0;\n@@ -544,7 +552,7 @@ static int scripted(void)\n \n \tprintf(\"%s\\n\", jw.json.buf);\n \n-\tstrbuf_release(&jw.json);\n+\tjw_release(&jw);\n \treturn 0;\n }\n \ndiff --git a/t/t0019-json-writer.sh b/t/t0019-json-writer.sh\nindex 3b0c336b38e..19a730c29ed 100755\n--- a/t/t0019-json-writer.sh\n+++ b/t/t0019-json-writer.sh\n@@ -1,6 +1,8 @@\n #!/bin/sh\n \n test_description='test json-writer JSON generation'\n+\n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'unit test of json-writer routines' '\n-- \n2.37.0.900.g4d0de1cceb2\n\n"},{"id":"458363","messageId":"patch-v2-7.9-0957c99817b-20220701T103503Z-avarab@gmail.com","threadId":"58093","inReplyTo":"cover-v2-0.9-00000000000-20220701T103503Z-avarab@gmail.com","subject":"[PATCH v2 7/9] test-tool bloom: fix memory leaks","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-07-01T10:37:38Z","receivedAt":"2022-07-01T10:38:13Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Fix memory leaks introduced with these tests in f1294eaf7fb (bloom.c:\nintroduce core Bloom filter constructs, 2020-03-30), as a result we\ncan mark almost the entirety of t0095-bloom.sh as passing with\nSANITIZE=leak using \"TEST_PASSES_SANITIZE_LEAK=true\", there's still an\nunrelated memory leak in \"git commit\" in one of the tests, let's skip\nthat one under SANITIZE_LEAK for now.\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n t/helper/test-bloom.c | 2 ++\n t/t0095-bloom.sh      | 2 +-\n 2 files changed, 3 insertions(+), 1 deletion(-)\n\ndiff --git a/t/helper/test-bloom.c b/t/helper/test-bloom.c\nindex ad3ef1cd77a..6c900ca6684 100644\n--- a/t/helper/test-bloom.c\n+++ b/t/helper/test-bloom.c\n@@ -16,6 +16,7 @@ static void add_string_to_filter(const char *data, struct bloom_filter *filter)\n \t\t}\n \t\tprintf(\"\\n\");\n \t\tadd_key_to_filter(&key, filter, &settings);\n+\t\tclear_bloom_key(&key);\n }\n \n static void print_bloom_filter(struct bloom_filter *filter) {\n@@ -80,6 +81,7 @@ int cmd__bloom(int argc, const char **argv)\n \t\t}\n \n \t\tprint_bloom_filter(&filter);\n+\t\tfree(filter.data);\n \t}\n \n \tif (!strcmp(argv[1], \"get_filter_for_commit\")) {\ndiff --git a/t/t0095-bloom.sh b/t/t0095-bloom.sh\nindex 5945973552a..daeb4a5e3e7 100755\n--- a/t/t0095-bloom.sh\n+++ b/t/t0095-bloom.sh\n@@ -67,7 +67,7 @@ test_expect_success 'compute bloom key for test string 2' '\n \ttest_cmp expect actual\n '\n \n-test_expect_success 'get bloom filters for commit with no changes' '\n+test_expect_success !SANITIZE_LEAK 'get bloom filters for commit with no changes' '\n \tgit init &&\n \tgit commit --allow-empty -m \"c0\" &&\n \tcat >expect <<-\\EOF &&\n-- \n2.37.0.900.g4d0de1cceb2\n\n"},{"id":"458364","messageId":"patch-v2-8.9-937b4cdf07e-20220701T103503Z-avarab@gmail.com","threadId":"58093","inReplyTo":"cover-v2-0.9-00000000000-20220701T103503Z-avarab@gmail.com","subject":"[PATCH v2 8/9] test-tool ref-store: fix a memory leak","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-07-01T10:37:39Z","receivedAt":"2022-07-01T10:38:16Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Fix a memory leak introduced in fa099d23227 (worktree.c: kill\nparse_ref() in favor of refs_resolve_ref_unsafe(), 2017-04-24), as a\nresult we can mark another test as passing with SANITIZE=leak using\n\"TEST_PASSES_SANITIZE_LEAK=true\".\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n t/helper/test-ref-store.c | 1 +\n 1 file changed, 1 insertion(+)\n\ndiff --git a/t/helper/test-ref-store.c b/t/helper/test-ref-store.c\nindex 9646d85fc84..4d18bfb1ca5 100644\n--- a/t/helper/test-ref-store.c\n+++ b/t/helper/test-ref-store.c\n@@ -96,6 +96,7 @@ static const char **get_store(const char **argv, struct ref_store **refs)\n \t\t\tdie(\"no such worktree: %s\", gitdir);\n \n \t\t*refs = get_worktree_ref_store(*p);\n+\t\tfree_worktrees(worktrees);\n \t} else\n \t\tdie(\"unknown backend %s\", argv[0]);\n \n-- \n2.37.0.900.g4d0de1cceb2\n\n"},{"id":"458365","messageId":"patch-v2-9.9-0968f549957-20220701T103503Z-avarab@gmail.com","threadId":"58093","inReplyTo":"cover-v2-0.9-00000000000-20220701T103503Z-avarab@gmail.com","subject":"[PATCH v2 9/9] test-tool delta: fix a memory leak","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2022-07-01T10:37:40Z","receivedAt":"2022-07-01T10:38:18Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"Fix a memory leak introduced in a310d434946 ([PATCH] Deltification\nlibrary work by Nicolas Pitre., 2005-05-19), as a result we can mark\nanother test as passing with SANITIZE=leak using\n\"TEST_PASSES_SANITIZE_LEAK=true\".\n\nSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n---\n t/helper/test-delta.c                 | 21 ++++++++++++++-------\n t/t5303-pack-corruption-resilience.sh |  2 ++\n 2 files changed, 16 insertions(+), 7 deletions(-)\n\ndiff --git a/t/helper/test-delta.c b/t/helper/test-delta.c\nindex e749a49c88e..b15481ea596 100644\n--- a/t/helper/test-delta.c\n+++ b/t/helper/test-delta.c\n@@ -20,8 +20,9 @@ int cmd__delta(int argc, const char **argv)\n {\n \tint fd;\n \tstruct stat st;\n-\tvoid *from_buf, *data_buf, *out_buf;\n+\tvoid *from_buf = NULL, *data_buf = NULL, *out_buf = NULL;\n \tunsigned long from_size, data_size, out_size;\n+\tint ret = 1;\n \n \tif (argc != 5 || (strcmp(argv[1], \"-d\") && strcmp(argv[1], \"-p\"))) {\n \t\tfprintf(stderr, \"usage: %s\\n\", usage_str);\n@@ -38,21 +39,21 @@ int cmd__delta(int argc, const char **argv)\n \tif (read_in_full(fd, from_buf, from_size) < 0) {\n \t\tperror(argv[2]);\n \t\tclose(fd);\n-\t\treturn 1;\n+\t\tgoto cleanup;\n \t}\n \tclose(fd);\n \n \tfd = open(argv[3], O_RDONLY);\n \tif (fd < 0 || fstat(fd, &st)) {\n \t\tperror(argv[3]);\n-\t\treturn 1;\n+\t\tgoto cleanup;\n \t}\n \tdata_size = st.st_size;\n \tdata_buf = xmalloc(data_size);\n \tif (read_in_full(fd, data_buf, data_size) < 0) {\n \t\tperror(argv[3]);\n \t\tclose(fd);\n-\t\treturn 1;\n+\t\tgoto cleanup;\n \t}\n \tclose(fd);\n \n@@ -66,14 +67,20 @@ int cmd__delta(int argc, const char **argv)\n \t\t\t\t      &out_size);\n \tif (!out_buf) {\n \t\tfprintf(stderr, \"delta operation failed (returned NULL)\\n\");\n-\t\treturn 1;\n+\t\tgoto cleanup;\n \t}\n \n \tfd = open (argv[4], O_WRONLY|O_CREAT|O_TRUNC, 0666);\n \tif (fd < 0 || write_in_full(fd, out_buf, out_size) < 0) {\n \t\tperror(argv[4]);\n-\t\treturn 1;\n+\t\tgoto cleanup;\n \t}\n \n-\treturn 0;\n+\tret = 0;\n+cleanup:\n+\tfree(from_buf);\n+\tfree(data_buf);\n+\tfree(out_buf);\n+\n+\treturn ret;\n }\ndiff --git a/t/t5303-pack-corruption-resilience.sh b/t/t5303-pack-corruption-resilience.sh\nindex 41e6dc4dcfc..2926e8dfc41 100755\n--- a/t/t5303-pack-corruption-resilience.sh\n+++ b/t/t5303-pack-corruption-resilience.sh\n@@ -4,6 +4,8 @@\n #\n \n test_description='resilience to pack corruptions with redundant objects'\n+\n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Note: the test objects are created with knowledge of their pack encoding\n-- \n2.37.0.900.g4d0de1cceb2\n\n"},{"id":"458416","messageId":"xmqq5ykg8syr.fsf@gitster.g","threadId":"58093","inReplyTo":"patch-v2-2.9-050766e6fa2-20220701T103503Z-avarab@gmail.com","subject":"Re: [PATCH v2 2/9] test-tool path-utils: fix a memory leak","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2022-07-01T20:43:08Z","receivedAt":"2022-07-01T20:43:18Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Ævar Arnfjörð Bjarmason  <avarab@gmail.com> writes:\n\n> Fix a memory leak in \"test-tool path-utils\", as a result we can mark\n> the corresponding test as passing with SANITIZE=leak using\n> \"TEST_PASSES_SANITIZE_LEAK=true\".\n>\n> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>\n> ---\n>  t/helper/test-path-utils.c | 11 +++++++----\n>  t/t0060-path-utils.sh      |  1 +\n>  2 files changed, 8 insertions(+), 4 deletions(-)\n>\n> diff --git a/t/helper/test-path-utils.c b/t/helper/test-path-utils.c\n> index 229ed416b0e..d20e1b7a18d 100644\n> --- a/t/helper/test-path-utils.c\n> +++ b/t/helper/test-path-utils.c\n> @@ -296,9 +296,8 @@ int cmd__path_utils(int argc, const char **argv)\n>  \tif (argc == 3 && !strcmp(argv[1], \"normalize_path_copy\")) {\n>  \t\tchar *buf = xmallocz(strlen(argv[2]));\n>  \t\tint rv = normalize_path_copy(buf, argv[2]);\n> -\t\tif (rv)\n> -\t\t\tbuf = \"++failed++\";\n> -\t\tputs(buf);\n> +\t\tputs(rv ? \"++failed++\" : buf);\n> +\t\tfree(buf);\n\nThis version, without the need for to_free, is certainly very easy\nto understand.  Nicely done.\n\n"}]}