{"thread":{"id":"62459","subject":"[PATCH 01/26] builtin/blame: fix leaking blame entries with `--incremental`","startedAt":"2024-11-06T15:10:29Z","lastAt":"2024-11-11T09:09:50Z","messageCount":39,"participants":["Patrick Steinhardt","Rubén Justo"],"isPatch":true,"patchVersion":1,"patchTotal":26},"messages":[{"id":"506721","messageId":"cover.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":null,"subject":"[PATCH 00/26] Memory leak fixes (pt.10, final)","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:10:14Z","receivedAt":"2024-11-06T15:10:29Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"Hi,\n\nthis is the last part of my series of memory leak fixes. This series\ngoes a bit further than past series:\n\n  - Patches 1 to 16 plug remaining memory leaks exposed by our test\n    suite.\n\n  - Patches 17 to 21 remove the last remaining `UNLEAK()` annotations\n    and ultimately remove the macro itself.\n\n  - Patch 22 works around a bug in the leak sanitizer itself.\n\n  - Patches 23 and 24 drop annotations where leak-free tests pass with\n    the leak sanitizer.\n\n  - Patches 25 and 26 unconditionally enable leak checking in all newly\n    added tests and then drop the `TEST_PASSES_SANITIZE_LEAK`\n    annotation.\n\nSo once this series lands, the expectation is that any newly added test\nneeds to be leak free by default. We still have an escape hatch in the\nform of the SANITIZE_LEAK prerequisite, but patch authors are expected\nto provide good arguments why their test cannot be made leak free.\n\nThis series is built on top of 8f8d6eee53 (The seventh batch,\n2024-11-01) with ps/leakfixes-part-9 at c810549be1\n(list-objects-filter-options: work around reported leak on error,\n2024-11-05) merged into it.\n\nThe series has some trivial conflicts with the removed test annotations\nwhen merging with `seen`. There are two topics in-flight that introduce\nnew memory leaks (ds/path-walk and cc/promisor-remote-capability), both\nof which are fixed by the below patch. I've sent a message in response\nto the individual commits that introduce the leaks.\n\nThanks!\n\nPatrick\n\ndiff --git a/promisor-remote.c b/promisor-remote.c\nindex 06507b2ee1..0a4f7f1188 100644\n--- a/promisor-remote.c\n+++ b/promisor-remote.c\n@@ -424,12 +424,12 @@ static void filter_promisor_remote(struct repository *repo,\n \t\t\t\t   const char *info)\n {\n \tstruct strbuf **remotes;\n-\tchar *accept_str;\n+\tconst char *accept_str;\n \tenum accept_promisor accept = ACCEPT_NONE;\n \tstruct strvec names = STRVEC_INIT;\n \tstruct strvec urls = STRVEC_INIT;\n \n-\tif (!git_config_get_string(\"promisor.acceptfromserver\", &accept_str)) {\n+\tif (!git_config_get_string_tmp(\"promisor.acceptfromserver\", &accept_str)) {\n \t\tif (!accept_str || !*accept_str || !strcasecmp(\"None\", accept_str))\n \t\t\taccept = ACCEPT_NONE;\n \t\telse if (!strcasecmp(\"KnownUrl\", accept_str))\n@@ -486,7 +486,6 @@ static void filter_promisor_remote(struct repository *repo,\n \t\tfree(decoded_url);\n \t}\n \n-\tfree(accept_str);\n \tstrvec_clear(&names);\n \tstrvec_clear(&urls);\n \tstrbuf_list_free(remotes);\ndiff --git a/t/helper/test-path-walk.c b/t/helper/test-path-walk.c\nindex 06b103d876..fa3bfe46b5 100644\n--- a/t/helper/test-path-walk.c\n+++ b/t/helper/test-path-walk.c\n@@ -85,7 +85,6 @@ int cmd__path_walk(int argc, const char **argv)\n \t\tOPT_END(),\n \t};\n \n-\tinitialize_repository(the_repository);\n \tsetup_git_directory();\n \trevs.repo = the_repository;\n \n@@ -110,5 +109,6 @@ int cmd__path_walk(int argc, const char **argv)\n \t       \"tags:%\" PRIuMAX \"\\n\",\n \t       data.commit_nr, data.tree_nr, data.blob_nr, data.tag_nr);\n \n+\trelease_revisions(&revs);\n \treturn res;\n }\n\nPatrick Steinhardt (26):\n  builtin/blame: fix leaking blame entries with `--incremental`\n  bisect: fix leaking good/bad terms when reading multipe times\n  bisect: fix leaking string in `handle_bad_merge_base()`\n  bisect: fix leaking `current_bad_oid`\n  bisect: fix multiple leaks in `bisect_next_all()`\n  bisect: fix leaking commit list items in `check_merge_base()`\n  bisect: fix various cases where we leak commit list items\n  line-log: fix leak when rewriting commit parents\n  strvec: introduce new `strvec_splice()` function\n  git: refactor alias handling to use a `struct strvec`\n  git: refactor builtin handling to use a `struct strvec`\n  split-index: fix memory leak in `move_cache_to_base_index()`\n  builtin/sparse-checkout: fix leaking sanitized patterns\n  help: refactor to not use globals for reading config\n  help: fix leaking `struct cmdnames`\n  help: fix leaking return value from `help_unknown_cmd()`\n  builtin/help: fix leaks in `check_git_cmd()`\n  builtin/init-db: fix leaking directory paths\n  builtin/branch: fix leaking sorting options\n  t/helper: fix leaking commit graph in \"read-graph\" subcommand\n  git-compat-util: drop `UNLEAK()` annotation\n  t5601: work around leak sanitizer issue\n  t: mark some tests as leak free\n  t: remove unneeded !SANITIZE_LEAK prerequisites\n  test-lib: unconditionally enable leak checking\n  t: remove TEST_PASSES_SANITIZE_LEAK annotations\n\n bisect.c                                      |  61 ++++++---\n bisect.h                                      |   2 +-\n blame.c                                       |   1 +\n blame.h                                       |   2 +-\n builtin/blame.c                               |  12 +-\n builtin/branch.c                              |  33 +++--\n builtin/clone.c                               |   1 -\n builtin/diff.c                                |   1 -\n builtin/help.c                                |  13 +-\n builtin/init-db.c                             |  30 +++--\n builtin/sparse-checkout.c                     |  61 +++++----\n ci/lib.sh                                     |   1 -\n git-compat-util.h                             |  20 ---\n git.c                                         | 124 +++++++++---------\n help.c                                        |  76 ++++++-----\n help.h                                        |   2 +-\n line-log.c                                    |   1 +\n revision.c                                    |   4 +-\n split-index.c                                 |   6 +-\n strvec.c                                      |  19 +++\n strvec.h                                      |   9 ++\n t/README                                      |  21 ---\n t/helper/test-read-graph.c                    |   3 +-\n t/lib-git-svn.sh                              |   4 -\n t/t0001-init.sh                               |   1 -\n t/t0002-gitfile.sh                            |   1 -\n t/t0003-attributes.sh                         |   1 -\n t/t0004-unwritable.sh                         |   1 -\n t/t0005-signals.sh                            |   1 -\n t/t0006-date.sh                               |   1 -\n t/t0007-git-var.sh                            |   1 -\n t/t0008-ignores.sh                            |   1 -\n t/t0010-racy-git.sh                           |   1 -\n t/t0012-help.sh                               |   1 -\n t/t0013-sha1dc.sh                             |   1 -\n t/t0017-env-helper.sh                         |   1 -\n t/t0018-advice.sh                             |   1 -\n t/t0019-json-writer.sh                        |   1 -\n t/t0020-crlf.sh                               |   1 -\n t/t0021-conversion.sh                         |   1 -\n t/t0022-crlf-rename.sh                        |   1 -\n t/t0023-crlf-am.sh                            |   1 -\n t/t0024-crlf-archive.sh                       |   1 -\n t/t0025-crlf-renormalize.sh                   |   1 -\n t/t0026-eol-config.sh                         |   1 -\n t/t0027-auto-crlf.sh                          |   1 -\n t/t0028-working-tree-encoding.sh              |   1 -\n t/t0029-core-unsetenvvars.sh                  |   1 -\n t/t0030-stripspace.sh                         |   1 -\n t/t0033-safe-directory.sh                     |   1 -\n t/t0035-safe-bare-repository.sh               |   1 -\n t/t0040-parse-options.sh                      |   1 -\n t/t0041-usage.sh                              |   1 -\n t/t0050-filesystem.sh                         |   1 -\n t/t0052-simple-ipc.sh                         |   1 -\n t/t0055-beyond-symlinks.sh                    |   1 -\n t/t0056-git-C.sh                              |   1 -\n t/t0060-path-utils.sh                         |   1 -\n t/t0061-run-command.sh                        |   1 -\n t/t0062-revision-walking.sh                   |   1 -\n t/t0063-string-list.sh                        |   1 -\n t/t0066-dir-iterator.sh                       |   1 -\n t/t0067-parse_pathspec_file.sh                |   1 -\n t/t0068-for-each-repo.sh                      |   1 -\n t/t0070-fundamental.sh                        |   1 -\n t/t0071-sort.sh                               |   1 -\n t/t0080-unit-test-output.sh                   |   1 -\n t/t0081-find-pack.sh                          |   1 -\n t/t0090-cache-tree.sh                         |   1 -\n t/t0091-bugreport.sh                          |   1 -\n t/t0092-diagnose.sh                           |   1 -\n t/t0095-bloom.sh                              |   3 +-\n t/t0100-previous.sh                           |   1 -\n t/t0101-at-syntax.sh                          |   1 -\n t/t0200-gettext-basic.sh                      |   1 -\n t/t0201-gettext-fallbacks.sh                  |   1 -\n t/t0202-gettext-perl.sh                       |   1 -\n t/t0203-gettext-setlocale-sanity.sh           |   1 -\n t/t0204-gettext-reencode-sanity.sh            |   1 -\n t/t0210-trace2-normal.sh                      |   1 -\n t/t0211-trace2-perf.sh                        |   1 -\n t/t0212-trace2-event.sh                       |   1 -\n t/t0300-credentials.sh                        |   1 -\n t/t0301-credential-cache.sh                   |   1 -\n t/t0302-credential-store.sh                   |   1 -\n t/t0303-credential-external.sh                |   1 -\n t/t0410-partial-clone.sh                      |   1 -\n t/t0411-clone-from-partial.sh                 |   1 -\n t/t0450-txt-doc-vs-help.sh                    |   1 -\n t/t0500-progress-display.sh                   |   1 -\n t/t0600-reffiles-backend.sh                   |   1 -\n t/t0601-reffiles-pack-refs.sh                 |   1 -\n t/t0602-reffiles-fsck.sh                      |   1 -\n t/t0610-reftable-basics.sh                    |   1 -\n t/t0611-reftable-httpd.sh                     |   1 -\n t/t0612-reftable-jgit-compatibility.sh        |   1 -\n t/t0613-reftable-write-options.sh             |   1 -\n t/t1000-read-tree-m-3way.sh                   |   1 -\n t/t1001-read-tree-m-2way.sh                   |   1 -\n t/t1002-read-tree-m-u-2way.sh                 |   1 -\n t/t1003-read-tree-prefix.sh                   |   1 -\n t/t1004-read-tree-m-u-wf.sh                   |   1 -\n t/t1005-read-tree-reset.sh                    |   1 -\n t/t1006-cat-file.sh                           |   1 -\n t/t1007-hash-object.sh                        |   1 -\n t/t1008-read-tree-overlay.sh                  |   1 -\n t/t1009-read-tree-new-index.sh                |   1 -\n t/t1010-mktree.sh                             |   1 -\n t/t1011-read-tree-sparse-checkout.sh          |   1 -\n t/t1012-read-tree-df.sh                       |   1 -\n t/t1013-read-tree-submodule.sh                |   1 -\n t/t1014-read-tree-confusing.sh                |   1 -\n t/t1015-read-index-unmerged.sh                |   1 -\n t/t1016-compatObjectFormat.sh                 |   1 -\n t/t1020-subdirectory.sh                       |   1 -\n t/t1021-rerere-in-workdir.sh                  |   1 -\n t/t1022-read-tree-partial-clone.sh            |   1 -\n t/t1050-large.sh                              |   1 -\n t/t1051-large-conversion.sh                   |   1 -\n t/t1060-object-corruption.sh                  |   1 -\n t/t1090-sparse-checkout-scope.sh              |   1 -\n t/t1091-sparse-checkout-builtin.sh            |   1 -\n t/t1092-sparse-checkout-compatibility.sh      |   1 -\n t/t1100-commit-tree-options.sh                |   1 -\n t/t1300-config.sh                             |   1 -\n t/t1301-shared-repo.sh                        |   1 -\n t/t1302-repo-version.sh                       |   1 -\n t/t1303-wacky-config.sh                       |   1 -\n t/t1304-default-acl.sh                        |   1 -\n t/t1305-config-include.sh                     |   1 -\n t/t1306-xdg-files.sh                          |   1 -\n t/t1307-config-blob.sh                        |   1 -\n t/t1308-config-set.sh                         |   1 -\n t/t1309-early-config.sh                       |   1 -\n t/t1310-config-default.sh                     |   1 -\n t/t1350-config-hooks-path.sh                  |   1 -\n t/t1400-update-ref.sh                         |   1 -\n t/t1401-symbolic-ref.sh                       |   1 -\n t/t1402-check-ref-format.sh                   |   1 -\n t/t1403-show-ref.sh                           |   1 -\n t/t1404-update-ref-errors.sh                  |   1 -\n t/t1405-main-ref-store.sh                     |   1 -\n t/t1406-submodule-ref-store.sh                |   1 -\n t/t1407-worktree-ref-store.sh                 |   1 -\n t/t1408-packed-refs.sh                        |   1 -\n t/t1409-avoid-packing-refs.sh                 |   1 -\n t/t1410-reflog.sh                             |   1 -\n t/t1411-reflog-show.sh                        |   1 -\n t/t1412-reflog-loop.sh                        |   1 -\n t/t1413-reflog-detach.sh                      |   1 -\n t/t1414-reflog-walk.sh                        |   1 -\n t/t1415-worktree-refs.sh                      |   1 -\n t/t1416-ref-transaction-hooks.sh              |   1 -\n t/t1417-reflog-updateref.sh                   |   1 -\n t/t1418-reflog-exists.sh                      |   1 -\n t/t1419-exclude-refs.sh                       |   1 -\n t/t1420-lost-found.sh                         |   1 -\n t/t1430-bad-ref-name.sh                       |   1 -\n t/t1450-fsck.sh                               |   1 -\n t/t1451-fsck-buffer.sh                        |   1 -\n t/t1460-refs-migrate.sh                       |   1 -\n t/t1500-rev-parse.sh                          |   1 -\n t/t1501-work-tree.sh                          |   1 -\n t/t1502-rev-parse-parseopt.sh                 |   1 -\n t/t1503-rev-parse-verify.sh                   |   1 -\n t/t1504-ceiling-dirs.sh                       |   1 -\n t/t1505-rev-parse-last.sh                     |   1 -\n t/t1506-rev-parse-diagnosis.sh                |   1 -\n t/t1507-rev-parse-upstream.sh                 |   1 -\n t/t1508-at-combinations.sh                    |   1 -\n t/t1510-repo-setup.sh                         |   1 -\n t/t1511-rev-parse-caret.sh                    |   1 -\n t/t1512-rev-parse-disambiguation.sh           |   1 -\n t/t1513-rev-parse-prefix.sh                   |   1 -\n t/t1514-rev-parse-push.sh                     |   1 -\n t/t1515-rev-parse-outside-repo.sh             |   1 -\n t/t1517-outside-repo.sh                       |   1 -\n t/t1600-index.sh                              |   1 -\n t/t1601-index-bogus.sh                        |   1 -\n t/t1701-racy-split-index.sh                   |   1 -\n t/t1800-hook.sh                               |   1 -\n t/t2000-conflict-when-checking-files-out.sh   |   1 -\n t/t2002-checkout-cache-u.sh                   |   1 -\n t/t2003-checkout-cache-mkdir.sh               |   1 -\n t/t2004-checkout-cache-temp.sh                |   1 -\n t/t2005-checkout-index-symlinks.sh            |   1 -\n t/t2006-checkout-index-basic.sh               |   1 -\n t/t2007-checkout-symlink.sh                   |   1 -\n t/t2008-checkout-subdir.sh                    |   1 -\n t/t2009-checkout-statinfo.sh                  |   1 -\n t/t2010-checkout-ambiguous.sh                 |   1 -\n t/t2011-checkout-invalid-head.sh              |   1 -\n t/t2012-checkout-last.sh                      |   1 -\n t/t2013-checkout-submodule.sh                 |   1 -\n t/t2014-checkout-switch.sh                    |   1 -\n t/t2015-checkout-unborn.sh                    |   1 -\n t/t2016-checkout-patch.sh                     |   1 -\n t/t2017-checkout-orphan.sh                    |   1 -\n t/t2018-checkout-branch.sh                    |   1 -\n t/t2019-checkout-ambiguous-ref.sh             |   1 -\n t/t2020-checkout-detach.sh                    |   1 -\n t/t2021-checkout-overwrite.sh                 |   1 -\n t/t2022-checkout-paths.sh                     |   1 -\n t/t2023-checkout-m.sh                         |   1 -\n t/t2024-checkout-dwim.sh                      |   1 -\n t/t2025-checkout-no-overlay.sh                |   1 -\n t/t2026-checkout-pathspec-file.sh             |   1 -\n t/t2027-checkout-track.sh                     |   1 -\n t/t2030-unresolve-info.sh                     |   1 -\n t/t2050-git-dir-relative.sh                   |   1 -\n t/t2060-switch.sh                             |   1 -\n t/t2070-restore.sh                            |   1 -\n t/t2071-restore-patch.sh                      |   1 -\n t/t2072-restore-pathspec-file.sh              |   1 -\n t/t2080-parallel-checkout-basics.sh           |   1 -\n t/t2081-parallel-checkout-collisions.sh       |   1 -\n t/t2082-parallel-checkout-attributes.sh       |   1 -\n t/t2100-update-cache-badpath.sh               |   1 -\n t/t2101-update-index-reupdate.sh              |   1 -\n t/t2102-update-index-symlinks.sh              |   1 -\n t/t2103-update-index-ignore-missing.sh        |   1 -\n t/t2104-update-index-skip-worktree.sh         |   1 -\n t/t2105-update-index-gitfile.sh               |   1 -\n t/t2106-update-index-assume-unchanged.sh      |   1 -\n t/t2107-update-index-basic.sh                 |   1 -\n t/t2108-update-index-refresh-racy.sh          |   1 -\n t/t2200-add-update.sh                         |   1 -\n t/t2201-add-update-typechange.sh              |   1 -\n t/t2202-add-addremove.sh                      |   1 -\n t/t2203-add-intent.sh                         |   1 -\n t/t2204-add-ignored.sh                        |   1 -\n t/t2205-add-worktree-config.sh                |   1 -\n t/t2300-cd-to-toplevel.sh                     |   1 -\n t/t2400-worktree-add.sh                       |   1 -\n t/t2401-worktree-prune.sh                     |   1 -\n t/t2402-worktree-list.sh                      |   1 -\n t/t2403-worktree-move.sh                      |   1 -\n t/t2404-worktree-config.sh                    |   1 -\n t/t2405-worktree-submodule.sh                 |   1 -\n t/t2406-worktree-repair.sh                    |   1 -\n t/t2407-worktree-heads.sh                     |  17 ++-\n t/t2408-worktree-relative.sh                  |   1 -\n t/t2500-untracked-overwriting.sh              |   1 -\n t/t2501-cwd-empty.sh                          |   1 -\n t/t3000-ls-files-others.sh                    |   1 -\n t/t3001-ls-files-others-exclude.sh            |   1 -\n t/t3002-ls-files-dashpath.sh                  |   1 -\n t/t3003-ls-files-exclude.sh                   |   1 -\n t/t3004-ls-files-basic.sh                     |   1 -\n t/t3005-ls-files-relative.sh                  |   1 -\n t/t3006-ls-files-long.sh                      |   1 -\n t/t3007-ls-files-recurse-submodules.sh        |   1 -\n t/t3008-ls-files-lazy-init-name-hash.sh       |   1 -\n t/t3009-ls-files-others-nonsubmodule.sh       |   1 -\n t/t3010-ls-files-killed-modified.sh           |   1 -\n ...common-prefixes-and-directory-traversal.sh |   1 -\n t/t3012-ls-files-dedup.sh                     |   1 -\n t/t3013-ls-files-format.sh                    |   1 -\n t/t3020-ls-files-error-unmatch.sh             |   1 -\n t/t3040-subprojects-basic.sh                  |   1 -\n t/t3050-subprojects-fetch.sh                  |   1 -\n t/t3060-ls-files-with-tree.sh                 |   1 -\n t/t3070-wildmatch.sh                          |   1 -\n t/t3100-ls-tree-restrict.sh                   |   1 -\n t/t3101-ls-tree-dirname.sh                    |   1 -\n t/t3102-ls-tree-wildcards.sh                  |   1 -\n t/t3103-ls-tree-misc.sh                       |   1 -\n t/t3104-ls-tree-format.sh                     |   1 -\n t/t3105-ls-tree-output.sh                     |   1 -\n t/t3200-branch.sh                             |   1 -\n t/t3201-branch-contains.sh                    |   1 -\n t/t3202-show-branch.sh                        |   1 -\n t/t3203-branch-output.sh                      |   1 -\n t/t3204-branch-name-interpretation.sh         |   1 -\n t/t3205-branch-color.sh                       |   1 -\n t/t3206-range-diff.sh                         |   1 -\n t/t3207-branch-submodule.sh                   |   1 -\n t/t3211-peel-ref.sh                           |   1 -\n t/t3300-funny-names.sh                        |   1 -\n t/t3301-notes.sh                              |   1 -\n t/t3302-notes-index-expensive.sh              |   1 -\n t/t3303-notes-subtrees.sh                     |   1 -\n t/t3304-notes-mixed.sh                        |   1 -\n t/t3305-notes-fanout.sh                       |   1 -\n t/t3306-notes-prune.sh                        |   1 -\n t/t3307-notes-man.sh                          |   1 -\n t/t3308-notes-merge.sh                        |   1 -\n t/t3309-notes-merge-auto-resolve.sh           |   1 -\n t/t3310-notes-merge-manual-resolve.sh         |   1 -\n t/t3311-notes-merge-fanout.sh                 |   1 -\n t/t3320-notes-merge-worktrees.sh              |   1 -\n t/t3321-notes-stripspace.sh                   |   1 -\n t/t3400-rebase.sh                             |   1 -\n t/t3401-rebase-and-am-rename.sh               |   1 -\n t/t3402-rebase-merge.sh                       |   1 -\n t/t3403-rebase-skip.sh                        |   1 -\n t/t3404-rebase-interactive.sh                 |   1 -\n t/t3405-rebase-malformed.sh                   |   1 -\n t/t3406-rebase-message.sh                     |   1 -\n t/t3407-rebase-abort.sh                       |   1 -\n t/t3408-rebase-multi-line.sh                  |   1 -\n t/t3409-rebase-environ.sh                     |   1 -\n t/t3412-rebase-root.sh                        |   1 -\n t/t3413-rebase-hook.sh                        |   1 -\n t/t3415-rebase-autosquash.sh                  |   1 -\n t/t3416-rebase-onto-threedots.sh              |   1 -\n t/t3417-rebase-whitespace-fix.sh              |   1 -\n t/t3418-rebase-continue.sh                    |   1 -\n t/t3419-rebase-patch-id.sh                    |   1 -\n t/t3420-rebase-autostash.sh                   |   1 -\n t/t3421-rebase-topology-linear.sh             |   1 -\n t/t3422-rebase-incompatible-options.sh        |   1 -\n t/t3423-rebase-reword.sh                      |   1 -\n t/t3424-rebase-empty.sh                       |   1 -\n t/t3425-rebase-topology-merges.sh             |   1 -\n t/t3426-rebase-submodule.sh                   |   1 -\n t/t3427-rebase-subtree.sh                     |   1 -\n t/t3428-rebase-signoff.sh                     |   1 -\n t/t3429-rebase-edit-todo.sh                   |   1 -\n t/t3430-rebase-merges.sh                      |   1 -\n t/t3431-rebase-fork-point.sh                  |   1 -\n t/t3432-rebase-fast-forward.sh                |   1 -\n t/t3433-rebase-across-mode-change.sh          |   1 -\n t/t3434-rebase-i18n.sh                        |   1 -\n t/t3435-rebase-gpg-sign.sh                    |   1 -\n t/t3436-rebase-more-options.sh                |   1 -\n t/t3437-rebase-fixup-options.sh               |   1 -\n t/t3438-rebase-broken-files.sh                |   1 -\n t/t3500-cherry.sh                             |   1 -\n t/t3501-revert-cherry-pick.sh                 |   1 -\n t/t3502-cherry-pick-merge.sh                  |   1 -\n t/t3503-cherry-pick-root.sh                   |   1 -\n t/t3504-cherry-pick-rerere.sh                 |   1 -\n t/t3505-cherry-pick-empty.sh                  |   1 -\n t/t3506-cherry-pick-ff.sh                     |   1 -\n t/t3507-cherry-pick-conflict.sh               |   1 -\n t/t3508-cherry-pick-many-commits.sh           |   1 -\n t/t3509-cherry-pick-merge-df.sh               |   1 -\n t/t3510-cherry-pick-sequence.sh               |   1 -\n t/t3511-cherry-pick-x.sh                      |   1 -\n t/t3512-cherry-pick-submodule.sh              |   1 -\n t/t3513-revert-submodule.sh                   |   1 -\n t/t3514-cherry-pick-revert-gpg.sh             |   1 -\n t/t3600-rm.sh                                 |   1 -\n t/t3601-rm-pathspec-file.sh                   |   1 -\n t/t3602-rm-sparse-checkout.sh                 |   1 -\n t/t3650-replay-basics.sh                      |   1 -\n t/t3700-add.sh                                |   1 -\n t/t3701-add-interactive.sh                    |   1 -\n t/t3702-add-edit.sh                           |   1 -\n t/t3703-add-magic-pathspec.sh                 |   1 -\n t/t3704-add-pathspec-file.sh                  |   1 -\n t/t3705-add-sparse-checkout.sh                |   1 -\n t/t3800-mktag.sh                              |   1 -\n t/t3900-i18n-commit.sh                        |   1 -\n t/t3901-i18n-patch.sh                         |   1 -\n t/t3902-quoted.sh                             |   1 -\n t/t3903-stash.sh                              |   1 -\n t/t3904-stash-patch.sh                        |   1 -\n t/t3905-stash-include-untracked.sh            |   1 -\n t/t3906-stash-submodule.sh                    |   1 -\n t/t3907-stash-show-config.sh                  |   1 -\n t/t3908-stash-in-worktree.sh                  |   1 -\n t/t3909-stash-pathspec-file.sh                |   1 -\n t/t3920-crlf-messages.sh                      |   1 -\n t/t4000-diff-format.sh                        |   1 -\n t/t4001-diff-rename.sh                        |   1 -\n t/t4002-diff-basic.sh                         |   1 -\n t/t4003-diff-rename-1.sh                      |   1 -\n t/t4004-diff-rename-symlink.sh                |   1 -\n t/t4005-diff-rename-2.sh                      |   1 -\n t/t4006-diff-mode.sh                          |   1 -\n t/t4007-rename-3.sh                           |   1 -\n t/t4008-diff-break-rewrite.sh                 |   1 -\n t/t4009-diff-rename-4.sh                      |   1 -\n t/t4010-diff-pathspec.sh                      |   1 -\n t/t4011-diff-symlink.sh                       |   1 -\n t/t4012-diff-binary.sh                        |   1 -\n t/t4013-diff-various.sh                       |   1 -\n t/t4014-format-patch.sh                       |   1 -\n t/t4015-diff-whitespace.sh                    |   1 -\n t/t4016-diff-quote.sh                         |   1 -\n t/t4017-diff-retval.sh                        |   1 -\n t/t4018-diff-funcname.sh                      |   1 -\n t/t4019-diff-wserror.sh                       |   1 -\n t/t4020-diff-external.sh                      |   5 +-\n t/t4021-format-patch-numbered.sh              |   1 -\n t/t4022-diff-rewrite.sh                       |   1 -\n t/t4023-diff-rename-typechange.sh             |   1 -\n t/t4024-diff-optimize-common.sh               |   1 -\n t/t4025-hunk-header.sh                        |   1 -\n t/t4026-color.sh                              |   1 -\n t/t4027-diff-submodule.sh                     |   1 -\n t/t4028-format-patch-mime-headers.sh          |   1 -\n t/t4029-diff-trailing-space.sh                |   1 -\n t/t4030-diff-textconv.sh                      |   1 -\n t/t4031-diff-rewrite-binary.sh                |   1 -\n t/t4032-diff-inter-hunk-context.sh            |   1 -\n t/t4033-diff-patience.sh                      |   1 -\n t/t4034-diff-words.sh                         |   1 -\n t/t4035-diff-quiet.sh                         |   1 -\n t/t4036-format-patch-signer-mime.sh           |   1 -\n t/t4037-diff-r-t-dirs.sh                      |   1 -\n t/t4038-diff-combined.sh                      |   1 -\n t/t4039-diff-assume-unchanged.sh              |   1 -\n t/t4040-whitespace-status.sh                  |   1 -\n t/t4041-diff-submodule-option.sh              |   1 -\n t/t4042-diff-textconv-caching.sh              |   1 -\n t/t4043-diff-rename-binary.sh                 |   1 -\n t/t4044-diff-index-unique-abbrev.sh           |   1 -\n t/t4045-diff-relative.sh                      |   1 -\n t/t4046-diff-unmerged.sh                      |   1 -\n t/t4047-diff-dirstat.sh                       |   1 -\n t/t4048-diff-combined-binary.sh               |   1 -\n t/t4049-diff-stat-count.sh                    |   1 -\n t/t4050-diff-histogram.sh                     |   1 -\n t/t4051-diff-function-context.sh              |   1 -\n t/t4052-stat-output.sh                        |   1 -\n t/t4053-diff-no-index.sh                      |   1 -\n t/t4054-diff-bogus-tree.sh                    |   1 -\n t/t4055-diff-context.sh                       |   1 -\n t/t4056-diff-order.sh                         |   1 -\n t/t4057-diff-combined-paths.sh                |   1 -\n t/t4058-diff-duplicates.sh                    |   1 -\n t/t4059-diff-submodule-not-initialized.sh     |   1 -\n t/t4060-diff-submodule-option-diff-format.sh  |   1 -\n t/t4061-diff-indent.sh                        |   1 -\n t/t4062-diff-pickaxe.sh                       |   1 -\n t/t4063-diff-blobs.sh                         |   1 -\n t/t4064-diff-oidfind.sh                       |   1 -\n t/t4065-diff-anchored.sh                      |   1 -\n t/t4066-diff-emit-delay.sh                    |   1 -\n t/t4067-diff-partial-clone.sh                 |   1 -\n t/t4068-diff-symmetric-merge-base.sh          |   1 -\n t/t4069-remerge-diff.sh                       |   1 -\n t/t4100-apply-stat.sh                         |   1 -\n t/t4101-apply-nonl.sh                         |   1 -\n t/t4102-apply-rename.sh                       |   1 -\n t/t4103-apply-binary.sh                       |   1 -\n t/t4104-apply-boundary.sh                     |   1 -\n t/t4105-apply-fuzz.sh                         |   1 -\n t/t4106-apply-stdin.sh                        |   1 -\n t/t4107-apply-ignore-whitespace.sh            |   1 -\n t/t4108-apply-threeway.sh                     |   1 -\n t/t4109-apply-multifrag.sh                    |   1 -\n t/t4110-apply-scan.sh                         |   1 -\n t/t4111-apply-subdir.sh                       |   1 -\n t/t4112-apply-renames.sh                      |   1 -\n t/t4113-apply-ending.sh                       |   1 -\n t/t4114-apply-typechange.sh                   |   1 -\n t/t4115-apply-symlink.sh                      |   1 -\n t/t4116-apply-reverse.sh                      |   1 -\n t/t4117-apply-reject.sh                       |   1 -\n t/t4118-apply-empty-context.sh                |   1 -\n t/t4119-apply-config.sh                       |   1 -\n t/t4120-apply-popt.sh                         |   1 -\n t/t4121-apply-diffs.sh                        |   1 -\n t/t4122-apply-symlink-inside.sh               |   1 -\n t/t4123-apply-shrink.sh                       |   1 -\n t/t4124-apply-ws-rule.sh                      |   1 -\n t/t4125-apply-ws-fuzz.sh                      |   1 -\n t/t4126-apply-empty.sh                        |   1 -\n t/t4127-apply-same-fn.sh                      |   1 -\n t/t4128-apply-root.sh                         |   1 -\n t/t4129-apply-samemode.sh                     |   1 -\n t/t4130-apply-criss-cross-rename.sh           |   1 -\n t/t4131-apply-fake-ancestor.sh                |   1 -\n t/t4132-apply-removal.sh                      |   1 -\n t/t4133-apply-filenames.sh                    |   1 -\n t/t4134-apply-submodule.sh                    |   1 -\n t/t4135-apply-weird-filenames.sh              |   1 -\n t/t4136-apply-check.sh                        |   1 -\n t/t4137-apply-submodule.sh                    |   1 -\n t/t4138-apply-ws-expansion.sh                 |   1 -\n t/t4139-apply-escape.sh                       |   1 -\n t/t4140-apply-ita.sh                          |   1 -\n t/t4141-apply-too-large.sh                    |   1 -\n t/t4150-am.sh                                 |   1 -\n t/t4151-am-abort.sh                           |   1 -\n t/t4152-am-subjects.sh                        |   1 -\n t/t4153-am-resume-override-opts.sh            |   1 -\n t/t4200-rerere.sh                             |   1 -\n t/t4201-shortlog.sh                           |   1 -\n t/t4202-log.sh                                |   1 -\n t/t4203-mailmap.sh                            |   1 -\n t/t4204-patch-id.sh                           |   1 -\n t/t4205-log-pretty-formats.sh                 |   1 -\n t/t4206-log-follow-harder-copies.sh           |   1 -\n t/t4207-log-decoration-colors.sh              |   1 -\n t/t4208-log-magic-pathspec.sh                 |   1 -\n t/t4209-log-pickaxe.sh                        |   1 -\n t/t4210-log-i18n.sh                           |   1 -\n t/t4212-log-corrupt.sh                        |   1 -\n t/t4213-log-tabexpand.sh                      |   1 -\n t/t4214-log-graph-octopus.sh                  |   1 -\n t/t4215-log-skewed-merges.sh                  |   1 -\n t/t4216-log-bloom.sh                          |   1 -\n t/t4217-log-limit.sh                          |   1 -\n t/t4252-am-options.sh                         |   1 -\n t/t4253-am-keep-cr-dos.sh                     |   1 -\n t/t4254-am-corrupt.sh                         |   1 -\n t/t4255-am-submodule.sh                       |   1 -\n t/t4256-am-format-flowed.sh                   |   1 -\n t/t4257-am-interactive.sh                     |   1 -\n t/t4258-am-quoted-cr.sh                       |   1 -\n t/t4300-merge-tree.sh                         |   1 -\n t/t4301-merge-tree-write-tree.sh              |   1 -\n t/t5000-tar-tree.sh                           |   1 -\n t/t5001-archive-attr.sh                       |   1 -\n t/t5002-archive-attr-pattern.sh               |   1 -\n t/t5003-archive-zip.sh                        |   1 -\n t/t5004-archive-corner-cases.sh               |   1 -\n t/t5100-mailinfo.sh                           |   1 -\n t/t5150-request-pull.sh                       |   1 -\n t/t5200-update-server-info.sh                 |   1 -\n t/t5300-pack-object.sh                        |   1 -\n t/t5301-sliding-window.sh                     |   1 -\n t/t5302-pack-index.sh                         |   1 -\n t/t5303-pack-corruption-resilience.sh         |   1 -\n t/t5304-prune.sh                              |   1 -\n t/t5305-include-tag.sh                        |   1 -\n t/t5306-pack-nobase.sh                        |   1 -\n t/t5307-pack-missing-commit.sh                |   1 -\n t/t5308-pack-detect-duplicates.sh             |   1 -\n t/t5309-pack-delta-cycles.sh                  |   1 -\n t/t5310-pack-bitmaps.sh                       |   1 -\n t/t5311-pack-bitmaps-shallow.sh               |   1 -\n t/t5312-prune-corruption.sh                   |   1 -\n t/t5313-pack-bounds-checks.sh                 |   1 -\n t/t5314-pack-cycle-detection.sh               |   1 -\n t/t5315-pack-objects-compression.sh           |   1 -\n t/t5316-pack-delta-depth.sh                   |   1 -\n t/t5317-pack-objects-filter-objects.sh        |   1 -\n t/t5318-commit-graph.sh                       |   1 -\n t/t5319-multi-pack-index.sh                   |   1 -\n t/t5320-delta-islands.sh                      |   1 -\n t/t5321-pack-large-objects.sh                 |   1 -\n t/t5322-pack-objects-sparse.sh                |   1 -\n t/t5323-pack-redundant.sh                     |   1 -\n t/t5324-split-commit-graph.sh                 |   1 -\n t/t5325-reverse-index.sh                      |   1 -\n t/t5326-multi-pack-bitmaps.sh                 |   1 -\n t/t5327-multi-pack-bitmaps-rev.sh             |   1 -\n t/t5328-commit-graph-64bit-time.sh            |   1 -\n t/t5329-pack-objects-cruft.sh                 |   1 -\n t/t5330-no-lazy-fetch-with-commit-graph.sh    |   1 -\n t/t5331-pack-objects-stdin.sh                 |   1 -\n t/t5332-multi-pack-reuse.sh                   |   1 -\n t/t5333-pseudo-merge-bitmaps.sh               |   1 -\n t/t5334-incremental-multi-pack-index.sh       |   1 -\n t/t5351-unpack-large-objects.sh               |   1 -\n t/t5400-send-pack.sh                          |   1 -\n t/t5401-update-hooks.sh                       |   1 -\n t/t5402-post-merge-hook.sh                    |   1 -\n t/t5403-post-checkout-hook.sh                 |   1 -\n t/t5404-tracking-branches.sh                  |   1 -\n t/t5405-send-pack-rewind.sh                   |   1 -\n t/t5406-remote-rejects.sh                     |   1 -\n t/t5407-post-rewrite-hook.sh                  |   1 -\n t/t5408-send-pack-stdin.sh                    |   1 -\n t/t5409-colorize-remote-messages.sh           |   1 -\n t/t5410-receive-pack-alternates.sh            |   1 -\n t/t5411-proc-receive-hook.sh                  |   1 -\n t/t5500-fetch-pack.sh                         |   1 -\n t/t5501-fetch-push-alternates.sh              |   1 -\n t/t5502-quickfetch.sh                         |   1 -\n t/t5503-tagfollow.sh                          |   1 -\n t/t5504-fetch-receive-strict.sh               |   1 -\n t/t5505-remote.sh                             |   1 -\n t/t5506-remote-groups.sh                      |   1 -\n t/t5507-remote-environment.sh                 |   1 -\n t/t5509-fetch-push-namespaces.sh              |   1 -\n t/t5510-fetch.sh                              |   1 -\n t/t5511-refspec.sh                            |   1 -\n t/t5512-ls-remote.sh                          |   1 -\n t/t5513-fetch-track.sh                        |   1 -\n t/t5514-fetch-multiple.sh                     |   1 -\n t/t5515-fetch-merge-logic.sh                  |   1 -\n t/t5516-fetch-push.sh                         |   1 -\n t/t5517-push-mirror.sh                        |   1 -\n t/t5518-fetch-exit-status.sh                  |   1 -\n t/t5519-push-alternates.sh                    |   1 -\n t/t5520-pull.sh                               |   1 -\n t/t5521-pull-options.sh                       |   1 -\n t/t5522-pull-symlink.sh                       |   1 -\n t/t5523-push-upstream.sh                      |   1 -\n t/t5524-pull-msg.sh                           |   1 -\n t/t5525-fetch-tagopt.sh                       |   1 -\n t/t5526-fetch-submodules.sh                   |   1 -\n t/t5527-fetch-odd-refs.sh                     |   1 -\n t/t5528-push-default.sh                       |   1 -\n t/t5529-push-errors.sh                        |   1 -\n t/t5530-upload-pack-error.sh                  |   1 -\n t/t5531-deep-submodule-push.sh                |   1 -\n t/t5532-fetch-proxy.sh                        |   1 -\n t/t5533-push-cas.sh                           |   1 -\n t/t5534-push-signed.sh                        |   1 -\n t/t5535-fetch-push-symref.sh                  |   1 -\n t/t5536-fetch-conflicts.sh                    |   1 -\n t/t5537-fetch-shallow.sh                      |   1 -\n t/t5538-push-shallow.sh                       |   1 -\n t/t5539-fetch-http-shallow.sh                 |   1 -\n t/t5540-http-push-webdav.sh                   |   1 -\n t/t5541-http-push-smart.sh                    |   1 -\n t/t5542-push-http-shallow.sh                  |   1 -\n t/t5543-atomic-push.sh                        |   1 -\n t/t5544-pack-objects-hook.sh                  |   1 -\n t/t5545-push-options.sh                       |   1 -\n t/t5546-receive-limits.sh                     |   1 -\n t/t5547-push-quarantine.sh                    |   1 -\n t/t5548-push-porcelain.sh                     |   1 -\n t/t5549-fetch-push-http.sh                    |   1 -\n t/t5550-http-fetch-dumb.sh                    |   1 -\n t/t5551-http-fetch-smart.sh                   |   1 -\n t/t5552-skipping-fetch-negotiator.sh          |   1 -\n t/t5553-set-upstream.sh                       |   1 -\n t/t5554-noop-fetch-negotiator.sh              |   1 -\n t/t5555-http-smart-common.sh                  |   1 -\n t/t5557-http-get.sh                           |   1 -\n t/t5560-http-backend-noserver.sh              |   1 -\n t/t5561-http-backend.sh                       |   1 -\n t/t5562-http-backend-content-length.sh        |   1 -\n t/t5563-simple-http-auth.sh                   |   1 -\n t/t5564-http-proxy.sh                         |   1 -\n t/t5570-git-daemon.sh                         |   1 -\n t/t5571-pre-push-hook.sh                      |   1 -\n t/t5572-pull-submodule.sh                     |   1 -\n t/t5573-pull-verify-signatures.sh             |   1 -\n t/t5574-fetch-output.sh                       |   1 -\n t/t5580-unc-paths.sh                          |   1 -\n t/t5581-http-curl-verbose.sh                  |   1 -\n t/t5582-fetch-negative-refspec.sh             |   1 -\n t/t5583-push-branches.sh                      |   1 -\n t/t5600-clone-fail-cleanup.sh                 |   1 -\n t/t5601-clone.sh                              |  26 ++--\n t/t5602-clone-remote-exec.sh                  |   1 -\n t/t5603-clone-dirname.sh                      |   1 -\n t/t5604-clone-reference.sh                    |   1 -\n t/t5605-clone-local.sh                        |   1 -\n t/t5606-clone-options.sh                      |   1 -\n t/t5607-clone-bundle.sh                       |   1 -\n t/t5609-clone-branch.sh                       |   1 -\n t/t5610-clone-detached.sh                     |   1 -\n t/t5611-clone-config.sh                       |   1 -\n t/t5612-clone-refspec.sh                      |   1 -\n t/t5613-info-alternate.sh                     |   1 -\n t/t5614-clone-submodules-shallow.sh           |   1 -\n t/t5615-alternate-env.sh                      |   1 -\n t/t5616-partial-clone.sh                      |   1 -\n t/t5617-clone-submodules-remote.sh            |   1 -\n t/t5618-alternate-refs.sh                     |   1 -\n t/t5619-clone-local-ambiguous-transport.sh    |   1 -\n t/t5700-protocol-v1.sh                        |   1 -\n t/t5701-git-serve.sh                          |   1 -\n t/t5702-protocol-v2.sh                        |   1 -\n t/t5703-upload-pack-ref-in-want.sh            |   1 -\n t/t5704-protocol-violations.sh                |   1 -\n t/t5705-session-id-in-capabilities.sh         |   1 -\n t/t5730-protocol-v2-bundle-uri-file.sh        |   1 -\n t/t5731-protocol-v2-bundle-uri-git.sh         |   1 -\n t/t5732-protocol-v2-bundle-uri-http.sh        |   1 -\n t/t5750-bundle-uri-parse.sh                   |   1 -\n t/t5801-remote-helpers.sh                     |   1 -\n t/t5802-connect-helper.sh                     |   1 -\n t/t5810-proto-disable-local.sh                |   1 -\n t/t5811-proto-disable-git.sh                  |   1 -\n t/t5812-proto-disable-http.sh                 |   1 -\n t/t5813-proto-disable-ssh.sh                  |   1 -\n t/t5814-proto-disable-ext.sh                  |   1 -\n t/t5815-submodule-protos.sh                   |   1 -\n t/t5900-repo-selection.sh                     |   1 -\n t/t6000-rev-list-misc.sh                      |   1 -\n t/t6001-rev-list-graft.sh                     |   1 -\n t/t6002-rev-list-bisect.sh                    |   1 -\n t/t6003-rev-list-topo-order.sh                |   1 -\n t/t6004-rev-list-path-optim.sh                |   1 -\n t/t6005-rev-list-count.sh                     |   1 -\n t/t6006-rev-list-format.sh                    |   1 -\n t/t6007-rev-list-cherry-pick-file.sh          |   1 -\n t/t6008-rev-list-submodule.sh                 |   1 -\n t/t6009-rev-list-parent.sh                    |   1 -\n t/t6010-merge-base.sh                         |   1 -\n t/t6011-rev-list-with-bad-commit.sh           |   1 -\n t/t6012-rev-list-simplify.sh                  |   1 -\n t/t6013-rev-list-reverse-parents.sh           |   1 -\n t/t6014-rev-list-all.sh                       |   1 -\n t/t6016-rev-list-graph-simplify-history.sh    |   1 -\n t/t6017-rev-list-stdin.sh                     |   1 -\n t/t6018-rev-list-glob.sh                      |   1 -\n t/t6019-rev-list-ancestry-path.sh             |   1 -\n t/t6020-bundle-misc.sh                        |   1 -\n t/t6021-rev-list-exclude-hidden.sh            |   1 -\n t/t6022-rev-list-missing.sh                   |   1 -\n t/t6040-tracking-info.sh                      |   1 -\n t/t6041-bisect-submodule.sh                   |   1 -\n t/t6050-replace.sh                            |   1 -\n t/t6060-merge-index.sh                        |   1 -\n t/t6100-rev-list-in-order.sh                  |   1 -\n t/t6101-rev-parse-parents.sh                  |   1 -\n t/t6102-rev-list-unexpected-objects.sh        |   1 -\n t/t6110-rev-list-sparse.sh                    |   1 -\n t/t6111-rev-list-treesame.sh                  |   1 -\n t/t6112-rev-list-filters-objects.sh           |   1 -\n t/t6113-rev-list-bitmap-filters.sh            |   1 -\n t/t6114-keep-packs.sh                         |   1 -\n t/t6115-rev-list-du.sh                        |   1 -\n t/t6120-describe.sh                           |   1 -\n t/t6130-pathspec-noglob.sh                    |   1 -\n t/t6131-pathspec-icase.sh                     |   1 -\n t/t6132-pathspec-exclude.sh                   |   1 -\n t/t6133-pathspec-rev-dwim.sh                  |   1 -\n t/t6134-pathspec-in-submodule.sh              |   1 -\n t/t6135-pathspec-with-attrs.sh                |   1 -\n t/t6136-pathspec-in-bare.sh                   |   1 -\n t/t6200-fmt-merge-msg.sh                      |   1 -\n t/t6300-for-each-ref.sh                       |   1 -\n t/t6301-for-each-ref-errors.sh                |   1 -\n t/t6302-for-each-ref-filter.sh                |   1 -\n t/t6400-merge-df.sh                           |   1 -\n t/t6401-merge-criss-cross.sh                  |   1 -\n t/t6402-merge-rename.sh                       |   1 -\n t/t6403-merge-file.sh                         |   1 -\n t/t6404-recursive-merge.sh                    |   1 -\n t/t6405-merge-symlinks.sh                     |   1 -\n t/t6406-merge-attr.sh                         |   1 -\n t/t6407-merge-binary.sh                       |   1 -\n t/t6408-merge-up-to-date.sh                   |   1 -\n t/t6409-merge-subtree.sh                      |   1 -\n t/t6411-merge-filemode.sh                     |   1 -\n t/t6412-merge-large-rename.sh                 |   1 -\n t/t6413-merge-crlf.sh                         |   1 -\n t/t6414-merge-rename-nocruft.sh               |   1 -\n t/t6415-merge-dir-to-symlink.sh               |   1 -\n t/t6416-recursive-corner-cases.sh             |   1 -\n t/t6417-merge-ours-theirs.sh                  |   1 -\n t/t6418-merge-text-auto.sh                    |   1 -\n t/t6421-merge-partial-clone.sh                |   1 -\n t/t6422-merge-rename-corner-cases.sh          |   1 -\n t/t6423-merge-rename-directories.sh           |   1 -\n t/t6424-merge-unrelated-index-changes.sh      |   1 -\n t/t6425-merge-rename-delete.sh                |   1 -\n t/t6426-merge-skip-unneeded-updates.sh        |   1 -\n t/t6427-diff3-conflict-markers.sh             |   1 -\n t/t6428-merge-conflicts-sparse.sh             |   1 -\n t/t6429-merge-sequence-rename-caching.sh      |   1 -\n t/t6430-merge-recursive.sh                    |   1 -\n t/t6431-merge-criscross.sh                    |   1 -\n t/t6432-merge-recursive-space-options.sh      |   1 -\n t/t6433-merge-toplevel.sh                     |   1 -\n t/t6434-merge-recursive-rename-options.sh     |   1 -\n t/t6435-merge-sparse.sh                       |   1 -\n t/t6436-merge-overwrite.sh                    |   1 -\n t/t6437-submodule-merge.sh                    |   1 -\n t/t6438-submodule-directory-file-conflicts.sh |   1 -\n t/t6439-merge-co-error-msgs.sh                |   1 -\n t/t6500-gc.sh                                 |   1 -\n t/t6501-freshen-objects.sh                    |   1 -\n t/t6600-test-reach.sh                         |   1 -\n t/t6700-tree-depth.sh                         |   1 -\n t/t7001-mv.sh                                 |   1 -\n t/t7002-mv-sparse-checkout.sh                 |   1 -\n t/t7003-filter-branch.sh                      |   1 -\n t/t7004-tag.sh                                |   1 -\n t/t7005-editor.sh                             |   1 -\n t/t7006-pager.sh                              |   1 -\n t/t7007-show.sh                               |   1 -\n t/t7008-filter-branch-null-sha1.sh            |   1 -\n t/t7010-setup.sh                              |   1 -\n t/t7011-skip-worktree-reading.sh              |   1 -\n t/t7012-skip-worktree-writing.sh              |   1 -\n t/t7030-verify-tag.sh                         |   1 -\n t/t7031-verify-tag-signed-ssh.sh              |   1 -\n t/t7060-wtstatus.sh                           |   1 -\n t/t7061-wtstatus-ignore.sh                    |   1 -\n t/t7062-wtstatus-ignorecase.sh                |   1 -\n t/t7063-status-untracked-cache.sh             |   1 -\n t/t7064-wtstatus-pv2.sh                       |   1 -\n t/t7101-reset-empty-subdirs.sh                |   1 -\n t/t7102-reset.sh                              |   1 -\n t/t7103-reset-bare.sh                         |   1 -\n t/t7104-reset-hard.sh                         |   1 -\n t/t7105-reset-patch.sh                        |   1 -\n t/t7106-reset-unborn-branch.sh                |   1 -\n t/t7107-reset-pathspec-file.sh                |   1 -\n t/t7110-reset-merge.sh                        |   1 -\n t/t7111-reset-table.sh                        |   1 -\n t/t7112-reset-submodule.sh                    |   1 -\n t/t7113-post-index-change-hook.sh             |   1 -\n t/t7201-co.sh                                 |   1 -\n t/t7300-clean.sh                              |   1 -\n t/t7301-clean-interactive.sh                  |   1 -\n t/t7400-submodule-basic.sh                    |   1 -\n t/t7401-submodule-summary.sh                  |   1 -\n t/t7402-submodule-rebase.sh                   |   1 -\n t/t7403-submodule-sync.sh                     |   1 -\n t/t7406-submodule-update.sh                   |   1 -\n t/t7407-submodule-foreach.sh                  |   1 -\n t/t7408-submodule-reference.sh                |   1 -\n t/t7409-submodule-detached-work-tree.sh       |   1 -\n t/t7411-submodule-config.sh                   |   1 -\n t/t7412-submodule-absorbgitdirs.sh            |   1 -\n t/t7413-submodule-is-active.sh                |   1 -\n t/t7414-submodule-mistakes.sh                 |   1 -\n t/t7416-submodule-dash-url.sh                 |   1 -\n t/t7417-submodule-path-url.sh                 |   1 -\n t/t7418-submodule-sparse-gitmodules.sh        |   1 -\n t/t7419-submodule-set-branch.sh               |   1 -\n t/t7420-submodule-set-url.sh                  |   1 -\n t/t7421-submodule-summary-add.sh              |   1 -\n t/t7422-submodule-output.sh                   |   1 -\n t/t7423-submodule-symlinks.sh                 |   1 -\n t/t7424-submodule-mixed-ref-formats.sh        |   1 -\n t/t7450-bad-git-dotfiles.sh                   |   1 -\n t/t7500-commit-template-squash-signoff.sh     |   1 -\n t/t7501-commit-basic-functionality.sh         |   1 -\n t/t7502-commit-porcelain.sh                   |   1 -\n ...3-pre-commit-and-pre-merge-commit-hooks.sh |   1 -\n t/t7504-commit-msg-hook.sh                    |   1 -\n t/t7505-prepare-commit-msg-hook.sh            |   1 -\n t/t7506-status-submodule.sh                   |   1 -\n t/t7507-commit-verbose.sh                     |   1 -\n t/t7508-status.sh                             |   1 -\n t/t7509-commit-authorship.sh                  |   1 -\n t/t7510-signed-commit.sh                      |   1 -\n t/t7511-status-index.sh                       |   1 -\n t/t7512-status-help.sh                        |   1 -\n t/t7513-interpret-trailers.sh                 |   1 -\n t/t7514-commit-patch.sh                       |   1 -\n t/t7515-status-symlinks.sh                    |   1 -\n t/t7516-commit-races.sh                       |   1 -\n t/t7517-per-repo-email.sh                     |   1 -\n t/t7518-ident-corner-cases.sh                 |   1 -\n t/t7519-status-fsmonitor.sh                   |   1 -\n t/t7520-ignored-hook-warning.sh               |   1 -\n t/t7521-ignored-mode.sh                       |   1 -\n t/t7524-commit-summary.sh                     |   1 -\n t/t7525-status-rename.sh                      |   1 -\n t/t7526-commit-pathspec-file.sh               |   1 -\n t/t7528-signed-commit-ssh.sh                  |   1 -\n t/t7600-merge.sh                              |   1 -\n t/t7601-merge-pull-config.sh                  |   1 -\n t/t7602-merge-octopus-many.sh                 |   1 -\n t/t7603-merge-reduce-heads.sh                 |   1 -\n t/t7604-merge-custom-message.sh               |   1 -\n t/t7605-merge-resolve.sh                      |   1 -\n t/t7606-merge-custom.sh                       |   1 -\n t/t7607-merge-state.sh                        |   1 -\n t/t7608-merge-messages.sh                     |   1 -\n t/t7609-mergetool--lib.sh                     |   1 -\n t/t7610-mergetool.sh                          |   1 -\n t/t7611-merge-abort.sh                        |   1 -\n t/t7612-merge-verify-signatures.sh            |   1 -\n t/t7614-merge-signoff.sh                      |   1 -\n t/t7615-diff-algo-with-mergy-operations.sh    |   1 -\n t/t7700-repack.sh                             |   1 -\n t/t7701-repack-unpack-unreachable.sh          |   1 -\n t/t7702-repack-cyclic-alternate.sh            |   1 -\n t/t7703-repack-geometric.sh                   |   1 -\n t/t7704-repack-cruft.sh                       |   1 -\n t/t7800-difftool.sh                           |   1 -\n t/t7810-grep.sh                               |   1 -\n t/t7811-grep-open.sh                          |   1 -\n t/t7812-grep-icase-non-ascii.sh               |   1 -\n t/t7813-grep-icase-iso.sh                     |   1 -\n t/t7814-grep-recurse-submodules.sh            |   1 -\n t/t7815-grep-binary.sh                        |   1 -\n t/t7816-grep-binary-pattern.sh                |   1 -\n t/t7817-grep-sparse-checkout.sh               |   1 -\n t/t7900-maintenance.sh                        |   1 -\n t/t8001-annotate.sh                           |   1 -\n t/t8002-blame.sh                              |   1 -\n t/t8003-blame-corner-cases.sh                 |   1 -\n t/t8004-blame-with-conflicts.sh               |   1 -\n t/t8005-blame-i18n.sh                         |   1 +\n t/t8006-blame-textconv.sh                     |   1 -\n t/t8007-cat-file-textconv.sh                  |   1 -\n t/t8008-blame-formats.sh                      |   1 -\n t/t8009-blame-vs-topicbranches.sh             |   1 -\n t/t8010-cat-file-filters.sh                   |   1 -\n t/t8011-blame-split-file.sh                   |   1 -\n t/t8012-blame-colors.sh                       |   1 -\n t/t8013-blame-ignore-revs.sh                  |   1 -\n t/t8014-blame-ignore-fuzzy.sh                 |   1 -\n t/t9001-send-email.sh                         |   1 -\n t/t9002-column.sh                             |   1 -\n t/t9003-help-autocorrect.sh                   |   1 -\n t/t9200-git-cvsexportcommit.sh                |   1 -\n t/t9210-scalar.sh                             |   1 -\n t/t9211-scalar-clone.sh                       |   1 -\n t/t9300-fast-import.sh                        |   1 -\n t/t9301-fast-import-notes.sh                  |   1 -\n t/t9302-fast-import-unpack-limit.sh           |   1 -\n t/t9303-fast-import-compression.sh            |   1 -\n t/t9304-fast-import-marks.sh                  |   1 -\n t/t9350-fast-export.sh                        |   1 -\n t/t9351-fast-export-anonymize.sh              |   1 -\n t/t9400-git-cvsserver-server.sh               |   1 -\n t/t9401-git-cvsserver-crlf.sh                 |   1 -\n t/t9402-git-cvsserver-refs.sh                 |   1 -\n t/t9500-gitweb-standalone-no-errors.sh        |   1 -\n t/t9501-gitweb-standalone-http-status.sh      |   1 -\n t/t9502-gitweb-standalone-parse-output.sh     |   1 -\n t/t9600-cvsimport.sh                          |   1 -\n t/t9601-cvsimport-vendor-branch.sh            |   1 -\n t/t9602-cvsimport-branches-tags.sh            |   1 -\n t/t9603-cvsimport-patchsets.sh                |   1 -\n t/t9604-cvsimport-timestamps.sh               |   1 -\n t/t9700-perl-git.sh                           |   1 -\n t/t9800-git-p4-basic.sh                       |   1 -\n t/t9801-git-p4-branch.sh                      |   1 -\n t/t9802-git-p4-filetype.sh                    |   1 -\n t/t9803-git-p4-shell-metachars.sh             |   1 -\n t/t9804-git-p4-label.sh                       |   1 -\n t/t9805-git-p4-skip-submit-edit.sh            |   1 -\n t/t9806-git-p4-options.sh                     |   1 -\n t/t9808-git-p4-chdir.sh                       |   1 -\n t/t9809-git-p4-client-view.sh                 |   1 -\n t/t9810-git-p4-rcs.sh                         |   1 -\n t/t9811-git-p4-label-import.sh                |   1 -\n t/t9812-git-p4-wildcards.sh                   |   1 -\n t/t9813-git-p4-preserve-users.sh              |   1 -\n t/t9814-git-p4-rename.sh                      |   1 -\n t/t9815-git-p4-submit-fail.sh                 |   1 -\n t/t9816-git-p4-locked.sh                      |   1 -\n t/t9817-git-p4-exclude.sh                     |   1 -\n t/t9818-git-p4-block.sh                       |   1 -\n t/t9819-git-p4-case-folding.sh                |   1 -\n t/t9820-git-p4-editor-handling.sh             |   1 -\n t/t9821-git-p4-path-variations.sh             |   1 -\n t/t9822-git-p4-path-encoding.sh               |   1 -\n t/t9823-git-p4-mock-lfs.sh                    |   1 -\n t/t9825-git-p4-handle-utf16-without-bom.sh    |   1 -\n t/t9826-git-p4-keep-empty-commits.sh          |   1 -\n t/t9827-git-p4-change-filetype.sh             |   1 -\n t/t9828-git-p4-map-user.sh                    |   1 -\n t/t9829-git-p4-jobs.sh                        |   1 -\n t/t9830-git-p4-symlink-dir.sh                 |   1 -\n t/t9831-git-p4-triggers.sh                    |   1 -\n t/t9832-unshelve.sh                           |   1 -\n t/t9833-errors.sh                             |   1 -\n t/t9834-git-p4-file-dir-bug.sh                |   1 -\n t/t9835-git-p4-metadata-encoding-python2.sh   |   1 -\n t/t9836-git-p4-metadata-encoding-python3.sh   |   1 -\n t/t9850-shell.sh                              |   1 -\n t/t9901-git-web--browse.sh                    |   1 -\n t/t9902-completion.sh                         |   1 -\n t/t9903-bash-prompt.sh                        |   1 -\n t/test-lib.sh                                 |  72 +---------\n t/unit-tests/strvec.c                         |  65 +++++++++\n usage.c                                       |  15 ---\n 950 files changed, 376 insertions(+), 1253 deletions(-)\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506720","messageId":"732dc6642aa040455f8b5c73fee3417da524e0c8.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 01/26] builtin/blame: fix leaking blame entries with `--incremental`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:10:20Z","receivedAt":"2024-11-06T15:10:30Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"When passing `--incremental` to git-blame(1) we exit early by jumping to\nthe `cleanup` label. But some of the cleanups we perform are handled\nbetween the `goto` and its label, and thus we leak the data.\n\nMove the cleanups after the `cleanup` label. While at it, move the logic\nto free the scoreboard's `final_buf` into `cleanup_scoreboard()` and\ndrop its `const` declaration.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n blame.c               |  1 +\n blame.h               |  2 +-\n builtin/blame.c       | 12 ++++++------\n t/t8005-blame-i18n.sh |  2 ++\n 4 files changed, 10 insertions(+), 7 deletions(-)\n\ndiff --git a/blame.c b/blame.c\nindex 90633380cd5..bf69768a7de 100644\n--- a/blame.c\n+++ b/blame.c\n@@ -2931,6 +2931,7 @@ void setup_blame_bloom_data(struct blame_scoreboard *sb)\n void cleanup_scoreboard(struct blame_scoreboard *sb)\n {\n \tfree(sb->lineno);\n+\tfree(sb->final_buf);\n \tclear_prio_queue(&sb->commits);\n \toidset_clear(&sb->ignore_list);\n \ndiff --git a/blame.h b/blame.h\nindex 5b4e47d44c6..3b34be0e5c6 100644\n--- a/blame.h\n+++ b/blame.h\n@@ -116,7 +116,7 @@ struct blame_scoreboard {\n \t * Used by many functions to obtain contents of the nth line,\n \t * indexed with scoreboard.lineno[blame_entry.lno].\n \t */\n-\tconst char *final_buf;\n+\tchar *final_buf;\n \tunsigned long final_buf_size;\n \n \t/* linked list of blames */\ndiff --git a/builtin/blame.c b/builtin/blame.c\nindex e407a22da3b..6a7bb3b0724 100644\n--- a/builtin/blame.c\n+++ b/builtin/blame.c\n@@ -1216,12 +1216,6 @@ int cmd_blame(int argc,\n \t\toutput_option &= ~(OUTPUT_COLOR_LINE | OUTPUT_SHOW_AGE_WITH_COLOR);\n \n \toutput(&sb, output_option);\n-\tfree((void *)sb.final_buf);\n-\tfor (ent = sb.ent; ent; ) {\n-\t\tstruct blame_entry *e = ent->next;\n-\t\tfree(ent);\n-\t\tent = e;\n-\t}\n \n \tif (show_stats) {\n \t\tprintf(\"num read blob: %d\\n\", sb.num_read_blob);\n@@ -1230,6 +1224,12 @@ int cmd_blame(int argc,\n \t}\n \n cleanup:\n+\tfor (ent = sb.ent; ent; ) {\n+\t\tstruct blame_entry *e = ent->next;\n+\t\tfree(ent);\n+\t\tent = e;\n+\t}\n+\n \tfree(path);\n \tcleanup_scoreboard(&sb);\n \trelease_revisions(&revs);\ndiff --git a/t/t8005-blame-i18n.sh b/t/t8005-blame-i18n.sh\nindex 7a1f581c240..fa765aff99a 100755\n--- a/t/t8005-blame-i18n.sh\n+++ b/t/t8005-blame-i18n.sh\n@@ -1,6 +1,8 @@\n #!/bin/sh\n \n test_description='git blame encoding conversion'\n+\n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n if ! test_have_prereq ICONV\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506722","messageId":"cdc06afa6dbb11a0a6ffcdaf20053b66a2fe3974.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 02/26] bisect: fix leaking good/bad terms when reading multipe times","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:10:23Z","receivedAt":"2024-11-06T15:10:32Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"Even though `read_bisect_terms()` is declared as assigning string\nconstants, it in fact assigns allocated strings to the `read_bad` and\n`read_good` out parameters. The only callers of this function assign the\nresult to global variables and thus don't have to free them in order to\nbe leak-free. But that changes when executing the function multiple\ntimes because we'd then overwrite the previous value and thus make it\nunreachable.\n\nFix the function signature and free the previous values. This leak is\nexposed by t0630, but plugging it does not make the whole test suite\npass.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n bisect.c   | 14 +++++++++-----\n bisect.h   |  2 +-\n revision.c |  4 ++--\n 3 files changed, 12 insertions(+), 8 deletions(-)\n\ndiff --git a/bisect.c b/bisect.c\nindex 4713226fad4..9c52241050c 100644\n--- a/bisect.c\n+++ b/bisect.c\n@@ -28,8 +28,8 @@ static struct oid_array skipped_revs;\n \n static struct object_id *current_bad_oid;\n \n-static const char *term_bad;\n-static const char *term_good;\n+static char *term_bad;\n+static char *term_good;\n \n /* Remember to update object flag allocation in object.h */\n #define COUNTED\t\t(1u<<16)\n@@ -985,7 +985,7 @@ static void show_commit(struct commit *commit)\n  * We read them and store them to adapt the messages accordingly.\n  * Default is bad/good.\n  */\n-void read_bisect_terms(const char **read_bad, const char **read_good)\n+void read_bisect_terms(char **read_bad, char **read_good)\n {\n \tstruct strbuf str = STRBUF_INIT;\n \tconst char *filename = git_path_bisect_terms();\n@@ -993,16 +993,20 @@ void read_bisect_terms(const char **read_bad, const char **read_good)\n \n \tif (!fp) {\n \t\tif (errno == ENOENT) {\n-\t\t\t*read_bad = \"bad\";\n-\t\t\t*read_good = \"good\";\n+\t\t\tfree(*read_bad);\n+\t\t\t*read_bad = xstrdup(\"bad\");\n+\t\t\tfree(*read_good);\n+\t\t\t*read_good = xstrdup(\"good\");\n \t\t\treturn;\n \t\t} else {\n \t\t\tdie_errno(_(\"could not read file '%s'\"), filename);\n \t\t}\n \t} else {\n \t\tstrbuf_getline_lf(&str, fp);\n+\t\tfree(*read_bad);\n \t\t*read_bad = strbuf_detach(&str, NULL);\n \t\tstrbuf_getline_lf(&str, fp);\n+\t\tfree(*read_good);\n \t\t*read_good = strbuf_detach(&str, NULL);\n \t}\n \tstrbuf_release(&str);\ndiff --git a/bisect.h b/bisect.h\nindex ee3fd65f3bd..944439bfac7 100644\n--- a/bisect.h\n+++ b/bisect.h\n@@ -75,7 +75,7 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix);\n \n int estimate_bisect_steps(int all);\n \n-void read_bisect_terms(const char **bad, const char **good);\n+void read_bisect_terms(char **bad, char **good);\n \n int bisect_clean_state(void);\n \ndiff --git a/revision.c b/revision.c\nindex 8df75b82249..347dabf7f9a 100644\n--- a/revision.c\n+++ b/revision.c\n@@ -51,8 +51,8 @@\n \n volatile show_early_output_fn_t show_early_output;\n \n-static const char *term_bad;\n-static const char *term_good;\n+static char *term_bad;\n+static char *term_good;\n \n implement_shared_commit_slab(revision_sources, char *);\n \n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506723","messageId":"4a554ab10409e4cfb3c42b817cae3d026284663c.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 03/26] bisect: fix leaking string in `handle_bad_merge_base()`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:10:25Z","receivedAt":"2024-11-06T15:10:35Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"When handling a bad merge base we print an error, which includes the set\nof good revisions joined by spaces. This string is allocated, but never\nfreed.\n\nFix this memory leak. Note that the local `bad_hex` varible also looks\nlike a string that we should free. But in fact, `oid_to_hex()` returns\nan address to a static variable even though it is declared to return a\nnon-constant string. The function signature is thus quite misleading and\nreally should be fixed, but doing so is outside of the scope of this\npatch series.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n bisect.c | 2 ++\n 1 file changed, 2 insertions(+)\n\ndiff --git a/bisect.c b/bisect.c\nindex 9c52241050c..e9e603877eb 100644\n--- a/bisect.c\n+++ b/bisect.c\n@@ -801,6 +801,8 @@ static enum bisect_error handle_bad_merge_base(void)\n \t\t\t\t\"between %s and [%s].\\n\"),\n \t\t\t\tbad_hex, term_bad, term_good, bad_hex, good_hex);\n \t\t}\n+\n+\t\tfree(good_hex);\n \t\treturn BISECT_MERGE_BASE_CHECK;\n \t}\n \n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506724","messageId":"489dd9570d9e9f51180135d169089fe7b833e52d.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 04/26] bisect: fix leaking `current_bad_oid`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:10:28Z","receivedAt":"2024-11-06T15:10:38Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"When reading bisect refs we read the reference mapping to the \"bad\" term\ninto the global `current_bad_oid` variable. This is an allocated string,\nbut because it is global we never have to free it. This changes though\nwhen `register_ref()` is being called multiple times, at which point\nwe'll overwrite the previous pointer and thus make it unreachable.\n\nFix this issue by freeing the previous value. This leak is exposed by\nt6030, but plugging it does not make the whole test suite pass.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n bisect.c | 1 +\n 1 file changed, 1 insertion(+)\n\ndiff --git a/bisect.c b/bisect.c\nindex e9e603877eb..6dbc22f84fc 100644\n--- a/bisect.c\n+++ b/bisect.c\n@@ -456,6 +456,7 @@ static int register_ref(const char *refname, const char *referent UNUSED, const\n \tstrbuf_addstr(&good_prefix, \"-\");\n \n \tif (!strcmp(refname, term_bad)) {\n+\t\tfree(current_bad_oid);\n \t\tcurrent_bad_oid = xmalloc(sizeof(*current_bad_oid));\n \t\toidcpy(current_bad_oid, oid);\n \t} else if (starts_with(refname, good_prefix.buf)) {\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506725","messageId":"6dd1a56aa45a5b9b1302b4ecb629bdf9bd5fe331.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 05/26] bisect: fix multiple leaks in `bisect_next_all()`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:10:31Z","receivedAt":"2024-11-06T15:10:40Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"There are multiple leaks in `bisect_next_all()`. For one we don't free\nthe `tried` commit list. Second, one of the branches uses a direct\nreturn instead of jumping to the cleanup code.\n\nFix these by freeing the commit list and converting the return to a\ngoto.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n bisect.c | 5 +++--\n 1 file changed, 3 insertions(+), 2 deletions(-)\n\ndiff --git a/bisect.c b/bisect.c\nindex 6dbc22f84fc..04e9a63f11c 100644\n--- a/bisect.c\n+++ b/bisect.c\n@@ -1031,7 +1031,7 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix)\n {\n \tstruct strvec rev_argv = STRVEC_INIT;\n \tstruct rev_info revs = REV_INFO_INIT;\n-\tstruct commit_list *tried;\n+\tstruct commit_list *tried = NULL;\n \tint reaches = 0, all = 0, nr, steps;\n \tenum bisect_error res = BISECT_OK;\n \tstruct object_id *bisect_rev;\n@@ -1098,7 +1098,7 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix)\n \tif (oideq(bisect_rev, current_bad_oid)) {\n \t\tres = error_if_skipped_commits(tried, current_bad_oid);\n \t\tif (res)\n-\t\t\treturn res;\n+\t\t\tgoto cleanup;\n \t\tprintf(\"%s is the first %s commit\\n\", oid_to_hex(bisect_rev),\n \t\t\tterm_bad);\n \n@@ -1132,6 +1132,7 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix)\n \n \tres = bisect_checkout(bisect_rev, no_checkout);\n cleanup:\n+\tfree_commit_list(tried);\n \trelease_revisions(&revs);\n \tstrvec_clear(&rev_argv);\n \treturn res;\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506726","messageId":"fba5b4b9f60c4d22aacb2c66ac96fefe6fd8f5fd.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 06/26] bisect: fix leaking commit list items in `check_merge_base()`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:10:34Z","receivedAt":"2024-11-06T15:10:44Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"While we free the result commit list at the end of `check_merge_base()`,\nwe forget to free any items that we have already iterated over. Fix this\nby using a separate variable to iterate through them.\n\nThis leak is exposed by t6030, but plugging it does not make the whole\ntest suite pass.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n bisect.c | 4 ++--\n 1 file changed, 2 insertions(+), 2 deletions(-)\n\ndiff --git a/bisect.c b/bisect.c\nindex 04e9a63f11c..12efcff2e3c 100644\n--- a/bisect.c\n+++ b/bisect.c\n@@ -851,8 +851,8 @@ static enum bisect_error check_merge_bases(int rev_nr, struct commit **rev, int\n \t\t\t\t      rev + 1, &result) < 0)\n \t\texit(128);\n \n-\tfor (; result; result = result->next) {\n-\t\tconst struct object_id *mb = &result->item->object.oid;\n+\tfor (struct commit_list *l = result; l; l = l->next) {\n+\t\tconst struct object_id *mb = &l->item->object.oid;\n \t\tif (oideq(mb, current_bad_oid)) {\n \t\t\tres = handle_bad_merge_base();\n \t\t\tbreak;\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506727","messageId":"4f8f2aecf05c904f6f68f221e01e63395c7877ad.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 07/26] bisect: fix various cases where we leak commit list items","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:10:39Z","receivedAt":"2024-11-06T15:10:47Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"There are various cases where we leak commit list items because we\nevict items from the list, but don't free them. Plug those.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n bisect.c                    | 35 +++++++++++++++++++++++++++--------\n t/t6030-bisect-porcelain.sh |  1 +\n 2 files changed, 28 insertions(+), 8 deletions(-)\n\ndiff --git a/bisect.c b/bisect.c\nindex 12efcff2e3c..518be70aa3f 100644\n--- a/bisect.c\n+++ b/bisect.c\n@@ -440,11 +440,19 @@ void find_bisection(struct commit_list **commit_list, int *reaches,\n \t\t\tfree_commit_list(list->next);\n \t\t\tbest = list;\n \t\t\tbest->next = NULL;\n+\t\t} else {\n+\t\t\tfor (p = list; p != best; p = next) {\n+\t\t\t\tnext = p->next;\n+\t\t\t\tfree(p);\n+\t\t\t}\n \t\t}\n \t\t*reaches = weight(best);\n+\t} else {\n+\t\tfree_commit_list(*commit_list);\n \t}\n-\tfree(weights);\n \t*commit_list = best;\n+\n+\tfree(weights);\n \tclear_commit_weight(&commit_weight);\n }\n \n@@ -557,8 +565,11 @@ struct commit_list *filter_skipped(struct commit_list *list,\n \t\t\ttried = &list->next;\n \t\t} else {\n \t\t\tif (!show_all) {\n-\t\t\t\tif (!skipped_first || !*skipped_first)\n+\t\t\t\tif (!skipped_first || !*skipped_first) {\n+\t\t\t\t\tfree_commit_list(next);\n+\t\t\t\t\tfree_commit_list(filtered);\n \t\t\t\t\treturn list;\n+\t\t\t\t}\n \t\t\t} else if (skipped_first && !*skipped_first) {\n \t\t\t\t/* This means we know it's not skipped */\n \t\t\t\t*skipped_first = -1;\n@@ -614,7 +625,7 @@ static int sqrti(int val)\n \n static struct commit_list *skip_away(struct commit_list *list, int count)\n {\n-\tstruct commit_list *cur, *previous;\n+\tstruct commit_list *cur, *previous, *result = list;\n \tint prn, index, i;\n \n \tprn = get_prn(count);\n@@ -626,15 +637,23 @@ static struct commit_list *skip_away(struct commit_list *list, int count)\n \tfor (i = 0; cur; cur = cur->next, i++) {\n \t\tif (i == index) {\n \t\t\tif (!oideq(&cur->item->object.oid, current_bad_oid))\n-\t\t\t\treturn cur;\n-\t\t\tif (previous)\n-\t\t\t\treturn previous;\n-\t\t\treturn list;\n+\t\t\t\tresult = cur;\n+\t\t\telse if (previous)\n+\t\t\t\tresult = previous;\n+\t\t\telse\n+\t\t\t\tresult =  list;\n+\t\t\tbreak;\n \t\t}\n \t\tprevious = cur;\n \t}\n \n-\treturn list;\n+\tfor (cur = list; cur != result; ) {\n+\t\tstruct commit_list *next = cur->next;\n+\t\tfree(cur);\n+\t\tcur = next;\n+\t}\n+\n+\treturn result;\n }\n \n static struct commit_list *managed_skipped(struct commit_list *list,\ndiff --git a/t/t6030-bisect-porcelain.sh b/t/t6030-bisect-porcelain.sh\nindex cdc02706404..310affadebe 100755\n--- a/t/t6030-bisect-porcelain.sh\n+++ b/t/t6030-bisect-porcelain.sh\n@@ -9,6 +9,7 @@ exec </dev/null\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n add_line_into_file()\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506728","messageId":"c79be063a63e9f847fee5d5e58570df91157750f.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 08/26] line-log: fix leak when rewriting commit parents","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:10:41Z","receivedAt":"2024-11-06T15:10:50Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"In `process_ranges_merge_commit()` we try to figure out which of the\nparents can be blamed for the given line changes. When we figure out\nthat none of the files in the line-log have changed we assign the\ncomplete blame to that commit and rewrite the parents of the current\ncommit to only use that single parent.\n\nThis is done via `commit_list_append()`, which is misleadingly _not_\nappending to the list of parents. Instead, we overwrite the parents with\nthe blamed parent. This makes us lose track of the old pointers,\ncreating a memory leak.\n\nFix this issue by freeing the parents before we overwrite them.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n line-log.c          | 1 +\n t/t4211-line-log.sh | 1 +\n 2 files changed, 2 insertions(+)\n\ndiff --git a/line-log.c b/line-log.c\nindex bca9bd80407..bc67b75d10d 100644\n--- a/line-log.c\n+++ b/line-log.c\n@@ -1237,6 +1237,7 @@ static int process_ranges_merge_commit(struct rev_info *rev, struct commit *comm\n \t\t\t * don't follow any other path in history\n \t\t\t */\n \t\t\tadd_line_range(rev, parents[i], cand[i]);\n+\t\t\tfree_commit_list(commit->parents);\n \t\t\tcommit_list_append(parents[i], &commit->parents);\n \n \t\t\tret = 0;\ndiff --git a/t/t4211-line-log.sh b/t/t4211-line-log.sh\nindex 950451cf6a6..1d6dd982a2a 100755\n--- a/t/t4211-line-log.sh\n+++ b/t/t4211-line-log.sh\n@@ -4,6 +4,7 @@ test_description='test log -L'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup (import history)' '\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506729","messageId":"c23e1a08854530f5c2474725ddde1da1068c2c12.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 09/26] strvec: introduce new `strvec_splice()` function","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:10:44Z","receivedAt":"2024-11-06T15:10:53Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"Introduce a new `strvec_splice()` function that can replace a range of\nstrings in the vector with another array of strings. This function will\nbe used in subsequent commits.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n strvec.c              | 19 +++++++++++++\n strvec.h              |  9 ++++++\n t/unit-tests/strvec.c | 65 +++++++++++++++++++++++++++++++++++++++++++\n 3 files changed, 93 insertions(+)\n\ndiff --git a/strvec.c b/strvec.c\nindex f712070f574..81075c50cca 100644\n--- a/strvec.c\n+++ b/strvec.c\n@@ -56,6 +56,25 @@ void strvec_pushv(struct strvec *array, const char **items)\n \t\tstrvec_push(array, *items);\n }\n \n+void strvec_splice(struct strvec *array, size_t pos, size_t len,\n+\t\t   const char **replacement, size_t replacement_len)\n+{\n+\tif (pos + len > array->alloc)\n+\t\tBUG(\"range outside of array boundary\");\n+\tif (replacement_len > len)\n+\t\tALLOC_GROW(array->v, array->nr + (replacement_len - len) + 1,\n+\t\t\t   array->alloc);\n+\tfor (size_t i = 0; i < len; i++)\n+\t\tfree((char *)array->v[pos + i]);\n+\tif (replacement_len != len) {\n+\t\tmemmove(array->v + pos + replacement_len, array->v + pos + len,\n+\t\t\t(array->nr - pos - len + 1) * sizeof(char *));\n+\t\tarray->nr += (replacement_len - len);\n+\t}\n+\tfor (size_t i = 0; i < replacement_len; i++)\n+\t\tarray->v[pos + i] = xstrdup(replacement[i]);\n+}\n+\n const char *strvec_replace(struct strvec *array, size_t idx, const char *replacement)\n {\n \tchar *to_free;\ndiff --git a/strvec.h b/strvec.h\nindex 4b73c1f092e..4e61cc93369 100644\n--- a/strvec.h\n+++ b/strvec.h\n@@ -67,6 +67,15 @@ void strvec_pushl(struct strvec *, ...);\n /* Push a null-terminated array of strings onto the end of the array. */\n void strvec_pushv(struct strvec *, const char **);\n \n+/*\n+ * Replace `len` values starting at `pos` with the provided replacement\n+ * strings. If `len` is zero this is effectively an insert at the given `pos`.\n+ * If `replacement_len` is zero this is effectively a delete of `len` items\n+ * starting at `pos`.\n+ */\n+void strvec_splice(struct strvec *array, size_t pos, size_t len,\n+\t\t   const char **replacement, size_t replacement_len);\n+\n /**\n  * Replace the value at the given index with a new value. The index must be\n  * valid. Returns a pointer to the inserted value.\ndiff --git a/t/unit-tests/strvec.c b/t/unit-tests/strvec.c\nindex bf4c0cb172e..855b6023371 100644\n--- a/t/unit-tests/strvec.c\n+++ b/t/unit-tests/strvec.c\n@@ -88,6 +88,71 @@ void test_strvec__pushv(void)\n \tstrvec_clear(&vec);\n }\n \n+void test_strvec__splice_with_same_size_replacement(void)\n+{\n+\tstruct strvec vec = STRVEC_INIT;\n+\tconst char *replacement[] = { \"1\" };\n+\n+\tstrvec_pushl(&vec, \"foo\", \"bar\", \"baz\", NULL);\n+\tstrvec_splice(&vec, 1, 1, replacement, ARRAY_SIZE(replacement));\n+\tcheck_strvec(&vec, \"foo\", \"1\", \"baz\", NULL);\n+\tstrvec_clear(&vec);\n+}\n+\n+void test_strvec__splice_with_smaller_replacement(void)\n+{\n+\tstruct strvec vec = STRVEC_INIT;\n+\tconst char *replacement[] = { \"1\" };\n+\n+\tstrvec_pushl(&vec, \"foo\", \"bar\", \"baz\", NULL);\n+\tstrvec_splice(&vec, 1, 2, replacement, ARRAY_SIZE(replacement));\n+\tcheck_strvec(&vec, \"foo\", \"1\", NULL);\n+\tstrvec_clear(&vec);\n+}\n+\n+void test_strvec__splice_with_bigger_replacement(void)\n+{\n+\tstruct strvec vec = STRVEC_INIT;\n+\tconst char *replacement[] = { \"1\", \"2\", \"3\" };\n+\n+\tstrvec_pushl(&vec, \"foo\", \"bar\", \"baz\", NULL);\n+\tstrvec_splice(&vec, 0, 2, replacement, ARRAY_SIZE(replacement));\n+\tcheck_strvec(&vec, \"1\", \"2\", \"3\", \"baz\", NULL);\n+\tstrvec_clear(&vec);\n+}\n+\n+void test_strvec__splice_with_empty_replacement(void)\n+{\n+\tstruct strvec vec = STRVEC_INIT;\n+\n+\tstrvec_pushl(&vec, \"foo\", \"bar\", \"baz\", NULL);\n+\tstrvec_splice(&vec, 0, 2, NULL, 0);\n+\tcheck_strvec(&vec, \"baz\", NULL);\n+\tstrvec_clear(&vec);\n+}\n+\n+void test_strvec__splice_with_empty_original(void)\n+{\n+\tstruct strvec vec = STRVEC_INIT;\n+\tconst char *replacement[] = { \"1\", \"2\" };\n+\n+\tstrvec_pushl(&vec, \"foo\", \"bar\", \"baz\", NULL);\n+\tstrvec_splice(&vec, 1, 0, replacement, ARRAY_SIZE(replacement));\n+\tcheck_strvec(&vec, \"foo\", \"1\", \"2\", \"bar\", \"baz\", NULL);\n+\tstrvec_clear(&vec);\n+}\n+\n+void test_strvec__splice_at_tail(void)\n+{\n+\tstruct strvec vec = STRVEC_INIT;\n+\tconst char *replacement[] = { \"1\", \"2\" };\n+\n+\tstrvec_pushl(&vec, \"foo\", \"bar\", NULL);\n+\tstrvec_splice(&vec, 2, 0, replacement, ARRAY_SIZE(replacement));\n+\tcheck_strvec(&vec, \"foo\", \"bar\", \"1\", \"2\", NULL);\n+\tstrvec_clear(&vec);\n+}\n+\n void test_strvec__replace_at_head(void)\n {\n \tstruct strvec vec = STRVEC_INIT;\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506730","messageId":"93aed59eaf67739e25dee4bd6cc0a3f2a527f345.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 10/26] git: refactor alias handling to use a `struct strvec`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:10:47Z","receivedAt":"2024-11-06T15:10:56Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"In `handle_alias()` we use both `argcp` and `argv` as in-out parameters.\nCallers mostly pass through the static array from `main()`, but once we\nhandle an alias we replace it with an allocated array that may contain\nsome allocated strings. Callers do not handle this scenario at all and\nthus leak memory.\n\nWe could in theory handle the lifetime of `argv` in a hacky fashion by\nletting callers free it in case they see that an alias was handled. But\nwhile that would likely work, we still wouldn't be able to easily handle\nthe lifetime of strings referenced by `argv`.\n\nRefactor the code to instead use a `struct strvec`, which effectively\nremoves the need for us to manually track lifetimes.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n git.c            | 58 ++++++++++++++++++++++++++----------------------\n t/t0014-alias.sh |  1 +\n 2 files changed, 33 insertions(+), 26 deletions(-)\n\ndiff --git a/git.c b/git.c\nindex c2c1b8e22c2..88356afe5fb 100644\n--- a/git.c\n+++ b/git.c\n@@ -362,7 +362,7 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)\n \treturn (*argv) - orig_argv;\n }\n \n-static int handle_alias(int *argcp, const char ***argv)\n+static int handle_alias(struct strvec *args)\n {\n \tint envchanged = 0, ret = 0, saved_errno = errno;\n \tint count, option_count;\n@@ -370,10 +370,10 @@ static int handle_alias(int *argcp, const char ***argv)\n \tconst char *alias_command;\n \tchar *alias_string;\n \n-\talias_command = (*argv)[0];\n+\talias_command = args->v[0];\n \talias_string = alias_lookup(alias_command);\n \tif (alias_string) {\n-\t\tif (*argcp > 1 && !strcmp((*argv)[1], \"-h\"))\n+\t\tif (args->nr > 1 && !strcmp(args->v[1], \"-h\"))\n \t\t\tfprintf_ln(stderr, _(\"'%s' is aliased to '%s'\"),\n \t\t\t\t   alias_command, alias_string);\n \t\tif (alias_string[0] == '!') {\n@@ -390,7 +390,7 @@ static int handle_alias(int *argcp, const char ***argv)\n \t\t\tchild.wait_after_clean = 1;\n \t\t\tchild.trace2_child_class = \"shell_alias\";\n \t\t\tstrvec_push(&child.args, alias_string + 1);\n-\t\t\tstrvec_pushv(&child.args, (*argv) + 1);\n+\t\t\tstrvec_pushv(&child.args, args->v + 1);\n \n \t\t\ttrace2_cmd_alias(alias_command, child.args.v);\n \t\t\ttrace2_cmd_name(\"_run_shell_alias_\");\n@@ -423,15 +423,13 @@ static int handle_alias(int *argcp, const char ***argv)\n \t\ttrace_argv_printf(new_argv,\n \t\t\t\t  \"trace: alias expansion: %s =>\",\n \t\t\t\t  alias_command);\n-\n-\t\tREALLOC_ARRAY(new_argv, count + *argcp);\n-\t\t/* insert after command name */\n-\t\tCOPY_ARRAY(new_argv + count, *argv + 1, *argcp);\n-\n \t\ttrace2_cmd_alias(alias_command, new_argv);\n \n-\t\t*argv = new_argv;\n-\t\t*argcp += count - 1;\n+\t\t/* Replace the alias with the new arguments. */\n+\t\tstrvec_splice(args, 0, 1, new_argv, count);\n+\n+\t\tfree(alias_string);\n+\t\tfree(new_argv);\n \n \t\tret = 1;\n \t}\n@@ -800,10 +798,10 @@ static void execv_dashed_external(const char **argv)\n \t\texit(128);\n }\n \n-static int run_argv(int *argcp, const char ***argv)\n+static int run_argv(struct strvec *args)\n {\n \tint done_alias = 0;\n-\tstruct string_list cmd_list = STRING_LIST_INIT_NODUP;\n+\tstruct string_list cmd_list = STRING_LIST_INIT_DUP;\n \tstruct string_list_item *seen;\n \n \twhile (1) {\n@@ -817,8 +815,8 @@ static int run_argv(int *argcp, const char ***argv)\n \t\t * process.\n \t\t */\n \t\tif (!done_alias)\n-\t\t\thandle_builtin(*argcp, *argv);\n-\t\telse if (get_builtin(**argv)) {\n+\t\t\thandle_builtin(args->nr, args->v);\n+\t\telse if (get_builtin(args->v[0])) {\n \t\t\tstruct child_process cmd = CHILD_PROCESS_INIT;\n \t\t\tint i;\n \n@@ -834,8 +832,8 @@ static int run_argv(int *argcp, const char ***argv)\n \t\t\tcommit_pager_choice();\n \n \t\t\tstrvec_push(&cmd.args, \"git\");\n-\t\t\tfor (i = 0; i < *argcp; i++)\n-\t\t\t\tstrvec_push(&cmd.args, (*argv)[i]);\n+\t\t\tfor (i = 0; i < args->nr; i++)\n+\t\t\t\tstrvec_push(&cmd.args, args->v[i]);\n \n \t\t\ttrace_argv_printf(cmd.args.v, \"trace: exec:\");\n \n@@ -850,13 +848,13 @@ static int run_argv(int *argcp, const char ***argv)\n \t\t\ti = run_command(&cmd);\n \t\t\tif (i >= 0 || errno != ENOENT)\n \t\t\t\texit(i);\n-\t\t\tdie(\"could not execute builtin %s\", **argv);\n+\t\t\tdie(\"could not execute builtin %s\", args->v[0]);\n \t\t}\n \n \t\t/* .. then try the external ones */\n-\t\texecv_dashed_external(*argv);\n+\t\texecv_dashed_external(args->v);\n \n-\t\tseen = unsorted_string_list_lookup(&cmd_list, *argv[0]);\n+\t\tseen = unsorted_string_list_lookup(&cmd_list, args->v[0]);\n \t\tif (seen) {\n \t\t\tint i;\n \t\t\tstruct strbuf sb = STRBUF_INIT;\n@@ -873,14 +871,14 @@ static int run_argv(int *argcp, const char ***argv)\n \t\t\t      \" not terminate:%s\"), cmd_list.items[0].string, sb.buf);\n \t\t}\n \n-\t\tstring_list_append(&cmd_list, *argv[0]);\n+\t\tstring_list_append(&cmd_list, args->v[0]);\n \n \t\t/*\n \t\t * It could be an alias -- this works around the insanity\n \t\t * of overriding \"git log\" with \"git show\" by having\n \t\t * alias.log = show\n \t\t */\n-\t\tif (!handle_alias(argcp, argv))\n+\t\tif (!handle_alias(args))\n \t\t\tbreak;\n \t\tdone_alias = 1;\n \t}\n@@ -892,6 +890,7 @@ static int run_argv(int *argcp, const char ***argv)\n \n int cmd_main(int argc, const char **argv)\n {\n+\tstruct strvec args = STRVEC_INIT;\n \tconst char *cmd;\n \tint done_help = 0;\n \n@@ -951,25 +950,32 @@ int cmd_main(int argc, const char **argv)\n \t */\n \tsetup_path();\n \n+\tfor (size_t i = 0; i < argc; i++)\n+\t\tstrvec_push(&args, argv[i]);\n+\n \twhile (1) {\n-\t\tint was_alias = run_argv(&argc, &argv);\n+\t\tint was_alias = run_argv(&args);\n \t\tif (errno != ENOENT)\n \t\t\tbreak;\n \t\tif (was_alias) {\n \t\t\tfprintf(stderr, _(\"expansion of alias '%s' failed; \"\n \t\t\t\t\t  \"'%s' is not a git command\\n\"),\n-\t\t\t\tcmd, argv[0]);\n+\t\t\t\tcmd, args.v[0]);\n+\t\t\tstrvec_clear(&args);\n \t\t\texit(1);\n \t\t}\n \t\tif (!done_help) {\n-\t\t\tcmd = argv[0] = help_unknown_cmd(cmd);\n+\t\t\tstrvec_replace(&args, 0, help_unknown_cmd(cmd));\n+\t\t\tcmd = args.v[0];\n \t\t\tdone_help = 1;\n-\t\t} else\n+\t\t} else {\n \t\t\tbreak;\n+\t\t}\n \t}\n \n \tfprintf(stderr, _(\"failed to run command '%s': %s\\n\"),\n \t\tcmd, strerror(errno));\n+\tstrvec_clear(&args);\n \n \treturn 1;\n }\ndiff --git a/t/t0014-alias.sh b/t/t0014-alias.sh\nindex 854d59ec58c..2a6f39ad9c8 100755\n--- a/t/t0014-alias.sh\n+++ b/t/t0014-alias.sh\n@@ -2,6 +2,7 @@\n \n test_description='git command aliasing'\n \n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'nested aliases - internal execution' '\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506731","messageId":"eae8f7e223f9ec9cbb35a001be75536fbcbe8c66.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 11/26] git: refactor builtin handling to use a `struct strvec`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:10:50Z","receivedAt":"2024-11-06T15:10:59Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"Similar as with the preceding commit, `handle_builtin()` does not\nproperly track lifetimes of the `argv` array and its strings. As it may\nend up modifying the array this can lead to memory leaks in case it\ncontains allocated strings.\n\nRefactor the function to use a `struct strvec` instead.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n git.c                  | 66 ++++++++++++++++++++----------------------\n t/t0211-trace2-perf.sh |  2 +-\n 2 files changed, 32 insertions(+), 36 deletions(-)\n\ndiff --git a/git.c b/git.c\nindex 88356afe5fb..159dd45b082 100644\n--- a/git.c\n+++ b/git.c\n@@ -696,63 +696,57 @@ void load_builtin_commands(const char *prefix, struct cmdnames *cmds)\n }\n \n #ifdef STRIP_EXTENSION\n-static void strip_extension(const char **argv)\n+static void strip_extension(struct strvec *args)\n {\n \tsize_t len;\n \n-\tif (strip_suffix(argv[0], STRIP_EXTENSION, &len))\n-\t\targv[0] = xmemdupz(argv[0], len);\n+\tif (strip_suffix(args->v[0], STRIP_EXTENSION, &len)) {\n+\t\tchar *stripped = xmemdupz(args->v[0], len);\n+\t\tstrvec_replace(args, 0, stripped);\n+\t\tfree(stripped);\n+\t}\n }\n #else\n #define strip_extension(cmd)\n #endif\n \n-static void handle_builtin(int argc, const char **argv)\n+static void handle_builtin(struct strvec *args)\n {\n-\tstruct strvec args = STRVEC_INIT;\n-\tconst char **argv_copy = NULL;\n \tconst char *cmd;\n \tstruct cmd_struct *builtin;\n \n-\tstrip_extension(argv);\n-\tcmd = argv[0];\n+\tstrip_extension(args);\n+\tcmd = args->v[0];\n \n \t/* Turn \"git cmd --help\" into \"git help --exclude-guides cmd\" */\n-\tif (argc > 1 && !strcmp(argv[1], \"--help\")) {\n-\t\tint i;\n-\n-\t\targv[1] = argv[0];\n-\t\targv[0] = cmd = \"help\";\n-\n-\t\tfor (i = 0; i < argc; i++) {\n-\t\t\tstrvec_push(&args, argv[i]);\n-\t\t\tif (!i)\n-\t\t\t\tstrvec_push(&args, \"--exclude-guides\");\n-\t\t}\n+\tif (args->nr > 1 && !strcmp(args->v[1], \"--help\")) {\n+\t\tconst char *exclude_guides_arg[] = { \"--exclude-guides\" };\n+\n+\t\tstrvec_replace(args, 1, args->v[0]);\n+\t\tstrvec_replace(args, 0, \"help\");\n+\t\tcmd = \"help\";\n+\t\tstrvec_splice(args, 2, 0, exclude_guides_arg,\n+\t\t\t      ARRAY_SIZE(exclude_guides_arg));\n+\t}\n \n-\t\targc++;\n+\tbuiltin = get_builtin(cmd);\n+\tif (builtin) {\n+\t\tconst char **argv_copy = NULL;\n+\t\tint ret;\n \n \t\t/*\n \t\t * `run_builtin()` will modify the argv array, so we need to\n \t\t * create a shallow copy such that we can free all of its\n \t\t * strings.\n \t\t */\n-\t\tCALLOC_ARRAY(argv_copy, argc + 1);\n-\t\tCOPY_ARRAY(argv_copy, args.v, argc);\n+\t\tif (args->nr)\n+\t\t\tDUP_ARRAY(argv_copy, args->v, args->nr + 1);\n \n-\t\targv = argv_copy;\n-\t}\n-\n-\tbuiltin = get_builtin(cmd);\n-\tif (builtin) {\n-\t\tint ret = run_builtin(builtin, argc, argv, the_repository);\n-\t\tstrvec_clear(&args);\n+\t\tret = run_builtin(builtin, args->nr, argv_copy, the_repository);\n+\t\tstrvec_clear(args);\n \t\tfree(argv_copy);\n \t\texit(ret);\n \t}\n-\n-\tstrvec_clear(&args);\n-\tfree(argv_copy);\n }\n \n static void execv_dashed_external(const char **argv)\n@@ -815,7 +809,7 @@ static int run_argv(struct strvec *args)\n \t\t * process.\n \t\t */\n \t\tif (!done_alias)\n-\t\t\thandle_builtin(args->nr, args->v);\n+\t\t\thandle_builtin(args);\n \t\telse if (get_builtin(args->v[0])) {\n \t\t\tstruct child_process cmd = CHILD_PROCESS_INIT;\n \t\t\tint i;\n@@ -916,8 +910,10 @@ int cmd_main(int argc, const char **argv)\n \t * that one cannot handle it.\n \t */\n \tif (skip_prefix(cmd, \"git-\", &cmd)) {\n-\t\targv[0] = cmd;\n-\t\thandle_builtin(argc, argv);\n+\t\tstrvec_push(&args, cmd);\n+\t\tstrvec_pushv(&args, argv + 1);\n+\t\thandle_builtin(&args);\n+\t\tstrvec_clear(&args);\n \t\tdie(_(\"cannot handle %s as a builtin\"), cmd);\n \t}\n \ndiff --git a/t/t0211-trace2-perf.sh b/t/t0211-trace2-perf.sh\nindex dddc130560b..91260ce97e5 100755\n--- a/t/t0211-trace2-perf.sh\n+++ b/t/t0211-trace2-perf.sh\n@@ -2,7 +2,7 @@\n \n test_description='test trace2 facility (perf target)'\n \n-TEST_PASSES_SANITIZE_LEAK=false\n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Turn off any inherited trace2 settings for this test.\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506732","messageId":"88e727407242248173f1e0f39d7b85b681234f4a.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 12/26] split-index: fix memory leak in `move_cache_to_base_index()`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:10:52Z","receivedAt":"2024-11-06T15:11:04Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"In `move_cache_to_base_index()` we move the index cache of the main\nindex into the split index, which is used when writing a shared index.\nBut we don't release the old split index base in case we already had a\nsplit index before this operation, which can thus leak memory.\n\nPlug the leak by releasing the previous base.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n split-index.c          | 6 +++++-\n t/t1700-split-index.sh | 1 +\n 2 files changed, 6 insertions(+), 1 deletion(-)\n\ndiff --git a/split-index.c b/split-index.c\nindex 120c8190b18..cfbc773e6cd 100644\n--- a/split-index.c\n+++ b/split-index.c\n@@ -97,7 +97,11 @@ void move_cache_to_base_index(struct index_state *istate)\n \t\tmem_pool_combine(istate->ce_mem_pool, istate->split_index->base->ce_mem_pool);\n \t}\n \n-\tALLOC_ARRAY(si->base, 1);\n+\tif (si->base)\n+\t\trelease_index(si->base);\n+\telse\n+\t\tALLOC_ARRAY(si->base, 1);\n+\n \tindex_state_init(si->base, istate->repo);\n \tsi->base->version = istate->version;\n \t/* zero timestamp disables racy test in ce_write_index() */\ndiff --git a/t/t1700-split-index.sh b/t/t1700-split-index.sh\nindex ac4a5b2734c..2625ac44889 100755\n--- a/t/t1700-split-index.sh\n+++ b/t/t1700-split-index.sh\n@@ -5,6 +5,7 @@ test_description='split index mode tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # We need total control of index splitting here\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506733","messageId":"712613c10ac2bb5d3588b03aa3b0fcd01350e865.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 13/26] builtin/sparse-checkout: fix leaking sanitized patterns","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:10:57Z","receivedAt":"2024-11-06T15:11:07Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"Both `git sparse-checkout add` and `git sparse-checkout set` accept a\nlist of additional directories or patterns. These get massaged via calls\nto `sanitize_paths()`, which may end up modifying the passed-in array by\nupdating its pointers to be prefixed paths. This allocates memory that\nwe never free.\n\nRefactor the code to instead use a `struct strvec`, which makes it way\neasier for us to track the lifetime correctly. The couple of extra\nmemory allocations likely do not matter as we only ever populate it with\ncommand line arguments.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n builtin/sparse-checkout.c | 61 +++++++++++++++++++++++++--------------\n 1 file changed, 39 insertions(+), 22 deletions(-)\n\ndiff --git a/builtin/sparse-checkout.c b/builtin/sparse-checkout.c\nindex 49aedc1de81..698d93a9ec5 100644\n--- a/builtin/sparse-checkout.c\n+++ b/builtin/sparse-checkout.c\n@@ -669,7 +669,7 @@ static void add_patterns_literal(int argc, const char **argv,\n \tadd_patterns_from_input(pl, argc, argv, use_stdin ? stdin : NULL);\n }\n \n-static int modify_pattern_list(int argc, const char **argv, int use_stdin,\n+static int modify_pattern_list(struct strvec *args, int use_stdin,\n \t\t\t       enum modify_type m)\n {\n \tint result;\n@@ -679,13 +679,13 @@ static int modify_pattern_list(int argc, const char **argv, int use_stdin,\n \tswitch (m) {\n \tcase ADD:\n \t\tif (core_sparse_checkout_cone)\n-\t\t\tadd_patterns_cone_mode(argc, argv, pl, use_stdin);\n+\t\t\tadd_patterns_cone_mode(args->nr, args->v, pl, use_stdin);\n \t\telse\n-\t\t\tadd_patterns_literal(argc, argv, pl, use_stdin);\n+\t\t\tadd_patterns_literal(args->nr, args->v, pl, use_stdin);\n \t\tbreak;\n \n \tcase REPLACE:\n-\t\tadd_patterns_from_input(pl, argc, argv,\n+\t\tadd_patterns_from_input(pl, args->nr, args->v,\n \t\t\t\t\tuse_stdin ? stdin : NULL);\n \t\tbreak;\n \t}\n@@ -706,12 +706,12 @@ static int modify_pattern_list(int argc, const char **argv, int use_stdin,\n \treturn result;\n }\n \n-static void sanitize_paths(int argc, const char **argv,\n+static void sanitize_paths(struct strvec *args,\n \t\t\t   const char *prefix, int skip_checks)\n {\n \tint i;\n \n-\tif (!argc)\n+\tif (!args->nr)\n \t\treturn;\n \n \tif (prefix && *prefix && core_sparse_checkout_cone) {\n@@ -721,8 +721,11 @@ static void sanitize_paths(int argc, const char **argv,\n \t\t */\n \t\tint prefix_len = strlen(prefix);\n \n-\t\tfor (i = 0; i < argc; i++)\n-\t\t\targv[i] = prefix_path(prefix, prefix_len, argv[i]);\n+\t\tfor (i = 0; i < args->nr; i++) {\n+\t\t\tchar *prefixed_path = prefix_path(prefix, prefix_len, args->v[i]);\n+\t\t\tstrvec_replace(args, i, prefixed_path);\n+\t\t\tfree(prefixed_path);\n+\t\t}\n \t}\n \n \tif (skip_checks)\n@@ -732,20 +735,20 @@ static void sanitize_paths(int argc, const char **argv,\n \t\tdie(_(\"please run from the toplevel directory in non-cone mode\"));\n \n \tif (core_sparse_checkout_cone) {\n-\t\tfor (i = 0; i < argc; i++) {\n-\t\t\tif (argv[i][0] == '/')\n+\t\tfor (i = 0; i < args->nr; i++) {\n+\t\t\tif (args->v[i][0] == '/')\n \t\t\t\tdie(_(\"specify directories rather than patterns (no leading slash)\"));\n-\t\t\tif (argv[i][0] == '!')\n+\t\t\tif (args->v[i][0] == '!')\n \t\t\t\tdie(_(\"specify directories rather than patterns.  If your directory starts with a '!', pass --skip-checks\"));\n-\t\t\tif (strpbrk(argv[i], \"*?[]\"))\n+\t\t\tif (strpbrk(args->v[i], \"*?[]\"))\n \t\t\t\tdie(_(\"specify directories rather than patterns.  If your directory really has any of '*?[]\\\\' in it, pass --skip-checks\"));\n \t\t}\n \t}\n \n-\tfor (i = 0; i < argc; i++) {\n+\tfor (i = 0; i < args->nr; i++) {\n \t\tstruct cache_entry *ce;\n \t\tstruct index_state *index = the_repository->index;\n-\t\tint pos = index_name_pos(index, argv[i], strlen(argv[i]));\n+\t\tint pos = index_name_pos(index, args->v[i], strlen(args->v[i]));\n \n \t\tif (pos < 0)\n \t\t\tcontinue;\n@@ -754,9 +757,9 @@ static void sanitize_paths(int argc, const char **argv,\n \t\t\tcontinue;\n \n \t\tif (core_sparse_checkout_cone)\n-\t\t\tdie(_(\"'%s' is not a directory; to treat it as a directory anyway, rerun with --skip-checks\"), argv[i]);\n+\t\t\tdie(_(\"'%s' is not a directory; to treat it as a directory anyway, rerun with --skip-checks\"), args->v[i]);\n \t\telse\n-\t\t\twarning(_(\"pass a leading slash before paths such as '%s' if you want a single file (see NON-CONE PROBLEMS in the git-sparse-checkout manual).\"), argv[i]);\n+\t\t\twarning(_(\"pass a leading slash before paths such as '%s' if you want a single file (see NON-CONE PROBLEMS in the git-sparse-checkout manual).\"), args->v[i]);\n \t}\n }\n \n@@ -780,6 +783,8 @@ static int sparse_checkout_add(int argc, const char **argv, const char *prefix)\n \t\t\t N_(\"read patterns from standard in\")),\n \t\tOPT_END(),\n \t};\n+\tstruct strvec patterns = STRVEC_INIT;\n+\tint ret;\n \n \tsetup_work_tree();\n \tif (!core_apply_sparse_checkout)\n@@ -791,9 +796,14 @@ static int sparse_checkout_add(int argc, const char **argv, const char *prefix)\n \t\t\t     builtin_sparse_checkout_add_options,\n \t\t\t     builtin_sparse_checkout_add_usage, 0);\n \n-\tsanitize_paths(argc, argv, prefix, add_opts.skip_checks);\n+\tfor (int i = 0; i < argc; i++)\n+\t\tstrvec_push(&patterns, argv[i]);\n+\tsanitize_paths(&patterns, prefix, add_opts.skip_checks);\n \n-\treturn modify_pattern_list(argc, argv, add_opts.use_stdin, ADD);\n+\tret = modify_pattern_list(&patterns, add_opts.use_stdin, ADD);\n+\n+\tstrvec_clear(&patterns);\n+\treturn ret;\n }\n \n static char const * const builtin_sparse_checkout_set_usage[] = {\n@@ -826,6 +836,8 @@ static int sparse_checkout_set(int argc, const char **argv, const char *prefix)\n \t\t\t   PARSE_OPT_NONEG),\n \t\tOPT_END(),\n \t};\n+\tstruct strvec patterns = STRVEC_INIT;\n+\tint ret;\n \n \tsetup_work_tree();\n \trepo_read_index(the_repository);\n@@ -846,13 +858,18 @@ static int sparse_checkout_set(int argc, const char **argv, const char *prefix)\n \t * top-level directory (much as 'init' would do).\n \t */\n \tif (!core_sparse_checkout_cone && !set_opts.use_stdin && argc == 0) {\n-\t\targv = default_patterns;\n-\t\targc = default_patterns_nr;\n+\t\tfor (int i = 0; i < default_patterns_nr; i++)\n+\t\t\tstrvec_push(&patterns, default_patterns[i]);\n \t} else {\n-\t\tsanitize_paths(argc, argv, prefix, set_opts.skip_checks);\n+\t\tfor (int i = 0; i < argc; i++)\n+\t\t\tstrvec_push(&patterns, argv[i]);\n+\t\tsanitize_paths(&patterns, prefix, set_opts.skip_checks);\n \t}\n \n-\treturn modify_pattern_list(argc, argv, set_opts.use_stdin, REPLACE);\n+\tret = modify_pattern_list(&patterns, set_opts.use_stdin, REPLACE);\n+\n+\tstrvec_clear(&patterns);\n+\treturn ret;\n }\n \n static char const * const builtin_sparse_checkout_reapply_usage[] = {\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506734","messageId":"865ed1f597181641cd0163b05351521315fc6d5e.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 14/26] help: refactor to not use globals for reading config","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:11:00Z","receivedAt":"2024-11-06T15:11:08Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"We're reading the \"help.autocorrect\" and \"alias.*\" configuration into\nglobal variables, which makes it hard to manage their lifetime\ncorrectly. Refactor the code to use a struct instead.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n help.c | 47 ++++++++++++++++++++++++-----------------------\n 1 file changed, 24 insertions(+), 23 deletions(-)\n\ndiff --git a/help.c b/help.c\nindex 4ad4ebdd2cf..8794f81db9b 100644\n--- a/help.c\n+++ b/help.c\n@@ -546,8 +546,10 @@ int is_in_cmdlist(struct cmdnames *c, const char *s)\n \treturn 0;\n }\n \n-static int autocorrect;\n-static struct cmdnames aliases;\n+struct help_unknown_cmd_config {\n+\tint autocorrect;\n+\tstruct cmdnames aliases;\n+};\n \n #define AUTOCORRECT_PROMPT (-3)\n #define AUTOCORRECT_NEVER (-2)\n@@ -555,28 +557,29 @@ static struct cmdnames aliases;\n \n static int git_unknown_cmd_config(const char *var, const char *value,\n \t\t\t\t  const struct config_context *ctx,\n-\t\t\t\t  void *cb UNUSED)\n+\t\t\t\t  void *cb)\n {\n+\tstruct help_unknown_cmd_config *cfg = cb;\n \tconst char *p;\n \n \tif (!strcmp(var, \"help.autocorrect\")) {\n \t\tif (!value)\n \t\t\treturn config_error_nonbool(var);\n \t\tif (!strcmp(value, \"never\")) {\n-\t\t\tautocorrect = AUTOCORRECT_NEVER;\n+\t\t\tcfg->autocorrect = AUTOCORRECT_NEVER;\n \t\t} else if (!strcmp(value, \"immediate\")) {\n-\t\t\tautocorrect = AUTOCORRECT_IMMEDIATELY;\n+\t\t\tcfg->autocorrect = AUTOCORRECT_IMMEDIATELY;\n \t\t} else if (!strcmp(value, \"prompt\")) {\n-\t\t\tautocorrect = AUTOCORRECT_PROMPT;\n+\t\t\tcfg->autocorrect = AUTOCORRECT_PROMPT;\n \t\t} else {\n \t\t\tint v = git_config_int(var, value, ctx->kvi);\n-\t\t\tautocorrect = (v < 0)\n+\t\t\tcfg->autocorrect = (v < 0)\n \t\t\t\t? AUTOCORRECT_IMMEDIATELY : v;\n \t\t}\n \t}\n \t/* Also use aliases for command lookup */\n \tif (skip_prefix(var, \"alias.\", &p))\n-\t\tadd_cmdname(&aliases, p, strlen(p));\n+\t\tadd_cmdname(&cfg->aliases, p, strlen(p));\n \n \treturn 0;\n }\n@@ -611,30 +614,28 @@ static const char bad_interpreter_advice[] =\n \n const char *help_unknown_cmd(const char *cmd)\n {\n+\tstruct help_unknown_cmd_config cfg = { 0 };\n \tint i, n, best_similarity = 0;\n-\tstruct cmdnames main_cmds, other_cmds;\n+\tstruct cmdnames main_cmds = { 0 };\n+\tstruct cmdnames other_cmds = { 0 };\n \tstruct cmdname_help *common_cmds;\n \n-\tmemset(&main_cmds, 0, sizeof(main_cmds));\n-\tmemset(&other_cmds, 0, sizeof(other_cmds));\n-\tmemset(&aliases, 0, sizeof(aliases));\n-\n-\tread_early_config(the_repository, git_unknown_cmd_config, NULL);\n+\tread_early_config(the_repository, git_unknown_cmd_config, &cfg);\n \n \t/*\n \t * Disable autocorrection prompt in a non-interactive session\n \t */\n-\tif ((autocorrect == AUTOCORRECT_PROMPT) && (!isatty(0) || !isatty(2)))\n-\t\tautocorrect = AUTOCORRECT_NEVER;\n+\tif ((cfg.autocorrect == AUTOCORRECT_PROMPT) && (!isatty(0) || !isatty(2)))\n+\t\tcfg.autocorrect = AUTOCORRECT_NEVER;\n \n-\tif (autocorrect == AUTOCORRECT_NEVER) {\n+\tif (cfg.autocorrect == AUTOCORRECT_NEVER) {\n \t\tfprintf_ln(stderr, _(\"git: '%s' is not a git command. See 'git --help'.\"), cmd);\n \t\texit(1);\n \t}\n \n \tload_command_list(\"git-\", &main_cmds, &other_cmds);\n \n-\tadd_cmd_list(&main_cmds, &aliases);\n+\tadd_cmd_list(&main_cmds, &cfg.aliases);\n \tadd_cmd_list(&main_cmds, &other_cmds);\n \tQSORT(main_cmds.names, main_cmds.cnt, cmdname_compare);\n \tuniq(&main_cmds);\n@@ -693,7 +694,7 @@ const char *help_unknown_cmd(const char *cmd)\n \t\t     n++)\n \t\t\t; /* still counting */\n \t}\n-\tif (autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) {\n+\tif (cfg.autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) {\n \t\tconst char *assumed = main_cmds.names[0]->name;\n \t\tmain_cmds.names[0] = NULL;\n \t\tcmdnames_release(&main_cmds);\n@@ -701,12 +702,12 @@ const char *help_unknown_cmd(const char *cmd)\n \t\t\t   _(\"WARNING: You called a Git command named '%s', \"\n \t\t\t     \"which does not exist.\"),\n \t\t\t   cmd);\n-\t\tif (autocorrect == AUTOCORRECT_IMMEDIATELY)\n+\t\tif (cfg.autocorrect == AUTOCORRECT_IMMEDIATELY)\n \t\t\tfprintf_ln(stderr,\n \t\t\t\t   _(\"Continuing under the assumption that \"\n \t\t\t\t     \"you meant '%s'.\"),\n \t\t\t\t   assumed);\n-\t\telse if (autocorrect == AUTOCORRECT_PROMPT) {\n+\t\telse if (cfg.autocorrect == AUTOCORRECT_PROMPT) {\n \t\t\tchar *answer;\n \t\t\tstruct strbuf msg = STRBUF_INIT;\n \t\t\tstrbuf_addf(&msg, _(\"Run '%s' instead [y/N]? \"), assumed);\n@@ -719,8 +720,8 @@ const char *help_unknown_cmd(const char *cmd)\n \t\t\tfprintf_ln(stderr,\n \t\t\t\t   _(\"Continuing in %0.1f seconds, \"\n \t\t\t\t     \"assuming that you meant '%s'.\"),\n-\t\t\t\t   (float)autocorrect/10.0, assumed);\n-\t\t\tsleep_millisec(autocorrect * 100);\n+\t\t\t\t   (float)cfg.autocorrect/10.0, assumed);\n+\t\t\tsleep_millisec(cfg.autocorrect * 100);\n \t\t}\n \t\treturn assumed;\n \t}\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506735","messageId":"2fb012662d6c5720be1fe86973640c7a2d6f5681.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 15/26] help: fix leaking `struct cmdnames`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:11:03Z","receivedAt":"2024-11-06T15:11:11Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"We're populating multiple `struct cmdnames`, but don't ever free them.\nCreate a common exit path where we do so.\n\nNote that this also requires us to use `FREE_AND_NULL()` when freeing\n`cmdnames::names`, as we may otherwise try to free it multiple times.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n help.c | 24 +++++++++++++++++-------\n 1 file changed, 17 insertions(+), 7 deletions(-)\n\ndiff --git a/help.c b/help.c\nindex 8794f81db9b..51adc530d7a 100644\n--- a/help.c\n+++ b/help.c\n@@ -169,7 +169,7 @@ void cmdnames_release(struct cmdnames *cmds)\n \tint i;\n \tfor (i = 0; i < cmds->cnt; ++i)\n \t\tfree(cmds->names[i]);\n-\tfree(cmds->names);\n+\tFREE_AND_NULL(cmds->names);\n \tcmds->cnt = 0;\n \tcmds->alloc = 0;\n }\n@@ -619,6 +619,7 @@ const char *help_unknown_cmd(const char *cmd)\n \tstruct cmdnames main_cmds = { 0 };\n \tstruct cmdnames other_cmds = { 0 };\n \tstruct cmdname_help *common_cmds;\n+\tconst char *assumed = NULL;\n \n \tread_early_config(the_repository, git_unknown_cmd_config, &cfg);\n \n@@ -630,7 +631,7 @@ const char *help_unknown_cmd(const char *cmd)\n \n \tif (cfg.autocorrect == AUTOCORRECT_NEVER) {\n \t\tfprintf_ln(stderr, _(\"git: '%s' is not a git command. See 'git --help'.\"), cmd);\n-\t\texit(1);\n+\t\tgoto out;\n \t}\n \n \tload_command_list(\"git-\", &main_cmds, &other_cmds);\n@@ -695,7 +696,7 @@ const char *help_unknown_cmd(const char *cmd)\n \t\t\t; /* still counting */\n \t}\n \tif (cfg.autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) {\n-\t\tconst char *assumed = main_cmds.names[0]->name;\n+\t\tassumed = main_cmds.names[0]->name;\n \t\tmain_cmds.names[0] = NULL;\n \t\tcmdnames_release(&main_cmds);\n \t\tfprintf_ln(stderr,\n@@ -714,8 +715,10 @@ const char *help_unknown_cmd(const char *cmd)\n \t\t\tanswer = git_prompt(msg.buf, PROMPT_ECHO);\n \t\t\tstrbuf_release(&msg);\n \t\t\tif (!(starts_with(answer, \"y\") ||\n-\t\t\t      starts_with(answer, \"Y\")))\n-\t\t\t\texit(1);\n+\t\t\t      starts_with(answer, \"Y\"))) {\n+\t\t\t\tassumed = NULL;\n+\t\t\t\tgoto out;\n+\t\t\t}\n \t\t} else {\n \t\t\tfprintf_ln(stderr,\n \t\t\t\t   _(\"Continuing in %0.1f seconds, \"\n@@ -723,7 +726,8 @@ const char *help_unknown_cmd(const char *cmd)\n \t\t\t\t   (float)cfg.autocorrect/10.0, assumed);\n \t\t\tsleep_millisec(cfg.autocorrect * 100);\n \t\t}\n-\t\treturn assumed;\n+\n+\t\tgoto out;\n \t}\n \n \tfprintf_ln(stderr, _(\"git: '%s' is not a git command. See 'git --help'.\"), cmd);\n@@ -738,7 +742,13 @@ const char *help_unknown_cmd(const char *cmd)\n \t\t\tfprintf(stderr, \"\\t%s\\n\", main_cmds.names[i]->name);\n \t}\n \n-\texit(1);\n+out:\n+\tcmdnames_release(&cfg.aliases);\n+\tcmdnames_release(&main_cmds);\n+\tcmdnames_release(&other_cmds);\n+\tif (!assumed)\n+\t\texit(1);\n+\treturn assumed;\n }\n \n void get_version_info(struct strbuf *buf, int show_build_options)\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506736","messageId":"ea8677ff965711ebca140f130c62c704e0ab0753.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 16/26] help: fix leaking return value from `help_unknown_cmd()`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:11:06Z","receivedAt":"2024-11-06T15:11:14Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"While `help_unknown_cmd()` would usually die on an unknown command, it\ninstead returns an autocorrected command when \"help.autocorrect\" is set.\nBut while the function is declared to return a string constant, it\nactually returns an allocated string in that case. Callers thus aren't\naware that they have to free the string, leading to a memory leak.\n\nFix the function return type to be non-constant and free the returned\nvalue at its only callsite.\n\nNote that we cannot simply take ownership of `main_cmds.names[0]->name`\nand then eventually free it. This is because the `struct cmdname` is\nusing a flex array to allocate the name, so the name pointer points into\nthe middle of the structure and thus cannot be freed.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n git.c  |  4 +++-\n help.c | 11 +++++------\n help.h |  2 +-\n 3 files changed, 9 insertions(+), 8 deletions(-)\n\ndiff --git a/git.c b/git.c\nindex 159dd45b082..46b3c740c5d 100644\n--- a/git.c\n+++ b/git.c\n@@ -961,7 +961,9 @@ int cmd_main(int argc, const char **argv)\n \t\t\texit(1);\n \t\t}\n \t\tif (!done_help) {\n-\t\t\tstrvec_replace(&args, 0, help_unknown_cmd(cmd));\n+\t\t\tchar *assumed = help_unknown_cmd(cmd);\n+\t\t\tstrvec_replace(&args, 0, assumed);\n+\t\t\tfree(assumed);\n \t\t\tcmd = args.v[0];\n \t\t\tdone_help = 1;\n \t\t} else {\ndiff --git a/help.c b/help.c\nindex 51adc530d7a..0290aba9f38 100644\n--- a/help.c\n+++ b/help.c\n@@ -612,14 +612,14 @@ static const char bad_interpreter_advice[] =\n \tN_(\"'%s' appears to be a git command, but we were not\\n\"\n \t\"able to execute it. Maybe git-%s is broken?\");\n \n-const char *help_unknown_cmd(const char *cmd)\n+char *help_unknown_cmd(const char *cmd)\n {\n \tstruct help_unknown_cmd_config cfg = { 0 };\n \tint i, n, best_similarity = 0;\n \tstruct cmdnames main_cmds = { 0 };\n \tstruct cmdnames other_cmds = { 0 };\n \tstruct cmdname_help *common_cmds;\n-\tconst char *assumed = NULL;\n+\tchar *assumed = NULL;\n \n \tread_early_config(the_repository, git_unknown_cmd_config, &cfg);\n \n@@ -696,9 +696,8 @@ const char *help_unknown_cmd(const char *cmd)\n \t\t\t; /* still counting */\n \t}\n \tif (cfg.autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) {\n-\t\tassumed = main_cmds.names[0]->name;\n-\t\tmain_cmds.names[0] = NULL;\n-\t\tcmdnames_release(&main_cmds);\n+\t\tassumed = xstrdup(main_cmds.names[0]->name);\n+\n \t\tfprintf_ln(stderr,\n \t\t\t   _(\"WARNING: You called a Git command named '%s', \"\n \t\t\t     \"which does not exist.\"),\n@@ -716,7 +715,7 @@ const char *help_unknown_cmd(const char *cmd)\n \t\t\tstrbuf_release(&msg);\n \t\t\tif (!(starts_with(answer, \"y\") ||\n \t\t\t      starts_with(answer, \"Y\"))) {\n-\t\t\t\tassumed = NULL;\n+\t\t\t\tFREE_AND_NULL(assumed);\n \t\t\t\tgoto out;\n \t\t\t}\n \t\t} else {\ndiff --git a/help.h b/help.h\nindex e716ee27ea1..67207b3073c 100644\n--- a/help.h\n+++ b/help.h\n@@ -32,7 +32,7 @@ void list_all_other_cmds(struct string_list *list);\n void list_cmds_by_category(struct string_list *list,\n \t\t\t   const char *category);\n void list_cmds_by_config(struct string_list *list);\n-const char *help_unknown_cmd(const char *cmd);\n+char *help_unknown_cmd(const char *cmd);\n void load_command_list(const char *prefix,\n \t\t       struct cmdnames *main_cmds,\n \t\t       struct cmdnames *other_cmds);\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506737","messageId":"b1a7761d9b00545560c03c7aafe6d4db64c7ef60.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 17/26] builtin/help: fix leaks in `check_git_cmd()`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:11:08Z","receivedAt":"2024-11-06T15:11:17Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"The `check_git_cmd()` function is declared to return a string constant.\nAnd while it sometimes does return a constant, it may also return an\nallocated string in two cases:\n\n  - When handling aliases. This case is already marked with `UNLEAK()`\n    to work around the leak.\n\n  - When handling unknown commands in case \"help.autocorrect\" is\n    enabled. This one is not marked with `UNLEAK()`.\n\nThe function only has a single caller, so let's fix its return type to\nbe non-constant, consistently return an allocated string and free it at\nits callsite to plug the leak.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n builtin/help.c | 13 +++++++------\n 1 file changed, 7 insertions(+), 6 deletions(-)\n\ndiff --git a/builtin/help.c b/builtin/help.c\nindex 4a5a0790704..6a72d991a84 100644\n--- a/builtin/help.c\n+++ b/builtin/help.c\n@@ -551,12 +551,12 @@ static void show_html_page(const char *page)\n \topen_html(page_path.buf);\n }\n \n-static const char *check_git_cmd(const char* cmd)\n+static char *check_git_cmd(const char *cmd)\n {\n \tchar *alias;\n \n \tif (is_git_command(cmd))\n-\t\treturn cmd;\n+\t\treturn xstrdup(cmd);\n \n \talias = alias_lookup(cmd);\n \tif (alias) {\n@@ -589,14 +589,13 @@ static const char *check_git_cmd(const char* cmd)\n \t\t\tdie(_(\"bad alias.%s string: %s\"), cmd,\n \t\t\t    split_cmdline_strerror(count));\n \t\tfree(argv);\n-\t\tUNLEAK(alias);\n \t\treturn alias;\n \t}\n \n \tif (exclude_guides)\n \t\treturn help_unknown_cmd(cmd);\n \n-\treturn cmd;\n+\treturn xstrdup(cmd);\n }\n \n static void no_help_format(const char *opt_mode, enum help_format fmt)\n@@ -642,6 +641,7 @@ int cmd_help(int argc,\n {\n \tint nongit;\n \tenum help_format parsed_help_format;\n+\tchar *command = NULL;\n \tconst char *page;\n \n \targc = parse_options(argc, argv, prefix, builtin_help_options,\n@@ -713,9 +713,9 @@ int cmd_help(int argc,\n \tif (help_format == HELP_FORMAT_NONE)\n \t\thelp_format = parse_help_format(DEFAULT_HELP_FORMAT);\n \n-\targv[0] = check_git_cmd(argv[0]);\n+\tcommand = check_git_cmd(argv[0]);\n \n-\tpage = cmd_to_page(argv[0]);\n+\tpage = cmd_to_page(command);\n \tswitch (help_format) {\n \tcase HELP_FORMAT_NONE:\n \tcase HELP_FORMAT_MAN:\n@@ -729,5 +729,6 @@ int cmd_help(int argc,\n \t\tbreak;\n \t}\n \n+\tfree(command);\n \treturn 0;\n }\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506738","messageId":"256427084f63c9b2141bd468d633ee4d079fd33f.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 18/26] builtin/init-db: fix leaking directory paths","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:11:11Z","receivedAt":"2024-11-06T15:11:22Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"We've got a couple of leaking directory paths in git-init(1), all of\nwhich are marked with `UNLEAK()`. Fixing them is trivial, so let's do\nthat instead so that we can get rid of `UNLEAK()` entirely.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n builtin/init-db.c | 30 +++++++++++++++++-------------\n 1 file changed, 17 insertions(+), 13 deletions(-)\n\ndiff --git a/builtin/init-db.c b/builtin/init-db.c\nindex 7e00d57d654..9e069e27426 100644\n--- a/builtin/init-db.c\n+++ b/builtin/init-db.c\n@@ -75,10 +75,12 @@ int cmd_init_db(int argc,\n \t\tconst char *prefix,\n \t\tstruct repository *repo UNUSED)\n {\n-\tconst char *git_dir;\n+\tchar *git_dir;\n \tconst char *real_git_dir = NULL;\n-\tconst char *work_tree;\n+\tchar *real_git_dir_to_free = NULL;\n+\tchar *work_tree = NULL;\n \tconst char *template_dir = NULL;\n+\tchar *template_dir_to_free = NULL;\n \tunsigned int flags = 0;\n \tconst char *object_format = NULL;\n \tconst char *ref_format = NULL;\n@@ -106,6 +108,7 @@ int cmd_init_db(int argc,\n \t\t\t   N_(\"specify the reference format to use\")),\n \t\tOPT_END()\n \t};\n+\tint ret;\n \n \targc = parse_options(argc, argv, prefix, init_db_options, init_db_usage, 0);\n \n@@ -113,12 +116,10 @@ int cmd_init_db(int argc,\n \t\tdie(_(\"options '%s' and '%s' cannot be used together\"), \"--separate-git-dir\", \"--bare\");\n \n \tif (real_git_dir && !is_absolute_path(real_git_dir))\n-\t\treal_git_dir = real_pathdup(real_git_dir, 1);\n+\t\treal_git_dir = real_git_dir_to_free = real_pathdup(real_git_dir, 1);\n \n-\tif (template_dir && *template_dir && !is_absolute_path(template_dir)) {\n-\t\ttemplate_dir = absolute_pathdup(template_dir);\n-\t\tUNLEAK(template_dir);\n-\t}\n+\tif (template_dir && *template_dir && !is_absolute_path(template_dir))\n+\t\ttemplate_dir = template_dir_to_free = absolute_pathdup(template_dir);\n \n \tif (argc == 1) {\n \t\tint mkdir_tried = 0;\n@@ -192,7 +193,7 @@ int cmd_init_db(int argc,\n \t * Set up the default .git directory contents\n \t */\n \tif (!git_dir)\n-\t\tgit_dir = DEFAULT_GIT_DIR_ENVIRONMENT;\n+\t\tgit_dir = xstrdup(DEFAULT_GIT_DIR_ENVIRONMENT);\n \n \t/*\n \t * When --separate-git-dir is used inside a linked worktree, take\n@@ -213,6 +214,7 @@ int cmd_init_db(int argc,\n \t\t\tif (chdir(mainwt.buf) < 0)\n \t\t\t\tdie_errno(_(\"cannot chdir to %s\"), mainwt.buf);\n \t\t\tstrbuf_release(&mainwt);\n+\t\t\tfree(git_dir);\n \t\t\tgit_dir = strbuf_detach(&sb, NULL);\n \t\t}\n \t\tstrbuf_release(&sb);\n@@ -245,12 +247,14 @@ int cmd_init_db(int argc,\n \t\t\tset_git_work_tree(work_tree);\n \t}\n \n-\tUNLEAK(real_git_dir);\n-\tUNLEAK(git_dir);\n-\tUNLEAK(work_tree);\n-\n \tflags |= INIT_DB_EXIST_OK;\n-\treturn init_db(git_dir, real_git_dir, template_dir, hash_algo,\n+\tret =  init_db(git_dir, real_git_dir, template_dir, hash_algo,\n \t\t       ref_storage_format, initial_branch,\n \t\t       init_shared_repository, flags);\n+\n+\tfree(template_dir_to_free);\n+\tfree(real_git_dir_to_free);\n+\tfree(work_tree);\n+\tfree(git_dir);\n+\treturn ret;\n }\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506739","messageId":"e0aa2c5bb258589bb2cac19c54fddbb70614a487.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 19/26] builtin/branch: fix leaking sorting options","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:11:16Z","receivedAt":"2024-11-06T15:11:25Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"The sorting options are leaking, but given that they are marked with\n`UNLEAK()` the leak sanitizer doesn't complain.\n\nFix the leak by creating a common exit path and clearing the vector such\nthat we can get rid of the `UNLEAK()` annotation entirely.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n builtin/branch.c | 33 ++++++++++++++++++++++-----------\n 1 file changed, 22 insertions(+), 11 deletions(-)\n\ndiff --git a/builtin/branch.c b/builtin/branch.c\nindex fd1611ebf55..05ba4cd7a64 100644\n--- a/builtin/branch.c\n+++ b/builtin/branch.c\n@@ -722,6 +722,7 @@ int cmd_branch(int argc,\n \tstatic struct ref_sorting *sorting;\n \tstruct string_list sorting_options = STRING_LIST_INIT_DUP;\n \tstruct ref_format format = REF_FORMAT_INIT;\n+\tint ret;\n \n \tstruct option options[] = {\n \t\tOPT_GROUP(N_(\"Generic options\")),\n@@ -851,15 +852,15 @@ int cmd_branch(int argc,\n \tif (list)\n \t\tsetup_auto_pager(\"branch\", 1);\n \n-\tUNLEAK(sorting_options);\n-\n \tif (delete) {\n \t\tif (!argc)\n \t\t\tdie(_(\"branch name required\"));\n-\t\treturn delete_branches(argc, argv, delete > 1, filter.kind, quiet);\n+\t\tret = delete_branches(argc, argv, delete > 1, filter.kind, quiet);\n+\t\tgoto out;\n \t} else if (show_current) {\n \t\tprint_current_branch_name();\n-\t\treturn 0;\n+\t\tret = 0;\n+\t\tgoto out;\n \t} else if (list) {\n \t\t/*  git branch --list also shows HEAD when it is detached */\n \t\tif ((filter.kind & FILTER_REFS_BRANCHES) && filter.detached)\n@@ -882,12 +883,13 @@ int cmd_branch(int argc,\n \t\tref_sorting_release(sorting);\n \t\tref_filter_clear(&filter);\n \t\tref_format_clear(&format);\n-\t\treturn 0;\n+\n+\t\tret = 0;\n+\t\tgoto out;\n \t} else if (edit_description) {\n \t\tconst char *branch_name;\n \t\tstruct strbuf branch_ref = STRBUF_INIT;\n \t\tstruct strbuf buf = STRBUF_INIT;\n-\t\tint ret = 1; /* assume failure */\n \n \t\tif (!argc) {\n \t\t\tif (filter.detached)\n@@ -901,18 +903,22 @@ int cmd_branch(int argc,\n \t\t}\n \n \t\tstrbuf_addf(&branch_ref, \"refs/heads/%s\", branch_name);\n-\t\tif (!refs_ref_exists(get_main_ref_store(the_repository), branch_ref.buf))\n+\t\tif (!refs_ref_exists(get_main_ref_store(the_repository), branch_ref.buf)) {\n \t\t\terror((!argc || branch_checked_out(branch_ref.buf))\n \t\t\t      ? _(\"no commit on branch '%s' yet\")\n \t\t\t      : _(\"no branch named '%s'\"),\n \t\t\t      branch_name);\n-\t\telse if (!edit_branch_description(branch_name))\n+\t\t\tret = 1;\n+\t\t} else if (!edit_branch_description(branch_name)) {\n \t\t\tret = 0; /* happy */\n+\t\t} else {\n+\t\t\tret = 1;\n+\t\t}\n \n \t\tstrbuf_release(&branch_ref);\n \t\tstrbuf_release(&buf);\n \n-\t\treturn ret;\n+\t\tgoto out;\n \t} else if (copy || rename) {\n \t\tif (!argc)\n \t\t\tdie(_(\"branch name required\"));\n@@ -1000,12 +1006,17 @@ int cmd_branch(int argc,\n \t\t\tcreate_branches_recursively(the_repository, branch_name,\n \t\t\t\t\t\t    start_name, NULL, force,\n \t\t\t\t\t\t    reflog, quiet, track, 0);\n-\t\t\treturn 0;\n+\t\t\tret = 0;\n+\t\t\tgoto out;\n \t\t}\n \t\tcreate_branch(the_repository, branch_name, start_name, force, 0,\n \t\t\t      reflog, quiet, track, 0);\n \t} else\n \t\tusage_with_options(builtin_branch_usage, options);\n \n-\treturn 0;\n+\tret = 0;\n+\n+out:\n+\tstring_list_clear(&sorting_options, 0);\n+\treturn ret;\n }\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506740","messageId":"6439796a0bcc709febbce62277769d680992a44b.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 20/26] t/helper: fix leaking commit graph in \"read-graph\" subcommand","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:11:18Z","receivedAt":"2024-11-06T15:11:28Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"We're leaking the commit-graph in the \"test-helper read-graph\"\nsubcommand, but as the leak is annotated with `UNLEAK()` the leak\nsanitizer doesn't complain.\n\nFix the leak by calling `free_commit_graph()`. Besides getting rid of\nthe `UNLEAK()` annotation, it also increases code coverage because we\nproperly release resources as Git would do it, as well.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n t/helper/test-read-graph.c | 3 +--\n 1 file changed, 1 insertion(+), 2 deletions(-)\n\ndiff --git a/t/helper/test-read-graph.c b/t/helper/test-read-graph.c\nindex 9018c9f5412..811dde1cb3c 100644\n--- a/t/helper/test-read-graph.c\n+++ b/t/helper/test-read-graph.c\n@@ -97,7 +97,6 @@ int cmd__read_graph(int argc, const char **argv)\n \t}\n \n done:\n-\tUNLEAK(graph);\n-\n+\tfree_commit_graph(graph);\n \treturn ret;\n }\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506741","messageId":"2d64a941d511a88a25c1f8258b5c5682089fdae9.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 21/26] git-compat-util: drop `UNLEAK()` annotation","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:11:21Z","receivedAt":"2024-11-06T15:11:31Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"There are two users of `UNLEAK()` left in our codebase:\n\n  - In \"builtin/clone.c\", annotating the `repo` variable. That leak has\n    already been fixed though as you can see in the context, where we do\n    know to free `repo_to_free`.\n\n  - In \"builtin/diff.c\", to unleak entries of the `blob[]` array. That\n    leak has also been fixed, because the entries we assign to that\n    array come from `rev.pending.objects`, and we do eventually release\n    `rev`.\n\nThis neatly demonstrates one of the issues with `UNLEAK()`: it is quite\neasy for the annotation to become stale. A second issue is that its\nwhole intent is to paper over leaks. And while that has been a necessary\nevil in the past, because Git was leaking left and right, it isn't\nreally much of an issue nowadays where our test suite has no known leaks\nanymore.\n\nRemove the last two users and drop the now-unused `UNLEAK()` annotation.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n builtin/clone.c   |  1 -\n builtin/diff.c    |  1 -\n git-compat-util.h | 20 --------------------\n usage.c           | 15 ---------------\n 4 files changed, 37 deletions(-)\n\ndiff --git a/builtin/clone.c b/builtin/clone.c\nindex 59fcb317a68..e851b1475d7 100644\n--- a/builtin/clone.c\n+++ b/builtin/clone.c\n@@ -1586,7 +1586,6 @@ int cmd_clone(int argc,\n \tfree(dir);\n \tfree(path);\n \tfree(repo_to_free);\n-\tUNLEAK(repo);\n \tjunk_mode = JUNK_LEAVE_ALL;\n \n \ttransport_ls_refs_options_release(&transport_ls_refs_options);\ndiff --git a/builtin/diff.c b/builtin/diff.c\nindex dca52d4221e..2fe92f373e9 100644\n--- a/builtin/diff.c\n+++ b/builtin/diff.c\n@@ -628,6 +628,5 @@ int cmd_diff(int argc,\n \trelease_revisions(&rev);\n \tobject_array_clear(&ent);\n \tsymdiff_release(&sdiff);\n-\tUNLEAK(blob);\n \treturn result;\n }\ndiff --git a/git-compat-util.h b/git-compat-util.h\nindex e4a306dd563..a06d4f3809e 100644\n--- a/git-compat-util.h\n+++ b/git-compat-util.h\n@@ -1527,26 +1527,6 @@ int cmd_main(int, const char **);\n int common_exit(const char *file, int line, int code);\n #define exit(code) exit(common_exit(__FILE__, __LINE__, (code)))\n \n-/*\n- * You can mark a stack variable with UNLEAK(var) to avoid it being\n- * reported as a leak by tools like LSAN or valgrind. The argument\n- * should generally be the variable itself (not its address and not what\n- * it points to). It's safe to use this on pointers which may already\n- * have been freed, or on pointers which may still be in use.\n- *\n- * Use this _only_ for a variable that leaks by going out of scope at\n- * program exit (so only from cmd_* functions or their direct helpers).\n- * Normal functions, especially those which may be called multiple\n- * times, should actually free their memory. This is only meant as\n- * an annotation, and does nothing in non-leak-checking builds.\n- */\n-#ifdef SUPPRESS_ANNOTATED_LEAKS\n-void unleak_memory(const void *ptr, size_t len);\n-#define UNLEAK(var) unleak_memory(&(var), sizeof(var))\n-#else\n-#define UNLEAK(var) do {} while (0)\n-#endif\n-\n #define z_const\n #include <zlib.h>\n \ndiff --git a/usage.c b/usage.c\nindex 7a2f7805f57..29a9725784a 100644\n--- a/usage.c\n+++ b/usage.c\n@@ -350,18 +350,3 @@ void bug_fl(const char *file, int line, const char *fmt, ...)\n \ttrace2_cmd_error_va(fmt, ap);\n \tva_end(ap);\n }\n-\n-#ifdef SUPPRESS_ANNOTATED_LEAKS\n-void unleak_memory(const void *ptr, size_t len)\n-{\n-\tstatic struct suppressed_leak_root {\n-\t\tstruct suppressed_leak_root *next;\n-\t\tchar data[FLEX_ARRAY];\n-\t} *suppressed_leaks;\n-\tstruct suppressed_leak_root *root;\n-\n-\tFLEX_ALLOC_MEM(root, data, ptr, len);\n-\troot->next = suppressed_leaks;\n-\tsuppressed_leaks = root;\n-}\n-#endif\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506742","messageId":"c3f74fcf9c9ed0af9d44ef1e368d6964e7180afe.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 22/26] t5601: work around leak sanitizer issue","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:11:24Z","receivedAt":"2024-11-06T15:11:33Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"When running t5601 with the leak checker enabled we can see a hang in\nour CI systems. This hang seems to be system-specific, as I cannot\nreproduce it on my own machine.\n\nAs it turns out, the issue is in those testcases that exercise cloning\nof `~repo`-style paths. All of the testcases that hang eventually end up\ninterpreting \"repo\" as the username and will call getpwnam(3p) with that\nusername. That should of course be fine, and getpwnam(3p) should just\nreturn an error. But instead, the leak sanitizer seems to be recursing\nwhile handling a call to `free()` in the NSS modules:\n\n    #0  0x00007ffff7fd98d5 in _dl_update_slotinfo (req_modid=1, new_gen=2) at ../elf/dl-tls.c:720\n    #1  0x00007ffff7fd9ac4 in update_get_addr (ti=0x7ffff7a91d80, gen=<optimized out>) at ../elf/dl-tls.c:916\n    #2  0x00007ffff7fdc85c in __tls_get_addr () at ../sysdeps/x86_64/tls_get_addr.S:55\n    #3  0x00007ffff7a27e04 in __lsan::GetAllocatorCache () at ../../../../src/libsanitizer/lsan/lsan_linux.cpp:27\n    #4  0x00007ffff7a2b33a in __lsan::Deallocate (p=0x0) at ../../../../src/libsanitizer/lsan/lsan_allocator.cpp:127\n    #5  __lsan::lsan_free (p=0x0) at ../../../../src/libsanitizer/lsan/lsan_allocator.cpp:220\n    ...\n    #261505 0x00007ffff7fd99f2 in free (ptr=<optimized out>) at ../include/rtld-malloc.h:50\n    #261506 _dl_update_slotinfo (req_modid=1, new_gen=2) at ../elf/dl-tls.c:822\n    #261507 0x00007ffff7fd9ac4 in update_get_addr (ti=0x7ffff7a91d80, gen=<optimized out>) at ../elf/dl-tls.c:916\n    #261508 0x00007ffff7fdc85c in __tls_get_addr () at ../sysdeps/x86_64/tls_get_addr.S:55\n    #261509 0x00007ffff7a27e04 in __lsan::GetAllocatorCache () at ../../../../src/libsanitizer/lsan/lsan_linux.cpp:27\n    #261510 0x00007ffff7a2b33a in __lsan::Deallocate (p=0x5020000001e0) at ../../../../src/libsanitizer/lsan/lsan_allocator.cpp:127\n    #261511 __lsan::lsan_free (p=0x5020000001e0) at ../../../../src/libsanitizer/lsan/lsan_allocator.cpp:220\n    #261512 0x00007ffff793da25 in module_load (module=0x515000000280) at ./nss/nss_module.c:188\n    #261513 0x00007ffff793dee5 in __nss_module_load (module=0x515000000280) at ./nss/nss_module.c:302\n    #261514 __nss_module_get_function (module=0x515000000280, name=name@entry=0x7ffff79b9128 \"getpwnam_r\") at ./nss/nss_module.c:328\n    #261515 0x00007ffff793e741 in __GI___nss_lookup_function (fct_name=<optimized out>, ni=<optimized out>) at ./nss/nsswitch.c:137\n    #261516 __GI___nss_next2 (ni=ni@entry=0x7fffffffa458, fct_name=fct_name@entry=0x7ffff79b9128 \"getpwnam_r\", fct2_name=fct2_name@entry=0x0, fctp=fctp@entry=0x7fffffffa460,\n        status=status@entry=0, all_values=all_values@entry=0) at ./nss/nsswitch.c:120\n    #261517 0x00007ffff794c6a7 in __getpwnam_r (name=name@entry=0x501000000060 \"repo\", resbuf=resbuf@entry=0x7ffff79fb320 <resbuf>, buffer=<optimized out>,\n        buflen=buflen@entry=1024, result=result@entry=0x7fffffffa4b0) at ../nss/getXXbyYY_r.c:343\n    #261518 0x00007ffff794c4d8 in getpwnam (name=0x501000000060 \"repo\") at ../nss/getXXbyYY.c:140\n    #261519 0x00005555557e37ff in getpw_str (username=0x5020000001a1 \"repo\", len=4) at path.c:613\n    #261520 0x00005555557e3937 in interpolate_path (path=0x5020000001a0 \"~repo\", real_home=0) at path.c:654\n    #261521 0x00005555557e3aea in enter_repo (path=0x501000000040 \"~repo\", strict=0) at path.c:718\n    #261522 0x000055555568f0ba in cmd_upload_pack (argc=1, argv=0x502000000100, prefix=0x0, repo=0x0) at builtin/upload-pack.c:57\n    #261523 0x0000555555575ba8 in run_builtin (p=0x555555a20c98 <commands+3192>, argc=2, argv=0x502000000100, repo=0x555555a53b20 <the_repo>) at git.c:481\n    #261524 0x0000555555576067 in handle_builtin (args=0x7fffffffaab0) at git.c:742\n    #261525 0x000055555557678d in cmd_main (argc=2, argv=0x7fffffffac58) at git.c:912\n    #261526 0x00005555556963cd in main (argc=2, argv=0x7fffffffac58) at common-main.c:64\n\nNote that this stack is more than 260000 function calls deep. Run under\nthe debugger this will eventually segfault, but in our CI systems it\nseems like this just hangs forever.\n\nI assume that this is a bug either in the leak sanitizer or in glibc, as\nI cannot reproduce it on my machine. In any case, let's work around the\nbug for now by marking those tests with the \"!SANITIZE_LEAK\" prereq.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n t/t5601-clone.sh | 26 +++++++++++++++-----------\n 1 file changed, 15 insertions(+), 11 deletions(-)\n\ndiff --git a/t/t5601-clone.sh b/t/t5601-clone.sh\nindex 9fe665eadfb..d0c18660e33 100755\n--- a/t/t5601-clone.sh\n+++ b/t/t5601-clone.sh\n@@ -544,12 +544,16 @@ do\n \t\ttest_clone_url [::1]:$repo ::1 \"$repo\"\n \t'\n done\n-#home directory\n-test_expect_success \"clone host:/~repo\" '\n+\n+# Home directory. All tests that use \"~repo\" are broken in our CI job when the\n+# leak sanitizer is enabled. It seems like either a bug in the sanitizer or in\n+# glibc, but when executing getpwnam(3p) with an invalid username we eventually\n+# start recursing in a call to free(3p), until bust the stack and segfault.\n+test_expect_success !SANITIZE_LEAK \"clone host:/~repo\" '\n \ttest_clone_url host:/~repo host \"~repo\"\n '\n \n-test_expect_$expectation_for_ipv6_tests \"clone [::1]:/~repo\" '\n+test_expect_$expectation_for_ipv6_tests !SANITIZE_LEAK \"clone [::1]:/~repo\" '\n \ttest_clone_url [::1]:/~repo ::1 \"~repo\"\n '\n \n@@ -569,9 +573,9 @@ do\n \t\ttest_clone_url \"ssh://host.xz$tcol/home/user/repo\" host.xz /home/user/repo\n \t'\n \t# from home directory\n-\ttest_expect_success \"clone ssh://host.xz$tcol/~repo\" '\n-\ttest_clone_url \"ssh://host.xz$tcol/~repo\" host.xz \"~repo\"\n-'\n+\ttest_expect_success !SANITIZE_LEAK \"clone ssh://host.xz$tcol/~repo\" '\n+\t\ttest_clone_url \"ssh://host.xz$tcol/~repo\" host.xz \"~repo\"\n+\t'\n done\n \n # with port number\n@@ -580,7 +584,7 @@ test_expect_success 'clone ssh://host.xz:22/home/user/repo' '\n '\n \n # from home directory with port number\n-test_expect_success 'clone ssh://host.xz:22/~repo' '\n+test_expect_success !SANITIZE_LEAK 'clone ssh://host.xz:22/~repo' '\n \ttest_clone_url \"ssh://host.xz:22/~repo\" \"-p 22 host.xz\" \"~repo\"\n '\n \n@@ -597,8 +601,8 @@ done\n for tuah in ::1 [::1] user@::1 user@[::1] [user@::1]\n do\n \teuah=$(echo $tuah | tr -d \"[]\")\n-\ttest_expect_success \"clone ssh://$tuah/~repo\" \"\n-\t  test_clone_url ssh://$tuah/~repo $euah '~repo'\n+\ttest_expect_success !SANITIZE_LEAK \"clone ssh://$tuah/~repo\" \"\n+\t\ttest_clone_url ssh://$tuah/~repo $euah '~repo'\n \t\"\n done\n \n@@ -615,8 +619,8 @@ done\n for tuah in [::1] user@[::1] [user@::1]\n do\n \teuah=$(echo $tuah | tr -d \"[]\")\n-\ttest_expect_success \"clone ssh://$tuah:22/~repo\" \"\n-\t  test_clone_url ssh://$tuah:22/~repo '-p 22' $euah '~repo'\n+\ttest_expect_success !SANITIZE_LEAK \"clone ssh://$tuah:22/~repo\" \"\n+\t\t  test_clone_url ssh://$tuah:22/~repo '-p 22' $euah '~repo'\n \t\"\n done\n \n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506743","messageId":"38c97f34d7fd7f5442670ed84a52e227f05fd58b.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 23/26] t: mark some tests as leak free","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:11:27Z","receivedAt":"2024-11-06T15:11:36Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"Both t5558 and t5601 are leak-free starting with 6dab49b9fb (bundle-uri:\nplug leak in unbundle_from_file(), 2024-10-10). Mark them accordingly.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n t/t5558-clone-bundle-uri.sh | 1 +\n t/t5601-clone.sh            | 1 +\n 2 files changed, 2 insertions(+)\n\ndiff --git a/t/t5558-clone-bundle-uri.sh b/t/t5558-clone-bundle-uri.sh\nindex 3816ed5058d..b488b505b92 100755\n--- a/t/t5558-clone-bundle-uri.sh\n+++ b/t/t5558-clone-bundle-uri.sh\n@@ -2,6 +2,7 @@\n \n test_description='test fetching bundles with --bundle-uri'\n \n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-bundle.sh\n \ndiff --git a/t/t5601-clone.sh b/t/t5601-clone.sh\nindex d0c18660e33..3b5285cfcf3 100755\n--- a/t/t5601-clone.sh\n+++ b/t/t5601-clone.sh\n@@ -5,6 +5,7 @@ test_description=clone\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n X=\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506744","messageId":"ccbda5a768295b7db56dc3383d992ab20953ba4e.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 24/26] t: remove unneeded !SANITIZE_LEAK prerequisites","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:11:30Z","receivedAt":"2024-11-06T15:11:41Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"We have a couple of !SANITIZE_LEAK prerequisites for tests that used to\nfail due to memory leaks. These have all been fixed by now, so let's\ndrop the prerequisite.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n t/t0095-bloom.sh          |  2 +-\n t/t2407-worktree-heads.sh | 16 ++++++++--------\n t/t4020-diff-external.sh  |  4 ++--\n 3 files changed, 11 insertions(+), 11 deletions(-)\n\ndiff --git a/t/t0095-bloom.sh b/t/t0095-bloom.sh\nindex c8d84ab6061..08df74cacfc 100755\n--- a/t/t0095-bloom.sh\n+++ b/t/t0095-bloom.sh\n@@ -77,7 +77,7 @@ test_expect_success 'compute bloom key for test string 2' '\n \ttest_cmp expect actual\n '\n \n-test_expect_success !SANITIZE_LEAK 'get bloom filters for commit with no changes' '\n+test_expect_success 'get bloom filters for commit with no changes' '\n \tgit init &&\n \tgit commit --allow-empty -m \"c0\" &&\n \tcat >expect <<-\\EOF &&\ndiff --git a/t/t2407-worktree-heads.sh b/t/t2407-worktree-heads.sh\nindex f6835c91dcc..7750dc9265a 100755\n--- a/t/t2407-worktree-heads.sh\n+++ b/t/t2407-worktree-heads.sh\n@@ -49,7 +49,7 @@ test_expect_success 'refuse to overwrite: checked out in worktree' '\n \tdone\n '\n \n-test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in bisect' '\n+test_expect_success 'refuse to overwrite: worktree in bisect' '\n \ttest_when_finished git -C wt-4 bisect reset &&\n \n \t# Set up a bisect so HEAD no longer points to wt-4.\n@@ -61,7 +61,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in bisect' '\n \tgrep \"cannot force update the branch '\\''wt-4'\\'' used by worktree at.*wt-4\" err\n '\n \n-test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase (apply)' '\n+test_expect_success 'refuse to overwrite: worktree in rebase (apply)' '\n \ttest_when_finished git -C wt-2 rebase --abort &&\n \n \t# This will fail part-way through due to a conflict.\n@@ -71,7 +71,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase (app\n \tgrep \"cannot force update the branch '\\''wt-2'\\'' used by worktree at.*wt-2\" err\n '\n \n-test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase (merge)' '\n+test_expect_success 'refuse to overwrite: worktree in rebase (merge)' '\n \ttest_when_finished git -C wt-2 rebase --abort &&\n \n \t# This will fail part-way through due to a conflict.\n@@ -81,7 +81,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase (mer\n \tgrep \"cannot force update the branch '\\''wt-2'\\'' used by worktree at.*wt-2\" err\n '\n \n-test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase with --update-refs' '\n+test_expect_success 'refuse to overwrite: worktree in rebase with --update-refs' '\n \ttest_when_finished git -C wt-3 rebase --abort &&\n \n \tgit branch -f can-be-updated wt-3 &&\n@@ -95,7 +95,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase with\n \tdone\n '\n \n-test_expect_success !SANITIZE_LEAK 'refuse to fetch over ref: checked out' '\n+test_expect_success 'refuse to fetch over ref: checked out' '\n \ttest_must_fail git fetch server +refs/heads/wt-3:refs/heads/wt-3 2>err &&\n \tgrep \"refusing to fetch into branch '\\''refs/heads/wt-3'\\''\" err &&\n \n@@ -105,7 +105,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to fetch over ref: checked out' '\n \tgrep \"refusing to fetch into branch\" err\n '\n \n-test_expect_success !SANITIZE_LEAK 'refuse to fetch over ref: worktree in bisect' '\n+test_expect_success 'refuse to fetch over ref: worktree in bisect' '\n \ttest_when_finished git -C wt-4 bisect reset &&\n \n \t# Set up a bisect so HEAD no longer points to wt-4.\n@@ -117,7 +117,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to fetch over ref: worktree in bisect\n \tgrep \"refusing to fetch into branch\" err\n '\n \n-test_expect_success !SANITIZE_LEAK 'refuse to fetch over ref: worktree in rebase' '\n+test_expect_success 'refuse to fetch over ref: worktree in rebase' '\n \ttest_when_finished git -C wt-3 rebase --abort &&\n \n \t# This will fail part-way through due to a conflict.\n@@ -157,7 +157,7 @@ test_expect_success 'refuse to overwrite when in error states' '\n \n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n \n-test_expect_success !SANITIZE_LEAK 'refuse to overwrite during rebase with --update-refs' '\n+test_expect_success 'refuse to overwrite during rebase with --update-refs' '\n \tgit commit --fixup HEAD~2 --allow-empty &&\n \t(\n \t\tset_cat_todo_editor &&\ndiff --git a/t/t4020-diff-external.sh b/t/t4020-diff-external.sh\nindex 3baa52a9bf6..0e5a05894fd 100755\n--- a/t/t4020-diff-external.sh\n+++ b/t/t4020-diff-external.sh\n@@ -102,7 +102,7 @@ test_expect_success 'diff attribute' '\n \ttest_cmp expect actual\n '\n \n-test_expect_success !SANITIZE_LEAK 'diff attribute should apply only to diff' '\n+test_expect_success 'diff attribute should apply only to diff' '\n \tgit log -p -1 HEAD >out &&\n \tgrep \"^diff --git a/file b/file\" out\n \n@@ -129,7 +129,7 @@ test_expect_success 'diff attribute' '\n \ttest_cmp expect actual\n '\n \n-test_expect_success !SANITIZE_LEAK 'diff attribute should apply only to diff' '\n+test_expect_success 'diff attribute should apply only to diff' '\n \tgit log -p -1 HEAD >out &&\n \tgrep \"^diff --git a/file b/file\" out\n \n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506745","messageId":"ad7529ff2a2d5dd952b153ff9c9ee93d3eb4aa3c.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 25/26] test-lib: unconditionally enable leak checking","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:11:34Z","receivedAt":"2024-11-06T15:11:43Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"Over the last two releases we have plugged a couple hundred of memory\nleaks exposed by the Git test suite. With the preceding commits we have\nfinally fixed the last leak exposed by our test suite, which means that\nwe are now basically leak free wherever we have branch coverage.\n\nFrom hereon, the Git test suite should ideally stay free of memory\nleaks. Most importantly, any test suite that is being added should\nautomatically be subject to the leak checker, and if that test does not\npass it is a strong signal that the added code introduced new memory\nleaks and should not be accepted without further changes.\n\nDrop the infrastructure around TEST_PASSES_SANITIZE_LEAK to reflect this\nnew requirement. Like this, all test suites will be subject to the leak\nchecker by default.\n\nThis is being intentionally strict, but we still have an escape hatch:\nthe SANITIZE_LEAK prerequisite. There is one known case in t5601 where\nthe leak sanitizer itself is buggy, so adding this prereq in such cases\nis acceptable. Another acceptable situation is when a newly added test\nuncovers preexisting memory leaks: when fixing that memory leak would be\nsufficiently complicated it is fine to annotate and document the leak\naccordingly. But in any case, the burden is now on the patch author to\nexplain why exactly they have to add the SANITIZE_LEAK prerequisite.\n\nThe TEST_PASSES_SANITIZE_LEAK annotations will be dropped in the next\npatch.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n ci/lib.sh        |  1 -\n t/README         | 21 --------------\n t/lib-git-svn.sh |  4 ---\n t/test-lib.sh    | 72 +-----------------------------------------------\n 4 files changed, 1 insertion(+), 97 deletions(-)\n\ndiff --git a/ci/lib.sh b/ci/lib.sh\nindex 246072a0932..930f98d7228 100755\n--- a/ci/lib.sh\n+++ b/ci/lib.sh\n@@ -384,7 +384,6 @@ linux-musl)\n \t;;\n linux-leaks|linux-reftable-leaks)\n \texport SANITIZE=leak\n-\texport GIT_TEST_PASSING_SANITIZE_LEAK=true\n \t;;\n linux-asan-ubsan)\n \texport SANITIZE=address,undefined\ndiff --git a/t/README b/t/README\nindex 8c0319b58e5..e84824dc002 100644\n--- a/t/README\n+++ b/t/README\n@@ -368,27 +368,6 @@ excluded as so much relies on it, but this might change in the future.\n GIT_TEST_SPLIT_INDEX=<boolean> forces split-index mode on the whole\n test suite. Accept any boolean values that are accepted by git-config.\n \n-GIT_TEST_PASSING_SANITIZE_LEAK=true skips those tests that haven't\n-declared themselves as leak-free by setting\n-\"TEST_PASSES_SANITIZE_LEAK=true\" before sourcing \"test-lib.sh\". This\n-test mode is used by the \"linux-leaks\" CI target.\n-\n-GIT_TEST_PASSING_SANITIZE_LEAK=check checks that our\n-\"TEST_PASSES_SANITIZE_LEAK=true\" markings are current. Rather than\n-skipping those tests that haven't set \"TEST_PASSES_SANITIZE_LEAK=true\"\n-before sourcing \"test-lib.sh\" this mode runs them with\n-\"--invert-exit-code\". This is used to check that there's a one-to-one\n-mapping between \"TEST_PASSES_SANITIZE_LEAK=true\" and those tests that\n-pass under \"SANITIZE=leak\". This is especially useful when testing a\n-series that fixes various memory leaks with \"git rebase -x\".\n-\n-GIT_TEST_PASSING_SANITIZE_LEAK=check when combined with \"--immediate\"\n-will run to completion faster, and result in the same failing\n-tests.\n-\n-GIT_TEST_PASSING_SANITIZE_LEAK=check-failing behaves the same as \"check\",\n-but skips all tests which are already marked as leak-free.\n-\n GIT_TEST_PROTOCOL_VERSION=<n>, when set, makes 'protocol.version'\n default to n.\n \ndiff --git a/t/lib-git-svn.sh b/t/lib-git-svn.sh\nindex ea28971e8ee..2fde2353fd3 100644\n--- a/t/lib-git-svn.sh\n+++ b/t/lib-git-svn.sh\n@@ -1,7 +1,3 @@\n-if test -z \"$TEST_FAILS_SANITIZE_LEAK\"\n-then\n-\tTEST_PASSES_SANITIZE_LEAK=true\n-fi\n . ./test-lib.sh\n \n if test -n \"$NO_SVN_TESTS\"\ndiff --git a/t/test-lib.sh b/t/test-lib.sh\nindex a278181a056..508b5fe1f55 100644\n--- a/t/test-lib.sh\n+++ b/t/test-lib.sh\n@@ -1227,23 +1227,7 @@ check_test_results_san_file_ () {\n \tfi &&\n \tsay_color error \"$(cat \"$TEST_RESULTS_SAN_FILE\".*)\" &&\n \n-\tif test -n \"$passes_sanitize_leak\" && test \"$test_failure\" = 0\n-\tthen\n-\t\tsay \"As TEST_PASSES_SANITIZE_LEAK=true and our logs show we're leaking, exit non-zero!\" &&\n-\t\tinvert_exit_code=t\n-\telif test -n \"$passes_sanitize_leak\"\n-\tthen\n-\t\tsay \"As TEST_PASSES_SANITIZE_LEAK=true and our logs show we're leaking, and we're failing for other reasons too...\" &&\n-\t\tinvert_exit_code=\n-\telif test -n \"$sanitize_leak_check\" && test \"$test_failure\" = 0\n-\tthen\n-\t\tsay \"As TEST_PASSES_SANITIZE_LEAK=true isn't set the above leak is 'ok' with GIT_TEST_PASSING_SANITIZE_LEAK=check\" &&\n-\t\tinvert_exit_code=\n-\telif test -n \"$sanitize_leak_check\"\n-\tthen\n-\t\tsay \"As TEST_PASSES_SANITIZE_LEAK=true isn't set the above leak is 'ok' with GIT_TEST_PASSING_SANITIZE_LEAK=check\" &&\n-\t\tinvert_exit_code=t\n-\telif test \"$test_failure\" = 0\n+\tif test \"$test_failure\" = 0\n \tthen\n \t\tsay \"Our logs revealed a memory leak, exit non-zero!\" &&\n \t\tinvert_exit_code=t\n@@ -1274,11 +1258,6 @@ test_done () {\n \t\tEOF\n \tfi\n \n-\tif test -z \"$passes_sanitize_leak\" && test_bool_env TEST_PASSES_SANITIZE_LEAK false\n-\tthen\n-\t\tBAIL_OUT \"Please, set TEST_PASSES_SANITIZE_LEAK before sourcing test-lib.sh\"\n-\tfi\n-\n \tif test \"$test_fixed\" != 0\n \tthen\n \t\tsay_color error \"# $test_fixed known breakage(s) vanished; please update test(s)\"\n@@ -1515,51 +1494,8 @@ then\n \ttest_done\n fi\n \n-BAIL_OUT_ENV_NEEDS_SANITIZE_LEAK () {\n-\tBAIL_OUT \"$1 has no effect except when compiled with SANITIZE=leak\"\n-}\n-\n if test -n \"$SANITIZE_LEAK\"\n then\n-\t# Normalize with test_bool_env\n-\tpasses_sanitize_leak=\n-\n-\t# We need to see TEST_PASSES_SANITIZE_LEAK in \"test-tool\n-\t# env-helper\" (via test_bool_env)\n-\texport TEST_PASSES_SANITIZE_LEAK\n-\tif test_bool_env TEST_PASSES_SANITIZE_LEAK false\n-\tthen\n-\t\tpasses_sanitize_leak=t\n-\tfi\n-\n-\tif test \"$GIT_TEST_PASSING_SANITIZE_LEAK\" = \"check\" ||\n-\t   test \"$GIT_TEST_PASSING_SANITIZE_LEAK\" = \"check-failing\"\n-\tthen\n-\t\tif test \"$GIT_TEST_PASSING_SANITIZE_LEAK\" = \"check-failing\" &&\n-\t\t   test -n \"$passes_sanitize_leak\"\n-\t\tthen\n-\t\t\tskip_all=\"skipping leak-free $this_test under GIT_TEST_PASSING_SANITIZE_LEAK=check-failing\"\n-\t\t\ttest_done\n-\t\tfi\n-\n-\t\tsanitize_leak_check=t\n-\t\tif test -n \"$invert_exit_code\"\n-\t\tthen\n-\t\t\tBAIL_OUT \"cannot use --invert-exit-code under GIT_TEST_PASSING_SANITIZE_LEAK=check\"\n-\t\tfi\n-\n-\t\tif test -z \"$passes_sanitize_leak\"\n-\t\tthen\n-\t\t\tsay \"in GIT_TEST_PASSING_SANITIZE_LEAK=check mode, setting --invert-exit-code for TEST_PASSES_SANITIZE_LEAK != true\"\n-\t\t\tinvert_exit_code=t\n-\t\tfi\n-\telif test -z \"$passes_sanitize_leak\" &&\n-\t     test_bool_env GIT_TEST_PASSING_SANITIZE_LEAK false\n-\tthen\n-\t\tskip_all=\"skipping $this_test under GIT_TEST_PASSING_SANITIZE_LEAK=true\"\n-\t\ttest_done\n-\tfi\n-\n \trm -rf \"$TEST_RESULTS_SAN_DIR\"\n \tif ! mkdir -p \"$TEST_RESULTS_SAN_DIR\"\n \tthen\n@@ -1574,12 +1510,6 @@ then\n \tprepend_var LSAN_OPTIONS : log_exe_name=1\n \tprepend_var LSAN_OPTIONS : log_path=\"'$TEST_RESULTS_SAN_FILE'\"\n \texport LSAN_OPTIONS\n-\n-elif test \"$GIT_TEST_PASSING_SANITIZE_LEAK\" = \"check\" ||\n-     test \"$GIT_TEST_PASSING_SANITIZE_LEAK\" = \"check-failing\" ||\n-     test_bool_env GIT_TEST_PASSING_SANITIZE_LEAK false\n-then\n-\tBAIL_OUT_ENV_NEEDS_SANITIZE_LEAK \"GIT_TEST_PASSING_SANITIZE_LEAK=true\"\n fi\n \n if test \"${GIT_TEST_CHAIN_LINT:-1}\" != 0 &&\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506746","messageId":"98e59f0f32bfab3233824248b43da6db4da3d7da.1730901926.git.ps@pks.im","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH 26/26] t: remove TEST_PASSES_SANITIZE_LEAK annotations","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-06T15:11:37Z","receivedAt":"2024-11-06T15:11:47Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"Now that the default value for TEST_PASSES_SANITIZE_LEAK is `true` there\nis no longer a need to have that variable declared in all of our tests.\nDrop it.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n t/t0001-init.sh                                    | 1 -\n t/t0002-gitfile.sh                                 | 1 -\n t/t0003-attributes.sh                              | 1 -\n t/t0004-unwritable.sh                              | 1 -\n t/t0005-signals.sh                                 | 1 -\n t/t0006-date.sh                                    | 1 -\n t/t0007-git-var.sh                                 | 1 -\n t/t0008-ignores.sh                                 | 1 -\n t/t0010-racy-git.sh                                | 1 -\n t/t0012-help.sh                                    | 1 -\n t/t0013-sha1dc.sh                                  | 1 -\n t/t0014-alias.sh                                   | 1 -\n t/t0017-env-helper.sh                              | 1 -\n t/t0018-advice.sh                                  | 1 -\n t/t0019-json-writer.sh                             | 1 -\n t/t0020-crlf.sh                                    | 1 -\n t/t0021-conversion.sh                              | 1 -\n t/t0022-crlf-rename.sh                             | 1 -\n t/t0023-crlf-am.sh                                 | 1 -\n t/t0024-crlf-archive.sh                            | 1 -\n t/t0025-crlf-renormalize.sh                        | 1 -\n t/t0026-eol-config.sh                              | 1 -\n t/t0027-auto-crlf.sh                               | 1 -\n t/t0028-working-tree-encoding.sh                   | 1 -\n t/t0029-core-unsetenvvars.sh                       | 1 -\n t/t0030-stripspace.sh                              | 1 -\n t/t0033-safe-directory.sh                          | 1 -\n t/t0035-safe-bare-repository.sh                    | 1 -\n t/t0040-parse-options.sh                           | 1 -\n t/t0041-usage.sh                                   | 1 -\n t/t0050-filesystem.sh                              | 1 -\n t/t0052-simple-ipc.sh                              | 1 -\n t/t0055-beyond-symlinks.sh                         | 1 -\n t/t0056-git-C.sh                                   | 1 -\n t/t0060-path-utils.sh                              | 1 -\n t/t0061-run-command.sh                             | 1 -\n t/t0062-revision-walking.sh                        | 1 -\n t/t0063-string-list.sh                             | 1 -\n t/t0066-dir-iterator.sh                            | 1 -\n t/t0067-parse_pathspec_file.sh                     | 1 -\n t/t0068-for-each-repo.sh                           | 1 -\n t/t0070-fundamental.sh                             | 1 -\n t/t0071-sort.sh                                    | 1 -\n t/t0080-unit-test-output.sh                        | 1 -\n t/t0081-find-pack.sh                               | 1 -\n t/t0090-cache-tree.sh                              | 1 -\n t/t0091-bugreport.sh                               | 1 -\n t/t0092-diagnose.sh                                | 1 -\n t/t0095-bloom.sh                                   | 1 -\n t/t0100-previous.sh                                | 1 -\n t/t0101-at-syntax.sh                               | 1 -\n t/t0200-gettext-basic.sh                           | 1 -\n t/t0201-gettext-fallbacks.sh                       | 1 -\n t/t0202-gettext-perl.sh                            | 1 -\n t/t0203-gettext-setlocale-sanity.sh                | 1 -\n t/t0204-gettext-reencode-sanity.sh                 | 1 -\n t/t0210-trace2-normal.sh                           | 1 -\n t/t0211-trace2-perf.sh                             | 1 -\n t/t0212-trace2-event.sh                            | 1 -\n t/t0300-credentials.sh                             | 1 -\n t/t0301-credential-cache.sh                        | 1 -\n t/t0302-credential-store.sh                        | 1 -\n t/t0303-credential-external.sh                     | 1 -\n t/t0410-partial-clone.sh                           | 1 -\n t/t0411-clone-from-partial.sh                      | 1 -\n t/t0450-txt-doc-vs-help.sh                         | 1 -\n t/t0500-progress-display.sh                        | 1 -\n t/t0600-reffiles-backend.sh                        | 1 -\n t/t0601-reffiles-pack-refs.sh                      | 1 -\n t/t0602-reffiles-fsck.sh                           | 1 -\n t/t0610-reftable-basics.sh                         | 1 -\n t/t0611-reftable-httpd.sh                          | 1 -\n t/t0612-reftable-jgit-compatibility.sh             | 1 -\n t/t0613-reftable-write-options.sh                  | 1 -\n t/t1000-read-tree-m-3way.sh                        | 1 -\n t/t1001-read-tree-m-2way.sh                        | 1 -\n t/t1002-read-tree-m-u-2way.sh                      | 1 -\n t/t1003-read-tree-prefix.sh                        | 1 -\n t/t1004-read-tree-m-u-wf.sh                        | 1 -\n t/t1005-read-tree-reset.sh                         | 1 -\n t/t1006-cat-file.sh                                | 1 -\n t/t1007-hash-object.sh                             | 1 -\n t/t1008-read-tree-overlay.sh                       | 1 -\n t/t1009-read-tree-new-index.sh                     | 1 -\n t/t1010-mktree.sh                                  | 1 -\n t/t1011-read-tree-sparse-checkout.sh               | 1 -\n t/t1012-read-tree-df.sh                            | 1 -\n t/t1013-read-tree-submodule.sh                     | 1 -\n t/t1014-read-tree-confusing.sh                     | 1 -\n t/t1015-read-index-unmerged.sh                     | 1 -\n t/t1016-compatObjectFormat.sh                      | 1 -\n t/t1020-subdirectory.sh                            | 1 -\n t/t1021-rerere-in-workdir.sh                       | 1 -\n t/t1022-read-tree-partial-clone.sh                 | 1 -\n t/t1050-large.sh                                   | 1 -\n t/t1051-large-conversion.sh                        | 1 -\n t/t1060-object-corruption.sh                       | 1 -\n t/t1090-sparse-checkout-scope.sh                   | 1 -\n t/t1091-sparse-checkout-builtin.sh                 | 1 -\n t/t1092-sparse-checkout-compatibility.sh           | 1 -\n t/t1100-commit-tree-options.sh                     | 1 -\n t/t1300-config.sh                                  | 1 -\n t/t1301-shared-repo.sh                             | 1 -\n t/t1302-repo-version.sh                            | 1 -\n t/t1303-wacky-config.sh                            | 1 -\n t/t1304-default-acl.sh                             | 1 -\n t/t1305-config-include.sh                          | 1 -\n t/t1306-xdg-files.sh                               | 1 -\n t/t1307-config-blob.sh                             | 1 -\n t/t1308-config-set.sh                              | 1 -\n t/t1309-early-config.sh                            | 1 -\n t/t1310-config-default.sh                          | 1 -\n t/t1350-config-hooks-path.sh                       | 1 -\n t/t1400-update-ref.sh                              | 1 -\n t/t1401-symbolic-ref.sh                            | 1 -\n t/t1402-check-ref-format.sh                        | 1 -\n t/t1403-show-ref.sh                                | 1 -\n t/t1404-update-ref-errors.sh                       | 1 -\n t/t1405-main-ref-store.sh                          | 1 -\n t/t1406-submodule-ref-store.sh                     | 1 -\n t/t1407-worktree-ref-store.sh                      | 1 -\n t/t1408-packed-refs.sh                             | 1 -\n t/t1409-avoid-packing-refs.sh                      | 1 -\n t/t1410-reflog.sh                                  | 1 -\n t/t1411-reflog-show.sh                             | 1 -\n t/t1412-reflog-loop.sh                             | 1 -\n t/t1413-reflog-detach.sh                           | 1 -\n t/t1414-reflog-walk.sh                             | 1 -\n t/t1415-worktree-refs.sh                           | 1 -\n t/t1416-ref-transaction-hooks.sh                   | 1 -\n t/t1417-reflog-updateref.sh                        | 1 -\n t/t1418-reflog-exists.sh                           | 1 -\n t/t1419-exclude-refs.sh                            | 1 -\n t/t1420-lost-found.sh                              | 1 -\n t/t1430-bad-ref-name.sh                            | 1 -\n t/t1450-fsck.sh                                    | 1 -\n t/t1451-fsck-buffer.sh                             | 1 -\n t/t1460-refs-migrate.sh                            | 1 -\n t/t1500-rev-parse.sh                               | 1 -\n t/t1501-work-tree.sh                               | 1 -\n t/t1502-rev-parse-parseopt.sh                      | 1 -\n t/t1503-rev-parse-verify.sh                        | 1 -\n t/t1504-ceiling-dirs.sh                            | 1 -\n t/t1505-rev-parse-last.sh                          | 1 -\n t/t1506-rev-parse-diagnosis.sh                     | 1 -\n t/t1507-rev-parse-upstream.sh                      | 1 -\n t/t1508-at-combinations.sh                         | 1 -\n t/t1510-repo-setup.sh                              | 1 -\n t/t1511-rev-parse-caret.sh                         | 1 -\n t/t1512-rev-parse-disambiguation.sh                | 1 -\n t/t1513-rev-parse-prefix.sh                        | 1 -\n t/t1514-rev-parse-push.sh                          | 1 -\n t/t1515-rev-parse-outside-repo.sh                  | 1 -\n t/t1517-outside-repo.sh                            | 1 -\n t/t1600-index.sh                                   | 1 -\n t/t1601-index-bogus.sh                             | 1 -\n t/t1700-split-index.sh                             | 1 -\n t/t1701-racy-split-index.sh                        | 1 -\n t/t1800-hook.sh                                    | 1 -\n t/t2000-conflict-when-checking-files-out.sh        | 1 -\n t/t2002-checkout-cache-u.sh                        | 1 -\n t/t2003-checkout-cache-mkdir.sh                    | 1 -\n t/t2004-checkout-cache-temp.sh                     | 1 -\n t/t2005-checkout-index-symlinks.sh                 | 1 -\n t/t2006-checkout-index-basic.sh                    | 1 -\n t/t2007-checkout-symlink.sh                        | 1 -\n t/t2008-checkout-subdir.sh                         | 1 -\n t/t2009-checkout-statinfo.sh                       | 1 -\n t/t2010-checkout-ambiguous.sh                      | 1 -\n t/t2011-checkout-invalid-head.sh                   | 1 -\n t/t2012-checkout-last.sh                           | 1 -\n t/t2013-checkout-submodule.sh                      | 1 -\n t/t2014-checkout-switch.sh                         | 1 -\n t/t2015-checkout-unborn.sh                         | 1 -\n t/t2016-checkout-patch.sh                          | 1 -\n t/t2017-checkout-orphan.sh                         | 1 -\n t/t2018-checkout-branch.sh                         | 1 -\n t/t2019-checkout-ambiguous-ref.sh                  | 1 -\n t/t2020-checkout-detach.sh                         | 1 -\n t/t2021-checkout-overwrite.sh                      | 1 -\n t/t2022-checkout-paths.sh                          | 1 -\n t/t2023-checkout-m.sh                              | 1 -\n t/t2024-checkout-dwim.sh                           | 1 -\n t/t2025-checkout-no-overlay.sh                     | 1 -\n t/t2026-checkout-pathspec-file.sh                  | 1 -\n t/t2027-checkout-track.sh                          | 1 -\n t/t2030-unresolve-info.sh                          | 1 -\n t/t2050-git-dir-relative.sh                        | 1 -\n t/t2060-switch.sh                                  | 1 -\n t/t2070-restore.sh                                 | 1 -\n t/t2071-restore-patch.sh                           | 1 -\n t/t2072-restore-pathspec-file.sh                   | 1 -\n t/t2080-parallel-checkout-basics.sh                | 1 -\n t/t2081-parallel-checkout-collisions.sh            | 1 -\n t/t2082-parallel-checkout-attributes.sh            | 1 -\n t/t2100-update-cache-badpath.sh                    | 1 -\n t/t2101-update-index-reupdate.sh                   | 1 -\n t/t2102-update-index-symlinks.sh                   | 1 -\n t/t2103-update-index-ignore-missing.sh             | 1 -\n t/t2104-update-index-skip-worktree.sh              | 1 -\n t/t2105-update-index-gitfile.sh                    | 1 -\n t/t2106-update-index-assume-unchanged.sh           | 1 -\n t/t2107-update-index-basic.sh                      | 1 -\n t/t2108-update-index-refresh-racy.sh               | 1 -\n t/t2200-add-update.sh                              | 1 -\n t/t2201-add-update-typechange.sh                   | 1 -\n t/t2202-add-addremove.sh                           | 1 -\n t/t2203-add-intent.sh                              | 1 -\n t/t2204-add-ignored.sh                             | 1 -\n t/t2205-add-worktree-config.sh                     | 1 -\n t/t2300-cd-to-toplevel.sh                          | 1 -\n t/t2400-worktree-add.sh                            | 1 -\n t/t2401-worktree-prune.sh                          | 1 -\n t/t2402-worktree-list.sh                           | 1 -\n t/t2403-worktree-move.sh                           | 1 -\n t/t2404-worktree-config.sh                         | 1 -\n t/t2405-worktree-submodule.sh                      | 1 -\n t/t2406-worktree-repair.sh                         | 1 -\n t/t2407-worktree-heads.sh                          | 1 -\n t/t2408-worktree-relative.sh                       | 1 -\n t/t2500-untracked-overwriting.sh                   | 1 -\n t/t2501-cwd-empty.sh                               | 1 -\n t/t3000-ls-files-others.sh                         | 1 -\n t/t3001-ls-files-others-exclude.sh                 | 1 -\n t/t3002-ls-files-dashpath.sh                       | 1 -\n t/t3003-ls-files-exclude.sh                        | 1 -\n t/t3004-ls-files-basic.sh                          | 1 -\n t/t3005-ls-files-relative.sh                       | 1 -\n t/t3006-ls-files-long.sh                           | 1 -\n t/t3007-ls-files-recurse-submodules.sh             | 1 -\n t/t3008-ls-files-lazy-init-name-hash.sh            | 1 -\n t/t3009-ls-files-others-nonsubmodule.sh            | 1 -\n t/t3010-ls-files-killed-modified.sh                | 1 -\n t/t3011-common-prefixes-and-directory-traversal.sh | 1 -\n t/t3012-ls-files-dedup.sh                          | 1 -\n t/t3013-ls-files-format.sh                         | 1 -\n t/t3020-ls-files-error-unmatch.sh                  | 1 -\n t/t3040-subprojects-basic.sh                       | 1 -\n t/t3050-subprojects-fetch.sh                       | 1 -\n t/t3060-ls-files-with-tree.sh                      | 1 -\n t/t3070-wildmatch.sh                               | 1 -\n t/t3100-ls-tree-restrict.sh                        | 1 -\n t/t3101-ls-tree-dirname.sh                         | 1 -\n t/t3102-ls-tree-wildcards.sh                       | 1 -\n t/t3103-ls-tree-misc.sh                            | 1 -\n t/t3104-ls-tree-format.sh                          | 1 -\n t/t3105-ls-tree-output.sh                          | 1 -\n t/t3200-branch.sh                                  | 1 -\n t/t3201-branch-contains.sh                         | 1 -\n t/t3202-show-branch.sh                             | 1 -\n t/t3203-branch-output.sh                           | 1 -\n t/t3204-branch-name-interpretation.sh              | 1 -\n t/t3205-branch-color.sh                            | 1 -\n t/t3206-range-diff.sh                              | 1 -\n t/t3207-branch-submodule.sh                        | 1 -\n t/t3211-peel-ref.sh                                | 1 -\n t/t3300-funny-names.sh                             | 1 -\n t/t3301-notes.sh                                   | 1 -\n t/t3302-notes-index-expensive.sh                   | 1 -\n t/t3303-notes-subtrees.sh                          | 1 -\n t/t3304-notes-mixed.sh                             | 1 -\n t/t3305-notes-fanout.sh                            | 1 -\n t/t3306-notes-prune.sh                             | 1 -\n t/t3307-notes-man.sh                               | 1 -\n t/t3308-notes-merge.sh                             | 1 -\n t/t3309-notes-merge-auto-resolve.sh                | 1 -\n t/t3310-notes-merge-manual-resolve.sh              | 1 -\n t/t3311-notes-merge-fanout.sh                      | 1 -\n t/t3320-notes-merge-worktrees.sh                   | 1 -\n t/t3321-notes-stripspace.sh                        | 1 -\n t/t3400-rebase.sh                                  | 1 -\n t/t3401-rebase-and-am-rename.sh                    | 1 -\n t/t3402-rebase-merge.sh                            | 1 -\n t/t3403-rebase-skip.sh                             | 1 -\n t/t3404-rebase-interactive.sh                      | 1 -\n t/t3405-rebase-malformed.sh                        | 1 -\n t/t3406-rebase-message.sh                          | 1 -\n t/t3407-rebase-abort.sh                            | 1 -\n t/t3408-rebase-multi-line.sh                       | 1 -\n t/t3409-rebase-environ.sh                          | 1 -\n t/t3412-rebase-root.sh                             | 1 -\n t/t3413-rebase-hook.sh                             | 1 -\n t/t3415-rebase-autosquash.sh                       | 1 -\n t/t3416-rebase-onto-threedots.sh                   | 1 -\n t/t3417-rebase-whitespace-fix.sh                   | 1 -\n t/t3418-rebase-continue.sh                         | 1 -\n t/t3419-rebase-patch-id.sh                         | 1 -\n t/t3420-rebase-autostash.sh                        | 1 -\n t/t3421-rebase-topology-linear.sh                  | 1 -\n t/t3422-rebase-incompatible-options.sh             | 1 -\n t/t3423-rebase-reword.sh                           | 1 -\n t/t3424-rebase-empty.sh                            | 1 -\n t/t3425-rebase-topology-merges.sh                  | 1 -\n t/t3426-rebase-submodule.sh                        | 1 -\n t/t3427-rebase-subtree.sh                          | 1 -\n t/t3428-rebase-signoff.sh                          | 1 -\n t/t3429-rebase-edit-todo.sh                        | 1 -\n t/t3430-rebase-merges.sh                           | 1 -\n t/t3431-rebase-fork-point.sh                       | 1 -\n t/t3432-rebase-fast-forward.sh                     | 1 -\n t/t3433-rebase-across-mode-change.sh               | 1 -\n t/t3434-rebase-i18n.sh                             | 1 -\n t/t3435-rebase-gpg-sign.sh                         | 1 -\n t/t3436-rebase-more-options.sh                     | 1 -\n t/t3437-rebase-fixup-options.sh                    | 1 -\n t/t3438-rebase-broken-files.sh                     | 1 -\n t/t3500-cherry.sh                                  | 1 -\n t/t3501-revert-cherry-pick.sh                      | 1 -\n t/t3502-cherry-pick-merge.sh                       | 1 -\n t/t3503-cherry-pick-root.sh                        | 1 -\n t/t3504-cherry-pick-rerere.sh                      | 1 -\n t/t3505-cherry-pick-empty.sh                       | 1 -\n t/t3506-cherry-pick-ff.sh                          | 1 -\n t/t3507-cherry-pick-conflict.sh                    | 1 -\n t/t3508-cherry-pick-many-commits.sh                | 1 -\n t/t3509-cherry-pick-merge-df.sh                    | 1 -\n t/t3510-cherry-pick-sequence.sh                    | 1 -\n t/t3511-cherry-pick-x.sh                           | 1 -\n t/t3512-cherry-pick-submodule.sh                   | 1 -\n t/t3513-revert-submodule.sh                        | 1 -\n t/t3514-cherry-pick-revert-gpg.sh                  | 1 -\n t/t3600-rm.sh                                      | 1 -\n t/t3601-rm-pathspec-file.sh                        | 1 -\n t/t3602-rm-sparse-checkout.sh                      | 1 -\n t/t3650-replay-basics.sh                           | 1 -\n t/t3700-add.sh                                     | 1 -\n t/t3701-add-interactive.sh                         | 1 -\n t/t3702-add-edit.sh                                | 1 -\n t/t3703-add-magic-pathspec.sh                      | 1 -\n t/t3704-add-pathspec-file.sh                       | 1 -\n t/t3705-add-sparse-checkout.sh                     | 1 -\n t/t3800-mktag.sh                                   | 1 -\n t/t3900-i18n-commit.sh                             | 1 -\n t/t3901-i18n-patch.sh                              | 1 -\n t/t3902-quoted.sh                                  | 1 -\n t/t3903-stash.sh                                   | 1 -\n t/t3904-stash-patch.sh                             | 1 -\n t/t3905-stash-include-untracked.sh                 | 1 -\n t/t3906-stash-submodule.sh                         | 1 -\n t/t3907-stash-show-config.sh                       | 1 -\n t/t3908-stash-in-worktree.sh                       | 1 -\n t/t3909-stash-pathspec-file.sh                     | 1 -\n t/t3920-crlf-messages.sh                           | 1 -\n t/t4000-diff-format.sh                             | 1 -\n t/t4001-diff-rename.sh                             | 1 -\n t/t4002-diff-basic.sh                              | 1 -\n t/t4003-diff-rename-1.sh                           | 1 -\n t/t4004-diff-rename-symlink.sh                     | 1 -\n t/t4005-diff-rename-2.sh                           | 1 -\n t/t4006-diff-mode.sh                               | 1 -\n t/t4007-rename-3.sh                                | 1 -\n t/t4008-diff-break-rewrite.sh                      | 1 -\n t/t4009-diff-rename-4.sh                           | 1 -\n t/t4010-diff-pathspec.sh                           | 1 -\n t/t4011-diff-symlink.sh                            | 1 -\n t/t4012-diff-binary.sh                             | 1 -\n t/t4013-diff-various.sh                            | 1 -\n t/t4014-format-patch.sh                            | 1 -\n t/t4015-diff-whitespace.sh                         | 1 -\n t/t4016-diff-quote.sh                              | 1 -\n t/t4017-diff-retval.sh                             | 1 -\n t/t4018-diff-funcname.sh                           | 1 -\n t/t4019-diff-wserror.sh                            | 1 -\n t/t4020-diff-external.sh                           | 1 -\n t/t4021-format-patch-numbered.sh                   | 1 -\n t/t4022-diff-rewrite.sh                            | 1 -\n t/t4023-diff-rename-typechange.sh                  | 1 -\n t/t4024-diff-optimize-common.sh                    | 1 -\n t/t4025-hunk-header.sh                             | 1 -\n t/t4026-color.sh                                   | 1 -\n t/t4027-diff-submodule.sh                          | 1 -\n t/t4028-format-patch-mime-headers.sh               | 1 -\n t/t4029-diff-trailing-space.sh                     | 1 -\n t/t4030-diff-textconv.sh                           | 1 -\n t/t4031-diff-rewrite-binary.sh                     | 1 -\n t/t4032-diff-inter-hunk-context.sh                 | 1 -\n t/t4033-diff-patience.sh                           | 1 -\n t/t4034-diff-words.sh                              | 1 -\n t/t4035-diff-quiet.sh                              | 1 -\n t/t4036-format-patch-signer-mime.sh                | 1 -\n t/t4037-diff-r-t-dirs.sh                           | 1 -\n t/t4038-diff-combined.sh                           | 1 -\n t/t4039-diff-assume-unchanged.sh                   | 1 -\n t/t4040-whitespace-status.sh                       | 1 -\n t/t4041-diff-submodule-option.sh                   | 1 -\n t/t4042-diff-textconv-caching.sh                   | 1 -\n t/t4043-diff-rename-binary.sh                      | 1 -\n t/t4044-diff-index-unique-abbrev.sh                | 1 -\n t/t4045-diff-relative.sh                           | 1 -\n t/t4046-diff-unmerged.sh                           | 1 -\n t/t4047-diff-dirstat.sh                            | 1 -\n t/t4048-diff-combined-binary.sh                    | 1 -\n t/t4049-diff-stat-count.sh                         | 1 -\n t/t4050-diff-histogram.sh                          | 1 -\n t/t4051-diff-function-context.sh                   | 1 -\n t/t4052-stat-output.sh                             | 1 -\n t/t4053-diff-no-index.sh                           | 1 -\n t/t4054-diff-bogus-tree.sh                         | 1 -\n t/t4055-diff-context.sh                            | 1 -\n t/t4056-diff-order.sh                              | 1 -\n t/t4057-diff-combined-paths.sh                     | 1 -\n t/t4058-diff-duplicates.sh                         | 1 -\n t/t4059-diff-submodule-not-initialized.sh          | 1 -\n t/t4060-diff-submodule-option-diff-format.sh       | 1 -\n t/t4061-diff-indent.sh                             | 1 -\n t/t4062-diff-pickaxe.sh                            | 1 -\n t/t4063-diff-blobs.sh                              | 1 -\n t/t4064-diff-oidfind.sh                            | 1 -\n t/t4065-diff-anchored.sh                           | 1 -\n t/t4066-diff-emit-delay.sh                         | 1 -\n t/t4067-diff-partial-clone.sh                      | 1 -\n t/t4068-diff-symmetric-merge-base.sh               | 1 -\n t/t4069-remerge-diff.sh                            | 1 -\n t/t4100-apply-stat.sh                              | 1 -\n t/t4101-apply-nonl.sh                              | 1 -\n t/t4102-apply-rename.sh                            | 1 -\n t/t4103-apply-binary.sh                            | 1 -\n t/t4104-apply-boundary.sh                          | 1 -\n t/t4105-apply-fuzz.sh                              | 1 -\n t/t4106-apply-stdin.sh                             | 1 -\n t/t4107-apply-ignore-whitespace.sh                 | 1 -\n t/t4108-apply-threeway.sh                          | 1 -\n t/t4109-apply-multifrag.sh                         | 1 -\n t/t4110-apply-scan.sh                              | 1 -\n t/t4111-apply-subdir.sh                            | 1 -\n t/t4112-apply-renames.sh                           | 1 -\n t/t4113-apply-ending.sh                            | 1 -\n t/t4114-apply-typechange.sh                        | 1 -\n t/t4115-apply-symlink.sh                           | 1 -\n t/t4116-apply-reverse.sh                           | 1 -\n t/t4117-apply-reject.sh                            | 1 -\n t/t4118-apply-empty-context.sh                     | 1 -\n t/t4119-apply-config.sh                            | 1 -\n t/t4120-apply-popt.sh                              | 1 -\n t/t4121-apply-diffs.sh                             | 1 -\n t/t4122-apply-symlink-inside.sh                    | 1 -\n t/t4123-apply-shrink.sh                            | 1 -\n t/t4124-apply-ws-rule.sh                           | 1 -\n t/t4125-apply-ws-fuzz.sh                           | 1 -\n t/t4126-apply-empty.sh                             | 1 -\n t/t4127-apply-same-fn.sh                           | 1 -\n t/t4128-apply-root.sh                              | 1 -\n t/t4129-apply-samemode.sh                          | 1 -\n t/t4130-apply-criss-cross-rename.sh                | 1 -\n t/t4131-apply-fake-ancestor.sh                     | 1 -\n t/t4132-apply-removal.sh                           | 1 -\n t/t4133-apply-filenames.sh                         | 1 -\n t/t4134-apply-submodule.sh                         | 1 -\n t/t4135-apply-weird-filenames.sh                   | 1 -\n t/t4136-apply-check.sh                             | 1 -\n t/t4137-apply-submodule.sh                         | 1 -\n t/t4138-apply-ws-expansion.sh                      | 1 -\n t/t4139-apply-escape.sh                            | 1 -\n t/t4140-apply-ita.sh                               | 1 -\n t/t4141-apply-too-large.sh                         | 1 -\n t/t4150-am.sh                                      | 1 -\n t/t4151-am-abort.sh                                | 1 -\n t/t4152-am-subjects.sh                             | 1 -\n t/t4153-am-resume-override-opts.sh                 | 1 -\n t/t4200-rerere.sh                                  | 1 -\n t/t4201-shortlog.sh                                | 1 -\n t/t4202-log.sh                                     | 1 -\n t/t4203-mailmap.sh                                 | 1 -\n t/t4204-patch-id.sh                                | 1 -\n t/t4205-log-pretty-formats.sh                      | 1 -\n t/t4206-log-follow-harder-copies.sh                | 1 -\n t/t4207-log-decoration-colors.sh                   | 1 -\n t/t4208-log-magic-pathspec.sh                      | 1 -\n t/t4209-log-pickaxe.sh                             | 1 -\n t/t4210-log-i18n.sh                                | 1 -\n t/t4211-line-log.sh                                | 1 -\n t/t4212-log-corrupt.sh                             | 1 -\n t/t4213-log-tabexpand.sh                           | 1 -\n t/t4214-log-graph-octopus.sh                       | 1 -\n t/t4215-log-skewed-merges.sh                       | 1 -\n t/t4216-log-bloom.sh                               | 1 -\n t/t4217-log-limit.sh                               | 1 -\n t/t4252-am-options.sh                              | 1 -\n t/t4253-am-keep-cr-dos.sh                          | 1 -\n t/t4254-am-corrupt.sh                              | 1 -\n t/t4255-am-submodule.sh                            | 1 -\n t/t4256-am-format-flowed.sh                        | 1 -\n t/t4257-am-interactive.sh                          | 1 -\n t/t4258-am-quoted-cr.sh                            | 1 -\n t/t4300-merge-tree.sh                              | 1 -\n t/t4301-merge-tree-write-tree.sh                   | 1 -\n t/t5000-tar-tree.sh                                | 1 -\n t/t5001-archive-attr.sh                            | 1 -\n t/t5002-archive-attr-pattern.sh                    | 1 -\n t/t5003-archive-zip.sh                             | 1 -\n t/t5004-archive-corner-cases.sh                    | 1 -\n t/t5100-mailinfo.sh                                | 1 -\n t/t5150-request-pull.sh                            | 1 -\n t/t5200-update-server-info.sh                      | 1 -\n t/t5300-pack-object.sh                             | 1 -\n t/t5301-sliding-window.sh                          | 1 -\n t/t5302-pack-index.sh                              | 1 -\n t/t5303-pack-corruption-resilience.sh              | 1 -\n t/t5304-prune.sh                                   | 1 -\n t/t5305-include-tag.sh                             | 1 -\n t/t5306-pack-nobase.sh                             | 1 -\n t/t5307-pack-missing-commit.sh                     | 1 -\n t/t5308-pack-detect-duplicates.sh                  | 1 -\n t/t5309-pack-delta-cycles.sh                       | 1 -\n t/t5310-pack-bitmaps.sh                            | 1 -\n t/t5311-pack-bitmaps-shallow.sh                    | 1 -\n t/t5312-prune-corruption.sh                        | 1 -\n t/t5313-pack-bounds-checks.sh                      | 1 -\n t/t5314-pack-cycle-detection.sh                    | 1 -\n t/t5315-pack-objects-compression.sh                | 1 -\n t/t5316-pack-delta-depth.sh                        | 1 -\n t/t5317-pack-objects-filter-objects.sh             | 1 -\n t/t5318-commit-graph.sh                            | 1 -\n t/t5319-multi-pack-index.sh                        | 1 -\n t/t5320-delta-islands.sh                           | 1 -\n t/t5321-pack-large-objects.sh                      | 1 -\n t/t5322-pack-objects-sparse.sh                     | 1 -\n t/t5323-pack-redundant.sh                          | 1 -\n t/t5324-split-commit-graph.sh                      | 1 -\n t/t5325-reverse-index.sh                           | 1 -\n t/t5326-multi-pack-bitmaps.sh                      | 1 -\n t/t5327-multi-pack-bitmaps-rev.sh                  | 1 -\n t/t5328-commit-graph-64bit-time.sh                 | 1 -\n t/t5329-pack-objects-cruft.sh                      | 1 -\n t/t5330-no-lazy-fetch-with-commit-graph.sh         | 1 -\n t/t5331-pack-objects-stdin.sh                      | 1 -\n t/t5332-multi-pack-reuse.sh                        | 1 -\n t/t5333-pseudo-merge-bitmaps.sh                    | 1 -\n t/t5334-incremental-multi-pack-index.sh            | 1 -\n t/t5351-unpack-large-objects.sh                    | 1 -\n t/t5400-send-pack.sh                               | 1 -\n t/t5401-update-hooks.sh                            | 1 -\n t/t5402-post-merge-hook.sh                         | 1 -\n t/t5403-post-checkout-hook.sh                      | 1 -\n t/t5404-tracking-branches.sh                       | 1 -\n t/t5405-send-pack-rewind.sh                        | 1 -\n t/t5406-remote-rejects.sh                          | 1 -\n t/t5407-post-rewrite-hook.sh                       | 1 -\n t/t5408-send-pack-stdin.sh                         | 1 -\n t/t5409-colorize-remote-messages.sh                | 1 -\n t/t5410-receive-pack-alternates.sh                 | 1 -\n t/t5411-proc-receive-hook.sh                       | 1 -\n t/t5500-fetch-pack.sh                              | 1 -\n t/t5501-fetch-push-alternates.sh                   | 1 -\n t/t5502-quickfetch.sh                              | 1 -\n t/t5503-tagfollow.sh                               | 1 -\n t/t5504-fetch-receive-strict.sh                    | 1 -\n t/t5505-remote.sh                                  | 1 -\n t/t5506-remote-groups.sh                           | 1 -\n t/t5507-remote-environment.sh                      | 1 -\n t/t5509-fetch-push-namespaces.sh                   | 1 -\n t/t5510-fetch.sh                                   | 1 -\n t/t5511-refspec.sh                                 | 1 -\n t/t5512-ls-remote.sh                               | 1 -\n t/t5513-fetch-track.sh                             | 1 -\n t/t5514-fetch-multiple.sh                          | 1 -\n t/t5515-fetch-merge-logic.sh                       | 1 -\n t/t5516-fetch-push.sh                              | 1 -\n t/t5517-push-mirror.sh                             | 1 -\n t/t5518-fetch-exit-status.sh                       | 1 -\n t/t5519-push-alternates.sh                         | 1 -\n t/t5520-pull.sh                                    | 1 -\n t/t5521-pull-options.sh                            | 1 -\n t/t5522-pull-symlink.sh                            | 1 -\n t/t5523-push-upstream.sh                           | 1 -\n t/t5524-pull-msg.sh                                | 1 -\n t/t5525-fetch-tagopt.sh                            | 1 -\n t/t5526-fetch-submodules.sh                        | 1 -\n t/t5527-fetch-odd-refs.sh                          | 1 -\n t/t5528-push-default.sh                            | 1 -\n t/t5529-push-errors.sh                             | 1 -\n t/t5530-upload-pack-error.sh                       | 1 -\n t/t5531-deep-submodule-push.sh                     | 1 -\n t/t5532-fetch-proxy.sh                             | 1 -\n t/t5533-push-cas.sh                                | 1 -\n t/t5534-push-signed.sh                             | 1 -\n t/t5535-fetch-push-symref.sh                       | 1 -\n t/t5536-fetch-conflicts.sh                         | 1 -\n t/t5537-fetch-shallow.sh                           | 1 -\n t/t5538-push-shallow.sh                            | 1 -\n t/t5539-fetch-http-shallow.sh                      | 1 -\n t/t5540-http-push-webdav.sh                        | 1 -\n t/t5541-http-push-smart.sh                         | 1 -\n t/t5542-push-http-shallow.sh                       | 1 -\n t/t5543-atomic-push.sh                             | 1 -\n t/t5544-pack-objects-hook.sh                       | 1 -\n t/t5545-push-options.sh                            | 1 -\n t/t5546-receive-limits.sh                          | 1 -\n t/t5547-push-quarantine.sh                         | 1 -\n t/t5548-push-porcelain.sh                          | 1 -\n t/t5549-fetch-push-http.sh                         | 1 -\n t/t5550-http-fetch-dumb.sh                         | 1 -\n t/t5551-http-fetch-smart.sh                        | 1 -\n t/t5552-skipping-fetch-negotiator.sh               | 1 -\n t/t5553-set-upstream.sh                            | 1 -\n t/t5554-noop-fetch-negotiator.sh                   | 1 -\n t/t5555-http-smart-common.sh                       | 1 -\n t/t5557-http-get.sh                                | 1 -\n t/t5558-clone-bundle-uri.sh                        | 1 -\n t/t5560-http-backend-noserver.sh                   | 1 -\n t/t5561-http-backend.sh                            | 1 -\n t/t5562-http-backend-content-length.sh             | 1 -\n t/t5563-simple-http-auth.sh                        | 1 -\n t/t5564-http-proxy.sh                              | 1 -\n t/t5570-git-daemon.sh                              | 1 -\n t/t5571-pre-push-hook.sh                           | 1 -\n t/t5572-pull-submodule.sh                          | 1 -\n t/t5573-pull-verify-signatures.sh                  | 1 -\n t/t5574-fetch-output.sh                            | 1 -\n t/t5580-unc-paths.sh                               | 1 -\n t/t5581-http-curl-verbose.sh                       | 1 -\n t/t5582-fetch-negative-refspec.sh                  | 1 -\n t/t5583-push-branches.sh                           | 1 -\n t/t5600-clone-fail-cleanup.sh                      | 1 -\n t/t5601-clone.sh                                   | 1 -\n t/t5602-clone-remote-exec.sh                       | 1 -\n t/t5603-clone-dirname.sh                           | 1 -\n t/t5604-clone-reference.sh                         | 1 -\n t/t5605-clone-local.sh                             | 1 -\n t/t5606-clone-options.sh                           | 1 -\n t/t5607-clone-bundle.sh                            | 1 -\n t/t5609-clone-branch.sh                            | 1 -\n t/t5610-clone-detached.sh                          | 1 -\n t/t5611-clone-config.sh                            | 1 -\n t/t5612-clone-refspec.sh                           | 1 -\n t/t5613-info-alternate.sh                          | 1 -\n t/t5614-clone-submodules-shallow.sh                | 1 -\n t/t5615-alternate-env.sh                           | 1 -\n t/t5616-partial-clone.sh                           | 1 -\n t/t5617-clone-submodules-remote.sh                 | 1 -\n t/t5618-alternate-refs.sh                          | 1 -\n t/t5619-clone-local-ambiguous-transport.sh         | 1 -\n t/t5700-protocol-v1.sh                             | 1 -\n t/t5701-git-serve.sh                               | 1 -\n t/t5702-protocol-v2.sh                             | 1 -\n t/t5703-upload-pack-ref-in-want.sh                 | 1 -\n t/t5704-protocol-violations.sh                     | 1 -\n t/t5705-session-id-in-capabilities.sh              | 1 -\n t/t5730-protocol-v2-bundle-uri-file.sh             | 1 -\n t/t5731-protocol-v2-bundle-uri-git.sh              | 1 -\n t/t5732-protocol-v2-bundle-uri-http.sh             | 1 -\n t/t5750-bundle-uri-parse.sh                        | 1 -\n t/t5801-remote-helpers.sh                          | 1 -\n t/t5802-connect-helper.sh                          | 1 -\n t/t5810-proto-disable-local.sh                     | 1 -\n t/t5811-proto-disable-git.sh                       | 1 -\n t/t5812-proto-disable-http.sh                      | 1 -\n t/t5813-proto-disable-ssh.sh                       | 1 -\n t/t5814-proto-disable-ext.sh                       | 1 -\n t/t5815-submodule-protos.sh                        | 1 -\n t/t5900-repo-selection.sh                          | 1 -\n t/t6000-rev-list-misc.sh                           | 1 -\n t/t6001-rev-list-graft.sh                          | 1 -\n t/t6002-rev-list-bisect.sh                         | 1 -\n t/t6003-rev-list-topo-order.sh                     | 1 -\n t/t6004-rev-list-path-optim.sh                     | 1 -\n t/t6005-rev-list-count.sh                          | 1 -\n t/t6006-rev-list-format.sh                         | 1 -\n t/t6007-rev-list-cherry-pick-file.sh               | 1 -\n t/t6008-rev-list-submodule.sh                      | 1 -\n t/t6009-rev-list-parent.sh                         | 1 -\n t/t6010-merge-base.sh                              | 1 -\n t/t6011-rev-list-with-bad-commit.sh                | 1 -\n t/t6012-rev-list-simplify.sh                       | 1 -\n t/t6013-rev-list-reverse-parents.sh                | 1 -\n t/t6014-rev-list-all.sh                            | 1 -\n t/t6016-rev-list-graph-simplify-history.sh         | 1 -\n t/t6017-rev-list-stdin.sh                          | 1 -\n t/t6018-rev-list-glob.sh                           | 1 -\n t/t6019-rev-list-ancestry-path.sh                  | 1 -\n t/t6020-bundle-misc.sh                             | 1 -\n t/t6021-rev-list-exclude-hidden.sh                 | 1 -\n t/t6022-rev-list-missing.sh                        | 1 -\n t/t6030-bisect-porcelain.sh                        | 1 -\n t/t6040-tracking-info.sh                           | 1 -\n t/t6041-bisect-submodule.sh                        | 1 -\n t/t6050-replace.sh                                 | 1 -\n t/t6060-merge-index.sh                             | 1 -\n t/t6100-rev-list-in-order.sh                       | 1 -\n t/t6101-rev-parse-parents.sh                       | 1 -\n t/t6102-rev-list-unexpected-objects.sh             | 1 -\n t/t6110-rev-list-sparse.sh                         | 1 -\n t/t6111-rev-list-treesame.sh                       | 1 -\n t/t6112-rev-list-filters-objects.sh                | 1 -\n t/t6113-rev-list-bitmap-filters.sh                 | 1 -\n t/t6114-keep-packs.sh                              | 1 -\n t/t6115-rev-list-du.sh                             | 1 -\n t/t6120-describe.sh                                | 1 -\n t/t6130-pathspec-noglob.sh                         | 1 -\n t/t6131-pathspec-icase.sh                          | 1 -\n t/t6132-pathspec-exclude.sh                        | 1 -\n t/t6133-pathspec-rev-dwim.sh                       | 1 -\n t/t6134-pathspec-in-submodule.sh                   | 1 -\n t/t6135-pathspec-with-attrs.sh                     | 1 -\n t/t6136-pathspec-in-bare.sh                        | 1 -\n t/t6200-fmt-merge-msg.sh                           | 1 -\n t/t6300-for-each-ref.sh                            | 1 -\n t/t6301-for-each-ref-errors.sh                     | 1 -\n t/t6302-for-each-ref-filter.sh                     | 1 -\n t/t6400-merge-df.sh                                | 1 -\n t/t6401-merge-criss-cross.sh                       | 1 -\n t/t6402-merge-rename.sh                            | 1 -\n t/t6403-merge-file.sh                              | 1 -\n t/t6404-recursive-merge.sh                         | 1 -\n t/t6405-merge-symlinks.sh                          | 1 -\n t/t6406-merge-attr.sh                              | 1 -\n t/t6407-merge-binary.sh                            | 1 -\n t/t6408-merge-up-to-date.sh                        | 1 -\n t/t6409-merge-subtree.sh                           | 1 -\n t/t6411-merge-filemode.sh                          | 1 -\n t/t6412-merge-large-rename.sh                      | 1 -\n t/t6413-merge-crlf.sh                              | 1 -\n t/t6414-merge-rename-nocruft.sh                    | 1 -\n t/t6415-merge-dir-to-symlink.sh                    | 1 -\n t/t6416-recursive-corner-cases.sh                  | 1 -\n t/t6417-merge-ours-theirs.sh                       | 1 -\n t/t6418-merge-text-auto.sh                         | 1 -\n t/t6421-merge-partial-clone.sh                     | 1 -\n t/t6422-merge-rename-corner-cases.sh               | 1 -\n t/t6423-merge-rename-directories.sh                | 1 -\n t/t6424-merge-unrelated-index-changes.sh           | 1 -\n t/t6425-merge-rename-delete.sh                     | 1 -\n t/t6426-merge-skip-unneeded-updates.sh             | 1 -\n t/t6427-diff3-conflict-markers.sh                  | 1 -\n t/t6428-merge-conflicts-sparse.sh                  | 1 -\n t/t6429-merge-sequence-rename-caching.sh           | 1 -\n t/t6430-merge-recursive.sh                         | 1 -\n t/t6431-merge-criscross.sh                         | 1 -\n t/t6432-merge-recursive-space-options.sh           | 1 -\n t/t6433-merge-toplevel.sh                          | 1 -\n t/t6434-merge-recursive-rename-options.sh          | 1 -\n t/t6435-merge-sparse.sh                            | 1 -\n t/t6436-merge-overwrite.sh                         | 1 -\n t/t6437-submodule-merge.sh                         | 1 -\n t/t6438-submodule-directory-file-conflicts.sh      | 1 -\n t/t6439-merge-co-error-msgs.sh                     | 1 -\n t/t6500-gc.sh                                      | 1 -\n t/t6501-freshen-objects.sh                         | 1 -\n t/t6600-test-reach.sh                              | 1 -\n t/t6700-tree-depth.sh                              | 1 -\n t/t7001-mv.sh                                      | 1 -\n t/t7002-mv-sparse-checkout.sh                      | 1 -\n t/t7003-filter-branch.sh                           | 1 -\n t/t7004-tag.sh                                     | 1 -\n t/t7005-editor.sh                                  | 1 -\n t/t7006-pager.sh                                   | 1 -\n t/t7007-show.sh                                    | 1 -\n t/t7008-filter-branch-null-sha1.sh                 | 1 -\n t/t7010-setup.sh                                   | 1 -\n t/t7011-skip-worktree-reading.sh                   | 1 -\n t/t7012-skip-worktree-writing.sh                   | 1 -\n t/t7030-verify-tag.sh                              | 1 -\n t/t7031-verify-tag-signed-ssh.sh                   | 1 -\n t/t7060-wtstatus.sh                                | 1 -\n t/t7061-wtstatus-ignore.sh                         | 1 -\n t/t7062-wtstatus-ignorecase.sh                     | 1 -\n t/t7063-status-untracked-cache.sh                  | 1 -\n t/t7064-wtstatus-pv2.sh                            | 1 -\n t/t7101-reset-empty-subdirs.sh                     | 1 -\n t/t7102-reset.sh                                   | 1 -\n t/t7103-reset-bare.sh                              | 1 -\n t/t7104-reset-hard.sh                              | 1 -\n t/t7105-reset-patch.sh                             | 1 -\n t/t7106-reset-unborn-branch.sh                     | 1 -\n t/t7107-reset-pathspec-file.sh                     | 1 -\n t/t7110-reset-merge.sh                             | 1 -\n t/t7111-reset-table.sh                             | 1 -\n t/t7112-reset-submodule.sh                         | 1 -\n t/t7113-post-index-change-hook.sh                  | 1 -\n t/t7201-co.sh                                      | 1 -\n t/t7300-clean.sh                                   | 1 -\n t/t7301-clean-interactive.sh                       | 1 -\n t/t7400-submodule-basic.sh                         | 1 -\n t/t7401-submodule-summary.sh                       | 1 -\n t/t7402-submodule-rebase.sh                        | 1 -\n t/t7403-submodule-sync.sh                          | 1 -\n t/t7406-submodule-update.sh                        | 1 -\n t/t7407-submodule-foreach.sh                       | 1 -\n t/t7408-submodule-reference.sh                     | 1 -\n t/t7409-submodule-detached-work-tree.sh            | 1 -\n t/t7411-submodule-config.sh                        | 1 -\n t/t7412-submodule-absorbgitdirs.sh                 | 1 -\n t/t7413-submodule-is-active.sh                     | 1 -\n t/t7414-submodule-mistakes.sh                      | 1 -\n t/t7416-submodule-dash-url.sh                      | 1 -\n t/t7417-submodule-path-url.sh                      | 1 -\n t/t7418-submodule-sparse-gitmodules.sh             | 1 -\n t/t7419-submodule-set-branch.sh                    | 1 -\n t/t7420-submodule-set-url.sh                       | 1 -\n t/t7421-submodule-summary-add.sh                   | 1 -\n t/t7422-submodule-output.sh                        | 1 -\n t/t7423-submodule-symlinks.sh                      | 1 -\n t/t7424-submodule-mixed-ref-formats.sh             | 1 -\n t/t7450-bad-git-dotfiles.sh                        | 1 -\n t/t7500-commit-template-squash-signoff.sh          | 1 -\n t/t7501-commit-basic-functionality.sh              | 1 -\n t/t7502-commit-porcelain.sh                        | 1 -\n t/t7503-pre-commit-and-pre-merge-commit-hooks.sh   | 1 -\n t/t7504-commit-msg-hook.sh                         | 1 -\n t/t7505-prepare-commit-msg-hook.sh                 | 1 -\n t/t7506-status-submodule.sh                        | 1 -\n t/t7507-commit-verbose.sh                          | 1 -\n t/t7508-status.sh                                  | 1 -\n t/t7509-commit-authorship.sh                       | 1 -\n t/t7510-signed-commit.sh                           | 1 -\n t/t7511-status-index.sh                            | 1 -\n t/t7512-status-help.sh                             | 1 -\n t/t7513-interpret-trailers.sh                      | 1 -\n t/t7514-commit-patch.sh                            | 1 -\n t/t7515-status-symlinks.sh                         | 1 -\n t/t7516-commit-races.sh                            | 1 -\n t/t7517-per-repo-email.sh                          | 1 -\n t/t7518-ident-corner-cases.sh                      | 1 -\n t/t7519-status-fsmonitor.sh                        | 1 -\n t/t7520-ignored-hook-warning.sh                    | 1 -\n t/t7521-ignored-mode.sh                            | 1 -\n t/t7524-commit-summary.sh                          | 1 -\n t/t7525-status-rename.sh                           | 1 -\n t/t7526-commit-pathspec-file.sh                    | 1 -\n t/t7528-signed-commit-ssh.sh                       | 1 -\n t/t7600-merge.sh                                   | 1 -\n t/t7601-merge-pull-config.sh                       | 1 -\n t/t7602-merge-octopus-many.sh                      | 1 -\n t/t7603-merge-reduce-heads.sh                      | 1 -\n t/t7604-merge-custom-message.sh                    | 1 -\n t/t7605-merge-resolve.sh                           | 1 -\n t/t7606-merge-custom.sh                            | 1 -\n t/t7607-merge-state.sh                             | 1 -\n t/t7608-merge-messages.sh                          | 1 -\n t/t7609-mergetool--lib.sh                          | 1 -\n t/t7610-mergetool.sh                               | 1 -\n t/t7611-merge-abort.sh                             | 1 -\n t/t7612-merge-verify-signatures.sh                 | 1 -\n t/t7614-merge-signoff.sh                           | 1 -\n t/t7615-diff-algo-with-mergy-operations.sh         | 1 -\n t/t7700-repack.sh                                  | 1 -\n t/t7701-repack-unpack-unreachable.sh               | 1 -\n t/t7702-repack-cyclic-alternate.sh                 | 1 -\n t/t7703-repack-geometric.sh                        | 1 -\n t/t7704-repack-cruft.sh                            | 1 -\n t/t7800-difftool.sh                                | 1 -\n t/t7810-grep.sh                                    | 1 -\n t/t7811-grep-open.sh                               | 1 -\n t/t7812-grep-icase-non-ascii.sh                    | 1 -\n t/t7813-grep-icase-iso.sh                          | 1 -\n t/t7814-grep-recurse-submodules.sh                 | 1 -\n t/t7815-grep-binary.sh                             | 1 -\n t/t7816-grep-binary-pattern.sh                     | 1 -\n t/t7817-grep-sparse-checkout.sh                    | 1 -\n t/t7900-maintenance.sh                             | 1 -\n t/t8001-annotate.sh                                | 1 -\n t/t8002-blame.sh                                   | 1 -\n t/t8003-blame-corner-cases.sh                      | 1 -\n t/t8004-blame-with-conflicts.sh                    | 1 -\n t/t8005-blame-i18n.sh                              | 1 -\n t/t8006-blame-textconv.sh                          | 1 -\n t/t8007-cat-file-textconv.sh                       | 1 -\n t/t8008-blame-formats.sh                           | 1 -\n t/t8009-blame-vs-topicbranches.sh                  | 1 -\n t/t8010-cat-file-filters.sh                        | 1 -\n t/t8011-blame-split-file.sh                        | 1 -\n t/t8012-blame-colors.sh                            | 1 -\n t/t8013-blame-ignore-revs.sh                       | 1 -\n t/t8014-blame-ignore-fuzzy.sh                      | 1 -\n t/t9001-send-email.sh                              | 1 -\n t/t9002-column.sh                                  | 1 -\n t/t9003-help-autocorrect.sh                        | 1 -\n t/t9200-git-cvsexportcommit.sh                     | 1 -\n t/t9210-scalar.sh                                  | 1 -\n t/t9211-scalar-clone.sh                            | 1 -\n t/t9300-fast-import.sh                             | 1 -\n t/t9301-fast-import-notes.sh                       | 1 -\n t/t9302-fast-import-unpack-limit.sh                | 1 -\n t/t9303-fast-import-compression.sh                 | 1 -\n t/t9304-fast-import-marks.sh                       | 1 -\n t/t9350-fast-export.sh                             | 1 -\n t/t9351-fast-export-anonymize.sh                   | 1 -\n t/t9400-git-cvsserver-server.sh                    | 1 -\n t/t9401-git-cvsserver-crlf.sh                      | 1 -\n t/t9402-git-cvsserver-refs.sh                      | 1 -\n t/t9500-gitweb-standalone-no-errors.sh             | 1 -\n t/t9501-gitweb-standalone-http-status.sh           | 1 -\n t/t9502-gitweb-standalone-parse-output.sh          | 1 -\n t/t9600-cvsimport.sh                               | 1 -\n t/t9601-cvsimport-vendor-branch.sh                 | 1 -\n t/t9602-cvsimport-branches-tags.sh                 | 1 -\n t/t9603-cvsimport-patchsets.sh                     | 1 -\n t/t9604-cvsimport-timestamps.sh                    | 1 -\n t/t9700-perl-git.sh                                | 1 -\n t/t9800-git-p4-basic.sh                            | 1 -\n t/t9801-git-p4-branch.sh                           | 1 -\n t/t9802-git-p4-filetype.sh                         | 1 -\n t/t9803-git-p4-shell-metachars.sh                  | 1 -\n t/t9804-git-p4-label.sh                            | 1 -\n t/t9805-git-p4-skip-submit-edit.sh                 | 1 -\n t/t9806-git-p4-options.sh                          | 1 -\n t/t9808-git-p4-chdir.sh                            | 1 -\n t/t9809-git-p4-client-view.sh                      | 1 -\n t/t9810-git-p4-rcs.sh                              | 1 -\n t/t9811-git-p4-label-import.sh                     | 1 -\n t/t9812-git-p4-wildcards.sh                        | 1 -\n t/t9813-git-p4-preserve-users.sh                   | 1 -\n t/t9814-git-p4-rename.sh                           | 1 -\n t/t9815-git-p4-submit-fail.sh                      | 1 -\n t/t9816-git-p4-locked.sh                           | 1 -\n t/t9817-git-p4-exclude.sh                          | 1 -\n t/t9818-git-p4-block.sh                            | 1 -\n t/t9819-git-p4-case-folding.sh                     | 1 -\n t/t9820-git-p4-editor-handling.sh                  | 1 -\n t/t9821-git-p4-path-variations.sh                  | 1 -\n t/t9822-git-p4-path-encoding.sh                    | 1 -\n t/t9823-git-p4-mock-lfs.sh                         | 1 -\n t/t9825-git-p4-handle-utf16-without-bom.sh         | 1 -\n t/t9826-git-p4-keep-empty-commits.sh               | 1 -\n t/t9827-git-p4-change-filetype.sh                  | 1 -\n t/t9828-git-p4-map-user.sh                         | 1 -\n t/t9829-git-p4-jobs.sh                             | 1 -\n t/t9830-git-p4-symlink-dir.sh                      | 1 -\n t/t9831-git-p4-triggers.sh                         | 1 -\n t/t9832-unshelve.sh                                | 1 -\n t/t9833-errors.sh                                  | 1 -\n t/t9834-git-p4-file-dir-bug.sh                     | 1 -\n t/t9835-git-p4-metadata-encoding-python2.sh        | 1 -\n t/t9836-git-p4-metadata-encoding-python3.sh        | 1 -\n t/t9850-shell.sh                                   | 1 -\n t/t9901-git-web--browse.sh                         | 1 -\n t/t9902-completion.sh                              | 1 -\n t/t9903-bash-prompt.sh                             | 1 -\n 928 files changed, 928 deletions(-)\n\ndiff --git a/t/t0001-init.sh b/t/t0001-init.sh\nindex 0178aa62a41..4890dff4b27 100755\n--- a/t/t0001-init.sh\n+++ b/t/t0001-init.sh\n@@ -2,7 +2,6 @@\n \n test_description='git init'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n check_config () {\ndiff --git a/t/t0002-gitfile.sh b/t/t0002-gitfile.sh\nindex bf3bf604abe..dfbcdddbcc1 100755\n--- a/t/t0002-gitfile.sh\n+++ b/t/t0002-gitfile.sh\n@@ -7,7 +7,6 @@ Verify that plumbing commands work when .git is a file\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n objpath() {\ndiff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh\nindex 66ccb5889d1..3c98b622f25 100755\n--- a/t/t0003-attributes.sh\n+++ b/t/t0003-attributes.sh\n@@ -2,7 +2,6 @@\n \n test_description=gitattributes\n \n-TEST_PASSES_SANITIZE_LEAK=true\n TEST_CREATE_REPO_NO_TEMPLATE=1\n . ./test-lib.sh\n \ndiff --git a/t/t0004-unwritable.sh b/t/t0004-unwritable.sh\nindex 8114fac73b3..3bdafbae0f0 100755\n--- a/t/t0004-unwritable.sh\n+++ b/t/t0004-unwritable.sh\n@@ -2,7 +2,6 @@\n \n test_description='detect unwritable repository and fail correctly'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t0005-signals.sh b/t/t0005-signals.sh\nindex eba75a2490c..afba0fc3fc6 100755\n--- a/t/t0005-signals.sh\n+++ b/t/t0005-signals.sh\n@@ -2,7 +2,6 @@\n \n test_description='signals work as we expect'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n cat >expect <<EOF\ndiff --git a/t/t0006-date.sh b/t/t0006-date.sh\nindex fd373e1b391..53ced36df44 100755\n--- a/t/t0006-date.sh\n+++ b/t/t0006-date.sh\n@@ -2,7 +2,6 @@\n \n test_description='test date parsing and printing'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # arbitrary reference time: 2009-08-30 19:20:00\ndiff --git a/t/t0007-git-var.sh b/t/t0007-git-var.sh\nindex 9fc58823873..2b60317758c 100755\n--- a/t/t0007-git-var.sh\n+++ b/t/t0007-git-var.sh\n@@ -2,7 +2,6 @@\n \n test_description='basic sanity checks for git var'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n sane_unset_all_editors () {\ndiff --git a/t/t0008-ignores.sh b/t/t0008-ignores.sh\nindex 02a18d4fdbd..c9376dffb58 100755\n--- a/t/t0008-ignores.sh\n+++ b/t/t0008-ignores.sh\n@@ -2,7 +2,6 @@\n \n test_description=check-ignore\n \n-TEST_PASSES_SANITIZE_LEAK=true\n TEST_CREATE_REPO_NO_TEMPLATE=1\n . ./test-lib.sh\n \ndiff --git a/t/t0010-racy-git.sh b/t/t0010-racy-git.sh\nindex 84172a37390..45229f57b82 100755\n--- a/t/t0010-racy-git.sh\n+++ b/t/t0010-racy-git.sh\n@@ -2,7 +2,6 @@\n \n test_description='racy GIT'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # This test can give false success if your machine is sufficiently\ndiff --git a/t/t0012-help.sh b/t/t0012-help.sh\nindex 9eae0d83563..1d273d91c21 100755\n--- a/t/t0012-help.sh\n+++ b/t/t0012-help.sh\n@@ -2,7 +2,6 @@\n \n test_description='help'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n configure_help () {\ndiff --git a/t/t0013-sha1dc.sh b/t/t0013-sha1dc.sh\nindex 08814173cb1..ce3d81227a0 100755\n--- a/t/t0013-sha1dc.sh\n+++ b/t/t0013-sha1dc.sh\n@@ -2,7 +2,6 @@\n \n test_description='test sha1 collision detection'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n TEST_DATA=\"$TEST_DIRECTORY/t0013\"\n \ndiff --git a/t/t0014-alias.sh b/t/t0014-alias.sh\nindex 2a6f39ad9c8..854d59ec58c 100755\n--- a/t/t0014-alias.sh\n+++ b/t/t0014-alias.sh\n@@ -2,7 +2,6 @@\n \n test_description='git command aliasing'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'nested aliases - internal execution' '\ndiff --git a/t/t0017-env-helper.sh b/t/t0017-env-helper.sh\nindex f3a16859cc2..32fe8481792 100755\n--- a/t/t0017-env-helper.sh\n+++ b/t/t0017-env-helper.sh\n@@ -2,7 +2,6 @@\n \n test_description='test test-tool env-helper'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n \ndiff --git a/t/t0018-advice.sh b/t/t0018-advice.sh\nindex fac52322a7f..9a3db02fded 100755\n--- a/t/t0018-advice.sh\n+++ b/t/t0018-advice.sh\n@@ -5,7 +5,6 @@ test_description='Test advise_if_enabled functionality'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=trunk\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'advice should be printed when config variable is unset' '\ndiff --git a/t/t0019-json-writer.sh b/t/t0019-json-writer.sh\nindex 19a730c29ed..3a4e1cc7e38 100755\n--- a/t/t0019-json-writer.sh\n+++ b/t/t0019-json-writer.sh\n@@ -2,7 +2,6 @@\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' '\ndiff --git a/t/t0020-crlf.sh b/t/t0020-crlf.sh\nindex 81946e87ccb..fd1cae09edc 100755\n--- a/t/t0020-crlf.sh\n+++ b/t/t0020-crlf.sh\n@@ -5,7 +5,6 @@ test_description='CRLF conversion'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n has_cr() {\ndiff --git a/t/t0021-conversion.sh b/t/t0021-conversion.sh\nindex 9e6c6ee0d44..3f6433d3045 100755\n--- a/t/t0021-conversion.sh\n+++ b/t/t0021-conversion.sh\n@@ -5,7 +5,6 @@ test_description='blob conversion via gitattributes'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-terminal.sh\n \ndiff --git a/t/t0022-crlf-rename.sh b/t/t0022-crlf-rename.sh\nindex 9fe98912511..9bd863a970d 100755\n--- a/t/t0022-crlf-rename.sh\n+++ b/t/t0022-crlf-rename.sh\n@@ -2,7 +2,6 @@\n \n test_description='ignore CR in CRLF sequence while computing similiarity'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t0023-crlf-am.sh b/t/t0023-crlf-am.sh\nindex 575805513a3..f9bbb91f64e 100755\n--- a/t/t0023-crlf-am.sh\n+++ b/t/t0023-crlf-am.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test am with auto.crlf'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n cat >patchfile <<\\EOF\ndiff --git a/t/t0024-crlf-archive.sh b/t/t0024-crlf-archive.sh\nindex a7f4de4a43f..44958cb2c2d 100755\n--- a/t/t0024-crlf-archive.sh\n+++ b/t/t0024-crlf-archive.sh\n@@ -2,7 +2,6 @@\n \n test_description='respect crlf in git archive'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t0025-crlf-renormalize.sh b/t/t0025-crlf-renormalize.sh\nindex f7202c192e7..2e28feb69c9 100755\n--- a/t/t0025-crlf-renormalize.sh\n+++ b/t/t0025-crlf-renormalize.sh\n@@ -2,7 +2,6 @@\n \n test_description='CRLF renormalization'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t0026-eol-config.sh b/t/t0026-eol-config.sh\nindex f426a185bb9..493b01a0e7c 100755\n--- a/t/t0026-eol-config.sh\n+++ b/t/t0026-eol-config.sh\n@@ -2,7 +2,6 @@\n \n test_description='CRLF conversion'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n has_cr() {\ndiff --git a/t/t0027-auto-crlf.sh b/t/t0027-auto-crlf.sh\nindex 2f57c8669cb..49dbf09da77 100755\n--- a/t/t0027-auto-crlf.sh\n+++ b/t/t0027-auto-crlf.sh\n@@ -2,7 +2,6 @@\n \n test_description='CRLF conversion all combinations'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n compare_files () {\ndiff --git a/t/t0028-working-tree-encoding.sh b/t/t0028-working-tree-encoding.sh\nindex 510da4ca12d..50b3b4649b6 100755\n--- a/t/t0028-working-tree-encoding.sh\n+++ b/t/t0028-working-tree-encoding.sh\n@@ -5,7 +5,6 @@ test_description='working-tree-encoding conversion via gitattributes'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n TEST_CREATE_REPO_NO_TEMPLATE=1\n . ./test-lib.sh\n . \"$TEST_DIRECTORY/lib-encoding.sh\"\ndiff --git a/t/t0029-core-unsetenvvars.sh b/t/t0029-core-unsetenvvars.sh\nindex 4e8e90dd982..baa1b7e85b1 100755\n--- a/t/t0029-core-unsetenvvars.sh\n+++ b/t/t0029-core-unsetenvvars.sh\n@@ -2,7 +2,6 @@\n \n test_description='test the Windows-only core.unsetenvvars setting'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n if ! test_have_prereq MINGW\ndiff --git a/t/t0030-stripspace.sh b/t/t0030-stripspace.sh\nindex f10f42ff1e4..43155f6bd86 100755\n--- a/t/t0030-stripspace.sh\n+++ b/t/t0030-stripspace.sh\n@@ -5,7 +5,6 @@\n \n test_description='git stripspace'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n t40='A quick brown fox jumps over the lazy do'\ndiff --git a/t/t0033-safe-directory.sh b/t/t0033-safe-directory.sh\nindex e97a84764f7..e103fe71092 100755\n--- a/t/t0033-safe-directory.sh\n+++ b/t/t0033-safe-directory.sh\n@@ -2,7 +2,6 @@\n \n test_description='verify safe.directory checks'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n GIT_TEST_ASSUME_DIFFERENT_OWNER=1\ndiff --git a/t/t0035-safe-bare-repository.sh b/t/t0035-safe-bare-repository.sh\nindex d3cb2a1cb9e..ae7ef092abf 100755\n--- a/t/t0035-safe-bare-repository.sh\n+++ b/t/t0035-safe-bare-repository.sh\n@@ -2,7 +2,6 @@\n \n test_description='verify safe.bareRepository checks'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n pwd=\"$(pwd)\"\ndiff --git a/t/t0040-parse-options.sh b/t/t0040-parse-options.sh\nindex 45a773642fd..2fe3522305f 100755\n--- a/t/t0040-parse-options.sh\n+++ b/t/t0040-parse-options.sh\n@@ -5,7 +5,6 @@\n \n test_description='our own option parser'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n cat >expect <<\\EOF\ndiff --git a/t/t0041-usage.sh b/t/t0041-usage.sh\nindex 1464294bd1b..a0f6f134c71 100755\n--- a/t/t0041-usage.sh\n+++ b/t/t0041-usage.sh\n@@ -5,7 +5,6 @@ test_description='Test commands behavior when given invalid argument value'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup ' '\ndiff --git a/t/t0050-filesystem.sh b/t/t0050-filesystem.sh\nindex 325eb1c3cd0..5c9dc90d0b0 100755\n--- a/t/t0050-filesystem.sh\n+++ b/t/t0050-filesystem.sh\n@@ -5,7 +5,6 @@ test_description='Various filesystem issues'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n auml=$(printf '\\303\\244')\ndiff --git a/t/t0052-simple-ipc.sh b/t/t0052-simple-ipc.sh\nindex 1a36a535743..ff98be31a51 100755\n--- a/t/t0052-simple-ipc.sh\n+++ b/t/t0052-simple-ipc.sh\n@@ -2,7 +2,6 @@\n \n test_description='simple command server'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test-tool simple-ipc SUPPORTS_SIMPLE_IPC || {\ndiff --git a/t/t0055-beyond-symlinks.sh b/t/t0055-beyond-symlinks.sh\nindex c3eb1158ef9..d0740038b87 100755\n--- a/t/t0055-beyond-symlinks.sh\n+++ b/t/t0055-beyond-symlinks.sh\n@@ -2,7 +2,6 @@\n \n test_description='update-index and add refuse to add beyond symlinks'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success SYMLINKS setup '\ndiff --git a/t/t0056-git-C.sh b/t/t0056-git-C.sh\nindex 752aa8c9454..2630e756dab 100755\n--- a/t/t0056-git-C.sh\n+++ b/t/t0056-git-C.sh\n@@ -2,7 +2,6 @@\n \n test_description='\"-C <path>\" option and its effects on other path-related options'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success '\"git -C <path>\" runs git from the directory <path>' '\ndiff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh\nindex 0afa3d0d312..dbb2e73bcd9 100755\n--- a/t/t0060-path-utils.sh\n+++ b/t/t0060-path-utils.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test various path utilities'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n norm_path() {\ndiff --git a/t/t0061-run-command.sh b/t/t0061-run-command.sh\nindex 20986b693cf..76d4936a879 100755\n--- a/t/t0061-run-command.sh\n+++ b/t/t0061-run-command.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test run command'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n cat >hello-script <<-EOF\ndiff --git a/t/t0062-revision-walking.sh b/t/t0062-revision-walking.sh\nindex b9480c81781..8e215867b8c 100755\n--- a/t/t0062-revision-walking.sh\n+++ b/t/t0062-revision-walking.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test revision walking api'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n cat >run_twice_expected <<-EOF\ndiff --git a/t/t0063-string-list.sh b/t/t0063-string-list.sh\nindex 1fee6d90102..aac63ba5064 100755\n--- a/t/t0063-string-list.sh\n+++ b/t/t0063-string-list.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test string list functionality'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_split () {\ndiff --git a/t/t0066-dir-iterator.sh b/t/t0066-dir-iterator.sh\nindex 7d0a0da8c01..df3e9f5fa5d 100755\n--- a/t/t0066-dir-iterator.sh\n+++ b/t/t0066-dir-iterator.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test the dir-iterator functionality'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t0067-parse_pathspec_file.sh b/t/t0067-parse_pathspec_file.sh\nindex 0188d0423a0..7bab49f361a 100755\n--- a/t/t0067-parse_pathspec_file.sh\n+++ b/t/t0067-parse_pathspec_file.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test parse_pathspec_file()'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'one item from stdin' '\ndiff --git a/t/t0068-for-each-repo.sh b/t/t0068-for-each-repo.sh\nindex 95019e01ed3..f2f3e500312 100755\n--- a/t/t0068-for-each-repo.sh\n+++ b/t/t0068-for-each-repo.sh\n@@ -2,7 +2,6 @@\n \n test_description='git for-each-repo builtin'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'run based on configured value' '\ndiff --git a/t/t0070-fundamental.sh b/t/t0070-fundamental.sh\nindex 0ecec2ba711..6b9dcf984bc 100755\n--- a/t/t0070-fundamental.sh\n+++ b/t/t0070-fundamental.sh\n@@ -6,7 +6,6 @@ test_description='check that the most basic functions work\n Verify wrappers and compatibility functions.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'mktemp to nonexistent directory prints filename' '\ndiff --git a/t/t0071-sort.sh b/t/t0071-sort.sh\nindex ba8ad1d1ca0..2236a7e9563 100755\n--- a/t/t0071-sort.sh\n+++ b/t/t0071-sort.sh\n@@ -2,7 +2,6 @@\n \n test_description='verify sort functions'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'DEFINE_LIST_SORT_DEBUG' '\ndiff --git a/t/t0080-unit-test-output.sh b/t/t0080-unit-test-output.sh\nindex 3c369c88e2a..3db10f095c2 100755\n--- a/t/t0080-unit-test-output.sh\n+++ b/t/t0080-unit-test-output.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test the output of the unit test framework'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'TAP output from unit tests' - <<\\EOT\ndiff --git a/t/t0081-find-pack.sh b/t/t0081-find-pack.sh\nindex 67b11216a3e..5a628bf7356 100755\n--- a/t/t0081-find-pack.sh\n+++ b/t/t0081-find-pack.sh\n@@ -2,7 +2,6 @@\n \n test_description='test `test-tool find-pack`'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t0090-cache-tree.sh b/t/t0090-cache-tree.sh\nindex d8e2fc42e15..ab80c9ef135 100755\n--- a/t/t0090-cache-tree.sh\n+++ b/t/t0090-cache-tree.sh\n@@ -6,7 +6,6 @@ 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 () {\ndiff --git a/t/t0091-bugreport.sh b/t/t0091-bugreport.sh\nindex fca39048fe8..e11d819b62a 100755\n--- a/t/t0091-bugreport.sh\n+++ b/t/t0091-bugreport.sh\n@@ -2,7 +2,6 @@\n \n test_description='git bugreport'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'create a report' '\ndiff --git a/t/t0092-diagnose.sh b/t/t0092-diagnose.sh\nindex 133e5747d61..6cabd6e67b9 100755\n--- a/t/t0092-diagnose.sh\n+++ b/t/t0092-diagnose.sh\n@@ -2,7 +2,6 @@\n \n test_description='git diagnose'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success UNZIP 'creates diagnostics zip archive' '\ndiff --git a/t/t0095-bloom.sh b/t/t0095-bloom.sh\nindex 08df74cacfc..8f0c3b7325b 100755\n--- a/t/t0095-bloom.sh\n+++ b/t/t0095-bloom.sh\n@@ -2,7 +2,6 @@\n \n test_description='Testing the various Bloom filter computations in bloom.c'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'compute unseeded murmur3 hash for empty string' '\ndiff --git a/t/t0100-previous.sh b/t/t0100-previous.sh\nindex 70a3223f219..dd5d9b4e5eb 100755\n--- a/t/t0100-previous.sh\n+++ b/t/t0100-previous.sh\n@@ -5,7 +5,6 @@ test_description='previous branch syntax @{-n}'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'branch -d @{-1}' '\ndiff --git a/t/t0101-at-syntax.sh b/t/t0101-at-syntax.sh\nindex 878aadd64c9..023b4c6f0b3 100755\n--- a/t/t0101-at-syntax.sh\n+++ b/t/t0101-at-syntax.sh\n@@ -2,7 +2,6 @@\n \n test_description='various @{whatever} syntax tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t0200-gettext-basic.sh b/t/t0200-gettext-basic.sh\nindex 522fb2ae696..8853d8afb92 100755\n--- a/t/t0200-gettext-basic.sh\n+++ b/t/t0200-gettext-basic.sh\n@@ -5,7 +5,6 @@\n \n test_description='Gettext support for Git'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./lib-gettext.sh\n \n test_expect_success \"sanity: \\$GIT_INTERNAL_GETTEXT_SH_SCHEME is set (to $GIT_INTERNAL_GETTEXT_SH_SCHEME)\" '\ndiff --git a/t/t0201-gettext-fallbacks.sh b/t/t0201-gettext-fallbacks.sh\nindex 8724ce1052d..6c74df0dc67 100755\n--- a/t/t0201-gettext-fallbacks.sh\n+++ b/t/t0201-gettext-fallbacks.sh\n@@ -8,7 +8,6 @@ test_description='Gettext Shell fallbacks'\n GIT_INTERNAL_GETTEXT_TEST_FALLBACKS=YesPlease\n export GIT_INTERNAL_GETTEXT_TEST_FALLBACKS\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./lib-gettext.sh\n \n test_expect_success \"sanity: \\$GIT_INTERNAL_GETTEXT_SH_SCHEME is set (to $GIT_INTERNAL_GETTEXT_SH_SCHEME)\" '\ndiff --git a/t/t0202-gettext-perl.sh b/t/t0202-gettext-perl.sh\nindex 5a6f28051bd..b15cb65d5d7 100755\n--- a/t/t0202-gettext-perl.sh\n+++ b/t/t0202-gettext-perl.sh\n@@ -5,7 +5,6 @@\n \n test_description='Perl gettext interface (Git::I18N)'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./lib-gettext.sh\n . \"$TEST_DIRECTORY\"/lib-perl.sh\n skip_all_if_no_Test_More\ndiff --git a/t/t0203-gettext-setlocale-sanity.sh b/t/t0203-gettext-setlocale-sanity.sh\nindex 86cff324ff1..0ce1f22eff6 100755\n--- a/t/t0203-gettext-setlocale-sanity.sh\n+++ b/t/t0203-gettext-setlocale-sanity.sh\n@@ -5,7 +5,6 @@\n \n test_description=\"The Git C functions aren't broken by setlocale(3)\"\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./lib-gettext.sh\n \n test_expect_success 'git show a ISO-8859-1 commit under C locale' '\ndiff --git a/t/t0204-gettext-reencode-sanity.sh b/t/t0204-gettext-reencode-sanity.sh\nindex 310a4500125..28d92bb9b7c 100755\n--- a/t/t0204-gettext-reencode-sanity.sh\n+++ b/t/t0204-gettext-reencode-sanity.sh\n@@ -5,7 +5,6 @@\n \n test_description=\"Gettext reencoding of our *.po/*.mo files works\"\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./lib-gettext.sh\n \n # The constants used in a tricky observation for undefined behaviour\ndiff --git a/t/t0210-trace2-normal.sh b/t/t0210-trace2-normal.sh\nindex b9adc94aab4..eff9a59dbd0 100755\n--- a/t/t0210-trace2-normal.sh\n+++ b/t/t0210-trace2-normal.sh\n@@ -2,7 +2,6 @@\n \n test_description='test trace2 facility (normal target)'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Turn off any inherited trace2 settings for this test.\ndiff --git a/t/t0211-trace2-perf.sh b/t/t0211-trace2-perf.sh\nindex 91260ce97e5..bac90465406 100755\n--- a/t/t0211-trace2-perf.sh\n+++ b/t/t0211-trace2-perf.sh\n@@ -2,7 +2,6 @@\n \n test_description='test trace2 facility (perf target)'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Turn off any inherited trace2 settings for this test.\ndiff --git a/t/t0212-trace2-event.sh b/t/t0212-trace2-event.sh\nindex 147643d5826..1211db9f468 100755\n--- a/t/t0212-trace2-event.sh\n+++ b/t/t0212-trace2-event.sh\n@@ -2,7 +2,6 @@\n \n test_description='test trace2 facility'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Turn off any inherited trace2 settings for this test.\ndiff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh\nindex 6a76b7fdbd4..17952e52d69 100755\n--- a/t/t0300-credentials.sh\n+++ b/t/t0300-credentials.sh\n@@ -2,7 +2,6 @@\n \n test_description='basic credential helper tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-credential.sh\n \ndiff --git a/t/t0301-credential-cache.sh b/t/t0301-credential-cache.sh\nindex 5d5b64205ff..dc30289f753 100755\n--- a/t/t0301-credential-cache.sh\n+++ b/t/t0301-credential-cache.sh\n@@ -2,7 +2,6 @@\n \n test_description='credential-cache tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-credential.sh\n \ndiff --git a/t/t0302-credential-store.sh b/t/t0302-credential-store.sh\nindex f83db659e25..c1cd60edd01 100755\n--- a/t/t0302-credential-store.sh\n+++ b/t/t0302-credential-store.sh\n@@ -2,7 +2,6 @@\n \n test_description='credential-store tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-credential.sh\n \ndiff --git a/t/t0303-credential-external.sh b/t/t0303-credential-external.sh\nindex 8aadbe86c45..72ae405c3ed 100755\n--- a/t/t0303-credential-external.sh\n+++ b/t/t0303-credential-external.sh\n@@ -29,7 +29,6 @@ you can set GIT_TEST_CREDENTIAL_HELPER_SETUP to a sequence of shell\n commands.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-credential.sh\n \ndiff --git a/t/t0410-partial-clone.sh b/t/t0410-partial-clone.sh\nindex 818700fbecd..34bdb3ab1f2 100755\n--- a/t/t0410-partial-clone.sh\n+++ b/t/t0410-partial-clone.sh\n@@ -2,7 +2,6 @@\n \n test_description='partial clone'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-terminal.sh\n \ndiff --git a/t/t0411-clone-from-partial.sh b/t/t0411-clone-from-partial.sh\nindex 932bf2067da..c98d5018695 100755\n--- a/t/t0411-clone-from-partial.sh\n+++ b/t/t0411-clone-from-partial.sh\n@@ -2,7 +2,6 @@\n \n test_description='check that local clone does not fetch from promisor remotes'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'create evil repo' '\ndiff --git a/t/t0450-txt-doc-vs-help.sh b/t/t0450-txt-doc-vs-help.sh\nindex f99a69ae1b7..853101b86ef 100755\n--- a/t/t0450-txt-doc-vs-help.sh\n+++ b/t/t0450-txt-doc-vs-help.sh\n@@ -5,7 +5,6 @@ test_description='assert (unbuilt) Documentation/*.txt and -h output\n Run this with --debug to see a summary of where we still fail to make\n the two versions consistent with one another.'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup: list of builtins' '\ndiff --git a/t/t0500-progress-display.sh b/t/t0500-progress-display.sh\nindex 1eb3a8306ba..d1a498a216f 100755\n--- a/t/t0500-progress-display.sh\n+++ b/t/t0500-progress-display.sh\n@@ -2,7 +2,6 @@\n \n test_description='progress display'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n show_cr () {\ndiff --git a/t/t0600-reffiles-backend.sh b/t/t0600-reffiles-backend.sh\nindex bef2b708713..1e62c791d97 100755\n--- a/t/t0600-reffiles-backend.sh\n+++ b/t/t0600-reffiles-backend.sh\n@@ -7,7 +7,6 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n GIT_TEST_DEFAULT_REF_FORMAT=files\n export GIT_TEST_DEFAULT_REF_FORMAT\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t0601-reffiles-pack-refs.sh b/t/t0601-reffiles-pack-refs.sh\nindex d8cbd3f202b..aa7f6ecd813 100755\n--- a/t/t0601-reffiles-pack-refs.sh\n+++ b/t/t0601-reffiles-pack-refs.sh\n@@ -15,7 +15,6 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n GIT_TEST_DEFAULT_REF_FORMAT=files\n export GIT_TEST_DEFAULT_REF_FORMAT\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'enable reflogs' '\ndiff --git a/t/t0602-reffiles-fsck.sh b/t/t0602-reffiles-fsck.sh\nindex 71a4d1a5ae4..30e0a36242e 100755\n--- a/t/t0602-reffiles-fsck.sh\n+++ b/t/t0602-reffiles-fsck.sh\n@@ -6,7 +6,6 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n GIT_TEST_DEFAULT_REF_FORMAT=files\n export GIT_TEST_DEFAULT_REF_FORMAT\n-TEST_PASSES_SANITIZE_LEAK=true\n \n . ./test-lib.sh\n \ndiff --git a/t/t0610-reftable-basics.sh b/t/t0610-reftable-basics.sh\nindex babec7993e3..67bf3a82f6e 100755\n--- a/t/t0610-reftable-basics.sh\n+++ b/t/t0610-reftable-basics.sh\n@@ -10,7 +10,6 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n GIT_TEST_DEFAULT_REF_FORMAT=reftable\n export GIT_TEST_DEFAULT_REF_FORMAT\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n INVALID_OID=$(test_oid 001)\ndiff --git a/t/t0611-reftable-httpd.sh b/t/t0611-reftable-httpd.sh\nindex 2805995cc8c..5e05b9c1f2a 100755\n--- a/t/t0611-reftable-httpd.sh\n+++ b/t/t0611-reftable-httpd.sh\n@@ -2,7 +2,6 @@\n \n test_description='reftable HTTPD tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-httpd.sh\n \ndiff --git a/t/t0612-reftable-jgit-compatibility.sh b/t/t0612-reftable-jgit-compatibility.sh\nindex 84922153ab6..d0d7e80b492 100755\n--- a/t/t0612-reftable-jgit-compatibility.sh\n+++ b/t/t0612-reftable-jgit-compatibility.sh\n@@ -11,7 +11,6 @@ export GIT_TEST_DEFAULT_REF_FORMAT\n GIT_TEST_SPLIT_INDEX=0\n export GIT_TEST_SPLIT_INDEX\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n if ! test_have_prereq JGIT\ndiff --git a/t/t0613-reftable-write-options.sh b/t/t0613-reftable-write-options.sh\nindex b1c6c97524f..e2708e11d5b 100755\n--- a/t/t0613-reftable-write-options.sh\n+++ b/t/t0613-reftable-write-options.sh\n@@ -16,7 +16,6 @@ export GIT_TEST_DEFAULT_HASH\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'default write options' '\ndiff --git a/t/t1000-read-tree-m-3way.sh b/t/t1000-read-tree-m-3way.sh\nindex 0e8c0dfbbee..b9dd21cfb6b 100755\n--- a/t/t1000-read-tree-m-3way.sh\n+++ b/t/t1000-read-tree-m-3way.sh\n@@ -72,7 +72,6 @@ In addition:\n \n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-read-tree.sh\n . \"$TEST_DIRECTORY\"/lib-read-tree-m-3way.sh\ndiff --git a/t/t1001-read-tree-m-2way.sh b/t/t1001-read-tree-m-2way.sh\nindex 48a1550371a..4a88bb9ef0c 100755\n--- a/t/t1001-read-tree-m-2way.sh\n+++ b/t/t1001-read-tree-m-2way.sh\n@@ -21,7 +21,6 @@ In the test, these paths are used:\n \tyomin   - not in H or M\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-read-tree.sh\n \ndiff --git a/t/t1002-read-tree-m-u-2way.sh b/t/t1002-read-tree-m-u-2way.sh\nindex a7c2ed0d7c0..df6ef537258 100755\n--- a/t/t1002-read-tree-m-u-2way.sh\n+++ b/t/t1002-read-tree-m-u-2way.sh\n@@ -9,7 +9,6 @@ This is identical to t1001, but uses -u to update the work tree as well.\n \n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-read-tree.sh\n \ndiff --git a/t/t1003-read-tree-prefix.sh b/t/t1003-read-tree-prefix.sh\nindex c860c08ecb4..66e2bf4aec3 100755\n--- a/t/t1003-read-tree-prefix.sh\n+++ b/t/t1003-read-tree-prefix.sh\n@@ -6,7 +6,6 @@\n test_description='git read-tree --prefix test.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t1004-read-tree-m-u-wf.sh b/t/t1004-read-tree-m-u-wf.sh\nindex 2b9720b0feb..11bf10424f1 100755\n--- a/t/t1004-read-tree-m-u-wf.sh\n+++ b/t/t1004-read-tree-m-u-wf.sh\n@@ -5,7 +5,6 @@ test_description='read-tree -m -u checks working tree files'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-read-tree.sh\n \ndiff --git a/t/t1005-read-tree-reset.sh b/t/t1005-read-tree-reset.sh\nindex 26be4a2b5a0..6b5033d0ce3 100755\n--- a/t/t1005-read-tree-reset.sh\n+++ b/t/t1005-read-tree-reset.sh\n@@ -2,7 +2,6 @@\n \n test_description='read-tree -u --reset'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-read-tree.sh\n \ndiff --git a/t/t1006-cat-file.sh b/t/t1006-cat-file.sh\nindex d36cd7c0863..ff9bf213aa2 100755\n--- a/t/t1006-cat-file.sh\n+++ b/t/t1006-cat-file.sh\n@@ -2,7 +2,6 @@\n \n test_description='git cat-file'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_cmdmode_usage () {\ndiff --git a/t/t1007-hash-object.sh b/t/t1007-hash-object.sh\nindex d73a5cc2370..a0481139de5 100755\n--- a/t/t1007-hash-object.sh\n+++ b/t/t1007-hash-object.sh\n@@ -2,7 +2,6 @@\n \n test_description=\"git hash-object\"\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n echo_without_newline() {\ndiff --git a/t/t1008-read-tree-overlay.sh b/t/t1008-read-tree-overlay.sh\nindex ad5936e54d1..4512fb0b6e6 100755\n--- a/t/t1008-read-tree-overlay.sh\n+++ b/t/t1008-read-tree-overlay.sh\n@@ -5,7 +5,6 @@ test_description='test multi-tree read-tree without merging'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-read-tree.sh\n \ndiff --git a/t/t1009-read-tree-new-index.sh b/t/t1009-read-tree-new-index.sh\nindex fc179ac5dd6..2935f68f8d2 100755\n--- a/t/t1009-read-tree-new-index.sh\n+++ b/t/t1009-read-tree-new-index.sh\n@@ -5,7 +5,6 @@ test_description='test read-tree into a fresh index file'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t1010-mktree.sh b/t/t1010-mktree.sh\nindex 22875ba598c..c291a2b33d7 100755\n--- a/t/t1010-mktree.sh\n+++ b/t/t1010-mktree.sh\n@@ -2,7 +2,6 @@\n \n test_description='git mktree'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t1011-read-tree-sparse-checkout.sh b/t/t1011-read-tree-sparse-checkout.sh\nindex 595b24c0adb..742f0fa909f 100755\n--- a/t/t1011-read-tree-sparse-checkout.sh\n+++ b/t/t1011-read-tree-sparse-checkout.sh\n@@ -12,7 +12,6 @@ test_description='sparse checkout tests\n '\n \n TEST_CREATE_REPO_NO_TEMPLATE=1\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-read-tree.sh\n \ndiff --git a/t/t1012-read-tree-df.sh b/t/t1012-read-tree-df.sh\nindex cde93d22cde..57f0770df14 100755\n--- a/t/t1012-read-tree-df.sh\n+++ b/t/t1012-read-tree-df.sh\n@@ -2,7 +2,6 @@\n \n test_description='read-tree D/F conflict corner cases'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-read-tree.sh\n \ndiff --git a/t/t1013-read-tree-submodule.sh b/t/t1013-read-tree-submodule.sh\nindex cf8b94ebedb..bfc90d4cf27 100755\n--- a/t/t1013-read-tree-submodule.sh\n+++ b/t/t1013-read-tree-submodule.sh\n@@ -2,7 +2,6 @@\n \n test_description='read-tree can handle submodules'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-submodule-update.sh\n \ndiff --git a/t/t1014-read-tree-confusing.sh b/t/t1014-read-tree-confusing.sh\nindex 8ea8d36818b..0c0e6da5cf5 100755\n--- a/t/t1014-read-tree-confusing.sh\n+++ b/t/t1014-read-tree-confusing.sh\n@@ -2,7 +2,6 @@\n \n test_description='check that read-tree rejects confusing paths'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'create base tree' '\ndiff --git a/t/t1015-read-index-unmerged.sh b/t/t1015-read-index-unmerged.sh\nindex da737a32a27..9b965d02943 100755\n--- a/t/t1015-read-index-unmerged.sh\n+++ b/t/t1015-read-index-unmerged.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test various callers of read_index_unmerged'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup modify/delete + directory/file conflict' '\ndiff --git a/t/t1016-compatObjectFormat.sh b/t/t1016-compatObjectFormat.sh\nindex 8341a2fe839..5641271b23a 100755\n--- a/t/t1016-compatObjectFormat.sh\n+++ b/t/t1016-compatObjectFormat.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test how well compatObjectFormat works'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-gpg.sh\n \ndiff --git a/t/t1020-subdirectory.sh b/t/t1020-subdirectory.sh\nindex 45eef9457fe..9fdbb2af80e 100755\n--- a/t/t1020-subdirectory.sh\n+++ b/t/t1020-subdirectory.sh\n@@ -6,7 +6,6 @@\n test_description='Try various core-level commands in subdirectory.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-read-tree.sh\n \ndiff --git a/t/t1021-rerere-in-workdir.sh b/t/t1021-rerere-in-workdir.sh\nindex 69bf9476cbf..0b892894eb9 100755\n--- a/t/t1021-rerere-in-workdir.sh\n+++ b/t/t1021-rerere-in-workdir.sh\n@@ -4,7 +4,6 @@ test_description='rerere run in a workdir'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success SYMLINKS setup '\ndiff --git a/t/t1022-read-tree-partial-clone.sh b/t/t1022-read-tree-partial-clone.sh\nindex cca4380e431..d390d7d5f85 100755\n--- a/t/t1022-read-tree-partial-clone.sh\n+++ b/t/t1022-read-tree-partial-clone.sh\n@@ -3,7 +3,6 @@\n test_description='git read-tree in partial clones'\n \n TEST_NO_CREATE_REPO=1\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'read-tree in partial clone prefetches in one batch' '\ndiff --git a/t/t1050-large.sh b/t/t1050-large.sh\nindex ed638f66447..c71932b0242 100755\n--- a/t/t1050-large.sh\n+++ b/t/t1050-large.sh\n@@ -3,7 +3,6 @@\n \n test_description='adding and checking out large blobs'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'core.bigFileThreshold must be non-negative' '\ndiff --git a/t/t1051-large-conversion.sh b/t/t1051-large-conversion.sh\nindex f6709c9f569..361afb679b0 100755\n--- a/t/t1051-large-conversion.sh\n+++ b/t/t1051-large-conversion.sh\n@@ -2,7 +2,6 @@\n \n test_description='test conversion filters on large files'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n set_attr() {\ndiff --git a/t/t1060-object-corruption.sh b/t/t1060-object-corruption.sh\nindex 5e0f0a334f4..502a5ea1c51 100755\n--- a/t/t1060-object-corruption.sh\n+++ b/t/t1060-object-corruption.sh\n@@ -2,7 +2,6 @@\n \n test_description='see how we handle various forms of corruption'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # convert \"1234abcd\" to \".git/objects/12/34abcd\"\ndiff --git a/t/t1090-sparse-checkout-scope.sh b/t/t1090-sparse-checkout-scope.sh\nindex da0e7714d5a..3a14218b245 100755\n--- a/t/t1090-sparse-checkout-scope.sh\n+++ b/t/t1090-sparse-checkout-scope.sh\n@@ -6,7 +6,6 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n TEST_CREATE_REPO_NO_TEMPLATE=1\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1091-sparse-checkout-builtin.sh b/t/t1091-sparse-checkout-builtin.sh\nindex 8c5cd651b4b..ab3a105ffff 100755\n--- a/t/t1091-sparse-checkout-builtin.sh\n+++ b/t/t1091-sparse-checkout-builtin.sh\n@@ -8,7 +8,6 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n GIT_TEST_SPLIT_INDEX=false\n export GIT_TEST_SPLIT_INDEX\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n list_files() {\ndiff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh\nindex 2157f37da36..a4c7c41fc00 100755\n--- a/t/t1092-sparse-checkout-compatibility.sh\n+++ b/t/t1092-sparse-checkout-compatibility.sh\n@@ -5,7 +5,6 @@ test_description='compare full workdir to sparse workdir'\n GIT_TEST_SPLIT_INDEX=0\n GIT_TEST_SPARSE_INDEX=\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1100-commit-tree-options.sh b/t/t1100-commit-tree-options.sh\nindex 0f37a43fd3c..ae66ba5babf 100755\n--- a/t/t1100-commit-tree-options.sh\n+++ b/t/t1100-commit-tree-options.sh\n@@ -12,7 +12,6 @@ Also make sure that command line parser understands the normal\n \"flags first and then non flag arguments\" command line.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n cat >expected <<EOF\ndiff --git a/t/t1300-config.sh b/t/t1300-config.sh\nindex f13277c8f3e..51a85e83c27 100755\n--- a/t/t1300-config.sh\n+++ b/t/t1300-config.sh\n@@ -8,7 +8,6 @@ test_description='Test git config in different settings'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n for mode in legacy subcommands\ndiff --git a/t/t1301-shared-repo.sh b/t/t1301-shared-repo.sh\nindex 29cf8a96613..630a47af21e 100755\n--- a/t/t1301-shared-repo.sh\n+++ b/t/t1301-shared-repo.sh\n@@ -9,7 +9,6 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n TEST_CREATE_REPO_NO_TEMPLATE=1\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Remove a default ACL from the test dir if possible.\ndiff --git a/t/t1302-repo-version.sh b/t/t1302-repo-version.sh\nindex 42caa0d2978..69723b88ff8 100755\n--- a/t/t1302-repo-version.sh\n+++ b/t/t1302-repo-version.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test repository version check'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1303-wacky-config.sh b/t/t1303-wacky-config.sh\nindex 0506f3d6bba..d971925ed02 100755\n--- a/t/t1303-wacky-config.sh\n+++ b/t/t1303-wacky-config.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test wacky input to git config'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Leaving off the newline is intentional!\ndiff --git a/t/t1304-default-acl.sh b/t/t1304-default-acl.sh\nindex 31b89dd9693..c69ae41306c 100755\n--- a/t/t1304-default-acl.sh\n+++ b/t/t1304-default-acl.sh\n@@ -9,7 +9,6 @@ test_description='Test repository with default ACL'\n # => this must come before . ./test-lib.sh\n umask 077\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # We need an arbitrary other user give permission to using ACLs. root\ndiff --git a/t/t1305-config-include.sh b/t/t1305-config-include.sh\nindex 517d6c86937..8ff2b0c232b 100755\n--- a/t/t1305-config-include.sh\n+++ b/t/t1305-config-include.sh\n@@ -1,7 +1,6 @@\n #!/bin/sh\n \n test_description='test config file include directives'\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Force setup_explicit_git_dir() to run until the end. This is needed\ndiff --git a/t/t1306-xdg-files.sh b/t/t1306-xdg-files.sh\nindex 53e5b290b9b..40d3c42618c 100755\n--- a/t/t1306-xdg-files.sh\n+++ b/t/t1306-xdg-files.sh\n@@ -7,7 +7,6 @@\n \n test_description='Compatibility with $XDG_CONFIG_HOME/git/ files'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'read config: xdg file exists and ~/.gitconfig doesn'\\''t' '\ndiff --git a/t/t1307-config-blob.sh b/t/t1307-config-blob.sh\nindex b9852fe40e4..5cb546dd00c 100755\n--- a/t/t1307-config-blob.sh\n+++ b/t/t1307-config-blob.sh\n@@ -2,7 +2,6 @@\n \n test_description='support for reading config from a blob'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'create config blob' '\ndiff --git a/t/t1308-config-set.sh b/t/t1308-config-set.sh\nindex 3bfec07f1ab..e0e49053f07 100755\n--- a/t/t1308-config-set.sh\n+++ b/t/t1308-config-set.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test git config-set API in different settings'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # 'check_config get_* section.key value' verifies that the entry for\ndiff --git a/t/t1309-early-config.sh b/t/t1309-early-config.sh\nindex 523aa99a1e2..9710ee0ca45 100755\n--- a/t/t1309-early-config.sh\n+++ b/t/t1309-early-config.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test read_early_config()'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'read early config' '\ndiff --git a/t/t1310-config-default.sh b/t/t1310-config-default.sh\nindex 1a90d31201a..69e64c6c868 100755\n--- a/t/t1310-config-default.sh\n+++ b/t/t1310-config-default.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test git config in different settings (with --default)'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'uses --default when entry missing' '\ndiff --git a/t/t1350-config-hooks-path.sh b/t/t1350-config-hooks-path.sh\nindex ceeb7ac3a47..45a04929170 100755\n--- a/t/t1350-config-hooks-path.sh\n+++ b/t/t1350-config-hooks-path.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test the core.hooksPath configuration variable'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'set up a pre-commit hook in core.hooksPath' '\ndiff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh\nindex bb057596f1e..e2316f1dd4c 100755\n--- a/t/t1400-update-ref.sh\n+++ b/t/t1400-update-ref.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test git update-ref and basic ref logging'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n Z=$ZERO_OID\ndiff --git a/t/t1401-symbolic-ref.sh b/t/t1401-symbolic-ref.sh\nindex 90af3f955c0..a2a7e947164 100755\n--- a/t/t1401-symbolic-ref.sh\n+++ b/t/t1401-symbolic-ref.sh\n@@ -2,7 +2,6 @@\n \n test_description='basic symbolic-ref tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # If the tests munging HEAD fail, they can break detection of\ndiff --git a/t/t1402-check-ref-format.sh b/t/t1402-check-ref-format.sh\nindex 5ed9d7318e0..cabc516ae9a 100755\n--- a/t/t1402-check-ref-format.sh\n+++ b/t/t1402-check-ref-format.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test git check-ref-format'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n valid_ref() {\ndiff --git a/t/t1403-show-ref.sh b/t/t1403-show-ref.sh\nindex 403f6b8f7da..9d698b3cc35 100755\n--- a/t/t1403-show-ref.sh\n+++ b/t/t1403-show-ref.sh\n@@ -4,7 +4,6 @@ test_description='show-ref'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t1404-update-ref-errors.sh b/t/t1404-update-ref-errors.sh\nindex df90112618c..28e6c380d76 100755\n--- a/t/t1404-update-ref-errors.sh\n+++ b/t/t1404-update-ref-errors.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test git update-ref error handling'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Create some references, perhaps run pack-refs --all, then try to\ndiff --git a/t/t1405-main-ref-store.sh b/t/t1405-main-ref-store.sh\nindex a6bcd62ab65..6d8f401a2a9 100755\n--- a/t/t1405-main-ref-store.sh\n+++ b/t/t1405-main-ref-store.sh\n@@ -5,7 +5,6 @@ test_description='test main ref store api'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n RUN=\"test-tool ref-store main\"\ndiff --git a/t/t1406-submodule-ref-store.sh b/t/t1406-submodule-ref-store.sh\nindex c01f0f14a12..9b9e5d0766f 100755\n--- a/t/t1406-submodule-ref-store.sh\n+++ b/t/t1406-submodule-ref-store.sh\n@@ -5,7 +5,6 @@ test_description='test submodule ref store api'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n RUN=\"test-tool ref-store submodule:sub\"\ndiff --git a/t/t1407-worktree-ref-store.sh b/t/t1407-worktree-ref-store.sh\nindex 48b1c92a414..9d8e1a13432 100755\n--- a/t/t1407-worktree-ref-store.sh\n+++ b/t/t1407-worktree-ref-store.sh\n@@ -5,7 +5,6 @@ test_description='test worktree ref store api'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n RWT=\"test-tool ref-store worktree:wt\"\ndiff --git a/t/t1408-packed-refs.sh b/t/t1408-packed-refs.sh\nindex 9469c79a585..41ba1f1d7fc 100755\n--- a/t/t1408-packed-refs.sh\n+++ b/t/t1408-packed-refs.sh\n@@ -5,7 +5,6 @@ test_description='packed-refs entries are covered by loose refs'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t1409-avoid-packing-refs.sh b/t/t1409-avoid-packing-refs.sh\nindex 7748973733e..e3c501848a4 100755\n--- a/t/t1409-avoid-packing-refs.sh\n+++ b/t/t1409-avoid-packing-refs.sh\n@@ -2,7 +2,6 @@\n \n test_description='avoid rewriting packed-refs unnecessarily'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n if test_have_prereq !REFFILES\ndiff --git a/t/t1410-reflog.sh b/t/t1410-reflog.sh\nindex 246a3f46aba..388fdf9ae57 100755\n--- a/t/t1410-reflog.sh\n+++ b/t/t1410-reflog.sh\n@@ -7,7 +7,6 @@ test_description='Test prune and reflog expiration'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n check_have () {\ndiff --git a/t/t1411-reflog-show.sh b/t/t1411-reflog-show.sh\nindex da581ec19ac..975c4ea83a8 100755\n--- a/t/t1411-reflog-show.sh\n+++ b/t/t1411-reflog-show.sh\n@@ -4,7 +4,6 @@ test_description='Test reflog display routines'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1412-reflog-loop.sh b/t/t1412-reflog-loop.sh\nindex ff30874f940..f7d69b66ff3 100755\n--- a/t/t1412-reflog-loop.sh\n+++ b/t/t1412-reflog-loop.sh\n@@ -2,7 +2,6 @@\n \n test_description='reflog walk shows repeated commits again'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup commits' '\ndiff --git a/t/t1413-reflog-detach.sh b/t/t1413-reflog-detach.sh\nindex d2a4822d46f..934688a1ee8 100755\n--- a/t/t1413-reflog-detach.sh\n+++ b/t/t1413-reflog-detach.sh\n@@ -4,7 +4,6 @@ test_description='Test reflog interaction with detached HEAD'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n reset_state () {\ndiff --git a/t/t1414-reflog-walk.sh b/t/t1414-reflog-walk.sh\nindex 49d28166da0..be6c3f472c1 100755\n--- a/t/t1414-reflog-walk.sh\n+++ b/t/t1414-reflog-walk.sh\n@@ -4,7 +4,6 @@ test_description='various tests of reflog walk (log -g) behavior'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'set up some reflog entries' '\ndiff --git a/t/t1415-worktree-refs.sh b/t/t1415-worktree-refs.sh\nindex eb4eec8becb..51d79bae83b 100755\n--- a/t/t1415-worktree-refs.sh\n+++ b/t/t1415-worktree-refs.sh\n@@ -2,7 +2,6 @@\n \n test_description='per-worktree refs'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1416-ref-transaction-hooks.sh b/t/t1416-ref-transaction-hooks.sh\nindex 5a812ca3c0b..dd003a196f7 100755\n--- a/t/t1416-ref-transaction-hooks.sh\n+++ b/t/t1416-ref-transaction-hooks.sh\n@@ -5,7 +5,6 @@ test_description='reference transaction hooks'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t1417-reflog-updateref.sh b/t/t1417-reflog-updateref.sh\nindex 0eb5e674bc1..2f374025367 100755\n--- a/t/t1417-reflog-updateref.sh\n+++ b/t/t1417-reflog-updateref.sh\n@@ -2,7 +2,6 @@\n \n test_description='git reflog --updateref'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1418-reflog-exists.sh b/t/t1418-reflog-exists.sh\nindex 2268bca3c11..d51ecd5e925 100755\n--- a/t/t1418-reflog-exists.sh\n+++ b/t/t1418-reflog-exists.sh\n@@ -4,7 +4,6 @@ test_description='Test reflog display routines'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1419-exclude-refs.sh b/t/t1419-exclude-refs.sh\nindex 3256e4462f9..c04eeb72111 100755\n--- a/t/t1419-exclude-refs.sh\n+++ b/t/t1419-exclude-refs.sh\n@@ -5,7 +5,6 @@ test_description='test exclude_patterns functionality in main ref store'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n for_each_ref__exclude () {\ndiff --git a/t/t1420-lost-found.sh b/t/t1420-lost-found.sh\nindex dbe15a0be10..2fb2f44f021 100755\n--- a/t/t1420-lost-found.sh\n+++ b/t/t1420-lost-found.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test fsck --lost-found'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t1430-bad-ref-name.sh b/t/t1430-bad-ref-name.sh\nindex 0c00118c2b3..3ab65f72cde 100755\n--- a/t/t1430-bad-ref-name.sh\n+++ b/t/t1430-bad-ref-name.sh\n@@ -4,7 +4,6 @@ test_description='Test handling of ref names that check-ref-format rejects'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh\nindex 280cbf3e031..8a456b1142d 100755\n--- a/t/t1450-fsck.sh\n+++ b/t/t1450-fsck.sh\n@@ -6,7 +6,6 @@ test_description='git fsck random collection of tests\n * (main) A\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t1451-fsck-buffer.sh b/t/t1451-fsck-buffer.sh\nindex 3413da40e4a..3a3d33f4054 100755\n--- a/t/t1451-fsck-buffer.sh\n+++ b/t/t1451-fsck-buffer.sh\n@@ -15,7 +15,6 @@ These tests _might_ catch such overruns in normal use, but should be run with\n ASan or valgrind for more confidence.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # the general idea for tags and commits is to build up the \"base\" file\ndiff --git a/t/t1460-refs-migrate.sh b/t/t1460-refs-migrate.sh\nindex f7c0783d30c..cf57cd66f2d 100755\n--- a/t/t1460-refs-migrate.sh\n+++ b/t/t1460-refs-migrate.sh\n@@ -5,7 +5,6 @@ test_description='migration of ref storage backends'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_migration () {\ndiff --git a/t/t1500-rev-parse.sh b/t/t1500-rev-parse.sh\nindex 30c31918fde..bf2a90df948 100755\n--- a/t/t1500-rev-parse.sh\n+++ b/t/t1500-rev-parse.sh\n@@ -4,7 +4,6 @@ test_description='test git rev-parse'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_one () {\ndiff --git a/t/t1501-work-tree.sh b/t/t1501-work-tree.sh\nindex ae6528aecea..8c94ac2e70b 100755\n--- a/t/t1501-work-tree.sh\n+++ b/t/t1501-work-tree.sh\n@@ -2,7 +2,6 @@\n \n test_description='test separate work tree'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1502-rev-parse-parseopt.sh b/t/t1502-rev-parse-parseopt.sh\nindex 5eaa6428c43..3962f1d2882 100755\n--- a/t/t1502-rev-parse-parseopt.sh\n+++ b/t/t1502-rev-parse-parseopt.sh\n@@ -2,7 +2,6 @@\n \n test_description='test git rev-parse --parseopt'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n check_invalid_long_option () {\ndiff --git a/t/t1503-rev-parse-verify.sh b/t/t1503-rev-parse-verify.sh\nindex 79df65ec7f6..75a708f9ba5 100755\n--- a/t/t1503-rev-parse-verify.sh\n+++ b/t/t1503-rev-parse-verify.sh\n@@ -9,7 +9,6 @@ exec </dev/null\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n add_line_into_file()\ndiff --git a/t/t1504-ceiling-dirs.sh b/t/t1504-ceiling-dirs.sh\nindex c1679e31d8a..e04420f4368 100755\n--- a/t/t1504-ceiling-dirs.sh\n+++ b/t/t1504-ceiling-dirs.sh\n@@ -2,7 +2,6 @@\n \n test_description='test GIT_CEILING_DIRECTORIES'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_prefix() {\ndiff --git a/t/t1505-rev-parse-last.sh b/t/t1505-rev-parse-last.sh\nindex 4a5758f08a8..2803ca9489c 100755\n--- a/t/t1505-rev-parse-last.sh\n+++ b/t/t1505-rev-parse-last.sh\n@@ -5,7 +5,6 @@ test_description='test @{-N} syntax'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n \ndiff --git a/t/t1506-rev-parse-diagnosis.sh b/t/t1506-rev-parse-diagnosis.sh\nindex a3464976e3a..722884e65f4 100755\n--- a/t/t1506-rev-parse-diagnosis.sh\n+++ b/t/t1506-rev-parse-diagnosis.sh\n@@ -7,7 +7,6 @@ exec </dev/null\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_did_you_mean ()\ndiff --git a/t/t1507-rev-parse-upstream.sh b/t/t1507-rev-parse-upstream.sh\nindex b9af6b3ac03..cb9ef7e329e 100755\n--- a/t/t1507-rev-parse-upstream.sh\n+++ b/t/t1507-rev-parse-upstream.sh\n@@ -5,7 +5,6 @@ test_description='test <branch>@{upstream} syntax'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n \ndiff --git a/t/t1508-at-combinations.sh b/t/t1508-at-combinations.sh\nindex e841309d0ea..87a42864145 100755\n--- a/t/t1508-at-combinations.sh\n+++ b/t/t1508-at-combinations.sh\n@@ -4,7 +4,6 @@ test_description='test various @{X} syntax combinations together'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n check() {\ndiff --git a/t/t1510-repo-setup.sh b/t/t1510-repo-setup.sh\nindex 591505a39c0..bbfe05b8e4a 100755\n--- a/t/t1510-repo-setup.sh\n+++ b/t/t1510-repo-setup.sh\n@@ -43,7 +43,6 @@ A few rules for repo setup:\n # This test heavily relies on the standard error of nested function calls.\n test_untraceable=UnfortunatelyYes\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n here=$(pwd)\ndiff --git a/t/t1511-rev-parse-caret.sh b/t/t1511-rev-parse-caret.sh\nindex e7e78a40281..6ecfed86bc0 100755\n--- a/t/t1511-rev-parse-caret.sh\n+++ b/t/t1511-rev-parse-caret.sh\n@@ -5,7 +5,6 @@ test_description='tests for ref^{stuff}'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1512-rev-parse-disambiguation.sh b/t/t1512-rev-parse-disambiguation.sh\nindex f9d68ce74ea..70f1e0a998e 100755\n--- a/t/t1512-rev-parse-disambiguation.sh\n+++ b/t/t1512-rev-parse-disambiguation.sh\n@@ -23,7 +23,6 @@ one tagged as v1.0.0.  They all have one regular file each.\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_cmp_failed_rev_parse () {\ndiff --git a/t/t1513-rev-parse-prefix.sh b/t/t1513-rev-parse-prefix.sh\nindex ba43387bf16..5f437be8c9e 100755\n--- a/t/t1513-rev-parse-prefix.sh\n+++ b/t/t1513-rev-parse-prefix.sh\n@@ -5,7 +5,6 @@ test_description='Tests for rev-parse --prefix'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1514-rev-parse-push.sh b/t/t1514-rev-parse-push.sh\nindex a835a196aa8..d868a081105 100755\n--- a/t/t1514-rev-parse-push.sh\n+++ b/t/t1514-rev-parse-push.sh\n@@ -4,7 +4,6 @@ test_description='test <branch>@{push} syntax'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n resolve () {\ndiff --git a/t/t1515-rev-parse-outside-repo.sh b/t/t1515-rev-parse-outside-repo.sh\nindex cdb26a30d72..75e89c4b6e2 100755\n--- a/t/t1515-rev-parse-outside-repo.sh\n+++ b/t/t1515-rev-parse-outside-repo.sh\n@@ -2,7 +2,6 @@\n \n test_description='check that certain rev-parse options work outside repo'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'set up non-repo directory' '\ndiff --git a/t/t1517-outside-repo.sh b/t/t1517-outside-repo.sh\nindex 342defbb617..dbd8cd69063 100755\n--- a/t/t1517-outside-repo.sh\n+++ b/t/t1517-outside-repo.sh\n@@ -2,7 +2,6 @@\n \n test_description='check random commands outside repo'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'set up a non-repo directory and test file' '\ndiff --git a/t/t1600-index.sh b/t/t1600-index.sh\nindex 62e7fd15964..03239e9faa4 100755\n--- a/t/t1600-index.sh\n+++ b/t/t1600-index.sh\n@@ -2,7 +2,6 @@\n \n test_description='index file specific tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n sane_unset GIT_TEST_SPLIT_INDEX\ndiff --git a/t/t1601-index-bogus.sh b/t/t1601-index-bogus.sh\nindex 5dcc1018828..a45a8b4eb04 100755\n--- a/t/t1601-index-bogus.sh\n+++ b/t/t1601-index-bogus.sh\n@@ -2,7 +2,6 @@\n \n test_description='test handling of bogus index entries'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'create tree with null sha1' '\ndiff --git a/t/t1700-split-index.sh b/t/t1700-split-index.sh\nindex 2625ac44889..ac4a5b2734c 100755\n--- a/t/t1700-split-index.sh\n+++ b/t/t1700-split-index.sh\n@@ -5,7 +5,6 @@ test_description='split index mode tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # We need total control of index splitting here\ndiff --git a/t/t1701-racy-split-index.sh b/t/t1701-racy-split-index.sh\nindex d8fa489998a..5dc221ef382 100755\n--- a/t/t1701-racy-split-index.sh\n+++ b/t/t1701-racy-split-index.sh\n@@ -5,7 +5,6 @@\n \n test_description='racy split index'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1800-hook.sh b/t/t1800-hook.sh\nindex 8b0234cf2d5..4feaf0d7bef 100755\n--- a/t/t1800-hook.sh\n+++ b/t/t1800-hook.sh\n@@ -2,7 +2,6 @@\n \n test_description='git-hook command'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-terminal.sh\n \ndiff --git a/t/t2000-conflict-when-checking-files-out.sh b/t/t2000-conflict-when-checking-files-out.sh\nindex 79fc97f1d7e..f18616ad2be 100755\n--- a/t/t2000-conflict-when-checking-files-out.sh\n+++ b/t/t2000-conflict-when-checking-files-out.sh\n@@ -21,7 +21,6 @@ test_description='git conflicts when checking files out test.'\n # path1 is occupied by a non-directory.  With \"-f\" flag, it should remove\n # the conflicting paths and succeed.\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n show_files() {\ndiff --git a/t/t2002-checkout-cache-u.sh b/t/t2002-checkout-cache-u.sh\nindex fc95cf90485..70361c806e1 100755\n--- a/t/t2002-checkout-cache-u.sh\n+++ b/t/t2002-checkout-cache-u.sh\n@@ -8,7 +8,6 @@ test_description='git checkout-index -u test.\n With -u flag, git checkout-index internally runs the equivalent of\n git update-index --refresh on the checked out entry.'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success \\\ndiff --git a/t/t2003-checkout-cache-mkdir.sh b/t/t2003-checkout-cache-mkdir.sh\nindex f0fd441d810..ff163cf6750 100755\n--- a/t/t2003-checkout-cache-mkdir.sh\n+++ b/t/t2003-checkout-cache-mkdir.sh\n@@ -10,7 +10,6 @@ also verifies that such leading path may contain symlinks, unlike\n the GIT controlled paths.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2004-checkout-cache-temp.sh b/t/t2004-checkout-cache-temp.sh\nindex 98e818f09f2..b92d96fdc4e 100755\n--- a/t/t2004-checkout-cache-temp.sh\n+++ b/t/t2004-checkout-cache-temp.sh\n@@ -8,7 +8,6 @@ test_description='git checkout-index --temp test.\n With --temp flag, git checkout-index writes to temporary merge files\n rather than the tracked path.'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2005-checkout-index-symlinks.sh b/t/t2005-checkout-index-symlinks.sh\nindex 67d18cfa104..91b08e03717 100755\n--- a/t/t2005-checkout-index-symlinks.sh\n+++ b/t/t2005-checkout-index-symlinks.sh\n@@ -8,7 +8,6 @@ test_description='git checkout-index on filesystem w/o symlinks test.\n This tests that git checkout-index creates a symbolic link as a plain\n file if core.symlinks is false.'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success \\\ndiff --git a/t/t2006-checkout-index-basic.sh b/t/t2006-checkout-index-basic.sh\nindex 570ba38580d..bac231b167c 100755\n--- a/t/t2006-checkout-index-basic.sh\n+++ b/t/t2006-checkout-index-basic.sh\n@@ -3,7 +3,6 @@\n test_description='basic checkout-index tests\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'checkout-index --gobbledegook' '\ndiff --git a/t/t2007-checkout-symlink.sh b/t/t2007-checkout-symlink.sh\nindex bd9e9e7530d..6f0b90ce127 100755\n--- a/t/t2007-checkout-symlink.sh\n+++ b/t/t2007-checkout-symlink.sh\n@@ -7,7 +7,6 @@ test_description='git checkout to switch between branches with symlink<->dir'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t2008-checkout-subdir.sh b/t/t2008-checkout-subdir.sh\nindex 8a518a44ea2..eadb9434ae7 100755\n--- a/t/t2008-checkout-subdir.sh\n+++ b/t/t2008-checkout-subdir.sh\n@@ -4,7 +4,6 @@\n \n test_description='git checkout from subdirectories'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t2009-checkout-statinfo.sh b/t/t2009-checkout-statinfo.sh\nindex 71195dd28f2..b0540636ae3 100755\n--- a/t/t2009-checkout-statinfo.sh\n+++ b/t/t2009-checkout-statinfo.sh\n@@ -5,7 +5,6 @@ test_description='checkout should leave clean stat info'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2010-checkout-ambiguous.sh b/t/t2010-checkout-ambiguous.sh\nindex 82c3bfeac1a..3a3d56018e5 100755\n--- a/t/t2010-checkout-ambiguous.sh\n+++ b/t/t2010-checkout-ambiguous.sh\n@@ -5,7 +5,6 @@ test_description='checkout and pathspecs/refspecs ambiguities'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2011-checkout-invalid-head.sh b/t/t2011-checkout-invalid-head.sh\nindex 04f53b1ea14..61417c75675 100755\n--- a/t/t2011-checkout-invalid-head.sh\n+++ b/t/t2011-checkout-invalid-head.sh\n@@ -5,7 +5,6 @@ test_description='checkout switching away from an invalid branch'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2012-checkout-last.sh b/t/t2012-checkout-last.sh\nindex 4b6372f4c3e..1f6c4ed0428 100755\n--- a/t/t2012-checkout-last.sh\n+++ b/t/t2012-checkout-last.sh\n@@ -5,7 +5,6 @@ test_description='checkout can switch to last branch and merge base'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2013-checkout-submodule.sh b/t/t2013-checkout-submodule.sh\nindex 3c1d663d948..b2bdd1fcb42 100755\n--- a/t/t2013-checkout-submodule.sh\n+++ b/t/t2013-checkout-submodule.sh\n@@ -2,7 +2,6 @@\n \n test_description='checkout can handle submodules'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-submodule-update.sh\n \ndiff --git a/t/t2014-checkout-switch.sh b/t/t2014-checkout-switch.sh\nindex c138bdde4fe..3e757c6e4e3 100755\n--- a/t/t2014-checkout-switch.sh\n+++ b/t/t2014-checkout-switch.sh\n@@ -2,7 +2,6 @@\n \n test_description='Peter MacMillan'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t2015-checkout-unborn.sh b/t/t2015-checkout-unborn.sh\nindex fb0e13881cd..1820300c62f 100755\n--- a/t/t2015-checkout-unborn.sh\n+++ b/t/t2015-checkout-unborn.sh\n@@ -4,7 +4,6 @@ test_description='checkout from unborn branch'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2016-checkout-patch.sh b/t/t2016-checkout-patch.sh\nindex c40b661ac12..c4f9bf09aa4 100755\n--- a/t/t2016-checkout-patch.sh\n+++ b/t/t2016-checkout-patch.sh\n@@ -2,7 +2,6 @@\n \n test_description='git checkout --patch'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./lib-patch-mode.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2017-checkout-orphan.sh b/t/t2017-checkout-orphan.sh\nindex a5c7358eeab..80ac661815d 100755\n--- a/t/t2017-checkout-orphan.sh\n+++ b/t/t2017-checkout-orphan.sh\n@@ -10,7 +10,6 @@ Main Tests for --orphan functionality.'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n TEST_FILE=foo\ndiff --git a/t/t2018-checkout-branch.sh b/t/t2018-checkout-branch.sh\nindex 43551cc1481..a48ebdbf4d0 100755\n--- a/t/t2018-checkout-branch.sh\n+++ b/t/t2018-checkout-branch.sh\n@@ -3,7 +3,6 @@\n test_description='checkout'\n \n TEST_CREATE_REPO_NO_TEMPLATE=1\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Arguments: [!] <branch> <oid> [<checkout options>]\ndiff --git a/t/t2019-checkout-ambiguous-ref.sh b/t/t2019-checkout-ambiguous-ref.sh\nindex c67261e2b68..1fcef4be95c 100755\n--- a/t/t2019-checkout-ambiguous-ref.sh\n+++ b/t/t2019-checkout-ambiguous-ref.sh\n@@ -2,7 +2,6 @@\n \n test_description='checkout handling of ambiguous (branch/tag) refs'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup ambiguous refs' '\ndiff --git a/t/t2020-checkout-detach.sh b/t/t2020-checkout-detach.sh\nindex 8d90d028504..28bbbe6c055 100755\n--- a/t/t2020-checkout-detach.sh\n+++ b/t/t2020-checkout-detach.sh\n@@ -4,7 +4,6 @@ test_description='checkout into detached HEAD state'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n check_detached () {\ndiff --git a/t/t2021-checkout-overwrite.sh b/t/t2021-checkout-overwrite.sh\nindex ecfacf0f7f3..a5c03d5d4a2 100755\n--- a/t/t2021-checkout-overwrite.sh\n+++ b/t/t2021-checkout-overwrite.sh\n@@ -2,7 +2,6 @@\n \n test_description='checkout must not overwrite an untracked objects'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2022-checkout-paths.sh b/t/t2022-checkout-paths.sh\nindex f1b709d58be..c49ba7f9bd4 100755\n--- a/t/t2022-checkout-paths.sh\n+++ b/t/t2022-checkout-paths.sh\n@@ -4,7 +4,6 @@ test_description='checkout $tree -- $paths'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t2023-checkout-m.sh b/t/t2023-checkout-m.sh\nindex 81e772fb4eb..7b327b75449 100755\n--- a/t/t2023-checkout-m.sh\n+++ b/t/t2023-checkout-m.sh\n@@ -7,7 +7,6 @@ Ensures that checkout -m on a resolved file restores the conflicted file'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t2024-checkout-dwim.sh b/t/t2024-checkout-dwim.sh\nindex 2caada3d834..a3b1449ef11 100755\n--- a/t/t2024-checkout-dwim.sh\n+++ b/t/t2024-checkout-dwim.sh\n@@ -4,7 +4,6 @@ test_description='checkout <branch>\n \n Ensures that checkout on an unborn branch does what the user expects'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Is the current branch \"refs/heads/$1\"?\ndiff --git a/t/t2025-checkout-no-overlay.sh b/t/t2025-checkout-no-overlay.sh\nindex 246609d54d0..dda169bbc4a 100755\n--- a/t/t2025-checkout-no-overlay.sh\n+++ b/t/t2025-checkout-no-overlay.sh\n@@ -2,7 +2,6 @@\n \n test_description='checkout --no-overlay <tree-ish> -- <pathspec>'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2026-checkout-pathspec-file.sh b/t/t2026-checkout-pathspec-file.sh\nindex acd55217a62..161da054b6d 100755\n--- a/t/t2026-checkout-pathspec-file.sh\n+++ b/t/t2026-checkout-pathspec-file.sh\n@@ -2,7 +2,6 @@\n \n test_description='checkout --pathspec-from-file'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_tick\ndiff --git a/t/t2027-checkout-track.sh b/t/t2027-checkout-track.sh\nindex 98f16c72399..a397790df59 100755\n--- a/t/t2027-checkout-track.sh\n+++ b/t/t2027-checkout-track.sh\n@@ -5,7 +5,6 @@ test_description='tests for git branch --track'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2030-unresolve-info.sh b/t/t2030-unresolve-info.sh\nindex b3f6bc97b53..be3fcdde075 100755\n--- a/t/t2030-unresolve-info.sh\n+++ b/t/t2030-unresolve-info.sh\n@@ -5,7 +5,6 @@ test_description='undoing resolution'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n check_resolve_undo () {\ndiff --git a/t/t2050-git-dir-relative.sh b/t/t2050-git-dir-relative.sh\nindex 1f193cde965..21f4659a9d1 100755\n--- a/t/t2050-git-dir-relative.sh\n+++ b/t/t2050-git-dir-relative.sh\n@@ -12,7 +12,6 @@ into the subdir while keeping the worktree location,\n and tries commits from the top and the subdir, checking\n that the commit-hook still gets called.'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n COMMIT_FILE=\"$(pwd)/output\"\ndiff --git a/t/t2060-switch.sh b/t/t2060-switch.sh\nindex 77b2346291b..c91c4db9361 100755\n--- a/t/t2060-switch.sh\n+++ b/t/t2060-switch.sh\n@@ -5,7 +5,6 @@ test_description='switch basic functionality'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2070-restore.sh b/t/t2070-restore.sh\nindex ac404945d4c..16d6348b692 100755\n--- a/t/t2070-restore.sh\n+++ b/t/t2070-restore.sh\n@@ -5,7 +5,6 @@ test_description='restore basic functionality'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2071-restore-patch.sh b/t/t2071-restore-patch.sh\nindex 42d55221191..27e85be40ad 100755\n--- a/t/t2071-restore-patch.sh\n+++ b/t/t2071-restore-patch.sh\n@@ -2,7 +2,6 @@\n \n test_description='git restore --patch'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./lib-patch-mode.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2072-restore-pathspec-file.sh b/t/t2072-restore-pathspec-file.sh\nindex 86c9c887881..8198a1e5789 100755\n--- a/t/t2072-restore-pathspec-file.sh\n+++ b/t/t2072-restore-pathspec-file.sh\n@@ -2,7 +2,6 @@\n \n test_description='restore --pathspec-from-file'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_tick\ndiff --git a/t/t2080-parallel-checkout-basics.sh b/t/t2080-parallel-checkout-basics.sh\nindex 59e5570cb2d..5ffe1a41e2c 100755\n--- a/t/t2080-parallel-checkout-basics.sh\n+++ b/t/t2080-parallel-checkout-basics.sh\n@@ -8,7 +8,6 @@ working tree.\n '\n \n TEST_NO_CREATE_REPO=1\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY/lib-parallel-checkout.sh\"\n \ndiff --git a/t/t2081-parallel-checkout-collisions.sh b/t/t2081-parallel-checkout-collisions.sh\nindex 6acdb89d12b..f6fcfc0c1e4 100755\n--- a/t/t2081-parallel-checkout-collisions.sh\n+++ b/t/t2081-parallel-checkout-collisions.sh\n@@ -11,7 +11,6 @@ The tests in this file exercise parallel checkout's collision detection code in\n both these mechanics.\n \"\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY/lib-parallel-checkout.sh\"\n \ndiff --git a/t/t2082-parallel-checkout-attributes.sh b/t/t2082-parallel-checkout-attributes.sh\nindex d02d6a55504..79fb11f139a 100755\n--- a/t/t2082-parallel-checkout-attributes.sh\n+++ b/t/t2082-parallel-checkout-attributes.sh\n@@ -10,7 +10,6 @@ properly (without access to the index or attribute stack).\n '\n \n TEST_NO_CREATE_REPO=1\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY/lib-parallel-checkout.sh\"\n . \"$TEST_DIRECTORY/lib-encoding.sh\"\ndiff --git a/t/t2100-update-cache-badpath.sh b/t/t2100-update-cache-badpath.sh\nindex 7915e7b8211..2df3fdde8bf 100755\n--- a/t/t2100-update-cache-badpath.sh\n+++ b/t/t2100-update-cache-badpath.sh\n@@ -22,7 +22,6 @@ and tries to git update-index --add the following:\n All of the attempts should fail.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n mkdir path2 path3\ndiff --git a/t/t2101-update-index-reupdate.sh b/t/t2101-update-index-reupdate.sh\nindex e3c7acdbf91..6c32d42c8c6 100755\n--- a/t/t2101-update-index-reupdate.sh\n+++ b/t/t2101-update-index-reupdate.sh\n@@ -6,7 +6,6 @@\n test_description='git update-index --again test.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'update-index --add' '\ndiff --git a/t/t2102-update-index-symlinks.sh b/t/t2102-update-index-symlinks.sh\nindex c49cdfb6e58..9b11130ab93 100755\n--- a/t/t2102-update-index-symlinks.sh\n+++ b/t/t2102-update-index-symlinks.sh\n@@ -8,7 +8,6 @@ test_description='git update-index on filesystem w/o symlinks test.\n This tests that git update-index keeps the symbolic link property\n even if a plain file is in the working tree if core.symlinks is false.'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success \\\ndiff --git a/t/t2103-update-index-ignore-missing.sh b/t/t2103-update-index-ignore-missing.sh\nindex e9451cd567c..6938ecca868 100755\n--- a/t/t2103-update-index-ignore-missing.sh\n+++ b/t/t2103-update-index-ignore-missing.sh\n@@ -2,7 +2,6 @@\n \n test_description='update-index with options'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success basics '\ndiff --git a/t/t2104-update-index-skip-worktree.sh b/t/t2104-update-index-skip-worktree.sh\nindex 7ec7f30b442..7a0778ed983 100755\n--- a/t/t2104-update-index-skip-worktree.sh\n+++ b/t/t2104-update-index-skip-worktree.sh\n@@ -5,7 +5,6 @@\n \n test_description='skip-worktree bit test'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n sane_unset GIT_TEST_SPLIT_INDEX\ndiff --git a/t/t2105-update-index-gitfile.sh b/t/t2105-update-index-gitfile.sh\nindex 963ebe77eb6..a7f3d47aec2 100755\n--- a/t/t2105-update-index-gitfile.sh\n+++ b/t/t2105-update-index-gitfile.sh\n@@ -6,7 +6,6 @@\n test_description='git update-index for gitlink to .git file.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'submodule with absolute .git file' '\ndiff --git a/t/t2106-update-index-assume-unchanged.sh b/t/t2106-update-index-assume-unchanged.sh\nindex 95c004dc5c5..6b2ccc21a93 100755\n--- a/t/t2106-update-index-assume-unchanged.sh\n+++ b/t/t2106-update-index-assume-unchanged.sh\n@@ -3,7 +3,6 @@\n test_description='git update-index --assume-unchanged test.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2107-update-index-basic.sh b/t/t2107-update-index-basic.sh\nindex f0eab13f96a..cc72ead79f3 100755\n--- a/t/t2107-update-index-basic.sh\n+++ b/t/t2107-update-index-basic.sh\n@@ -5,7 +5,6 @@ test_description='basic update-index tests\n Tests for command-line parsing and basic operation.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'update-index --nonsense fails' '\ndiff --git a/t/t2108-update-index-refresh-racy.sh b/t/t2108-update-index-refresh-racy.sh\nindex bc5f2886faf..b31dd8ece50 100755\n--- a/t/t2108-update-index-refresh-racy.sh\n+++ b/t/t2108-update-index-refresh-racy.sh\n@@ -2,7 +2,6 @@\n \n test_description='update-index refresh tests related to racy timestamps'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n reset_files () {\ndiff --git a/t/t2200-add-update.sh b/t/t2200-add-update.sh\nindex df235ac306e..06e83d33333 100755\n--- a/t/t2200-add-update.sh\n+++ b/t/t2200-add-update.sh\n@@ -14,7 +14,6 @@ only the updates to dir/sub.\n Also tested are \"git add -u\" without limiting, and \"git add -u\"\n without contents changes, and other conditions'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t2201-add-update-typechange.sh b/t/t2201-add-update-typechange.sh\nindex dba62d69c6c..687be974d41 100755\n--- a/t/t2201-add-update-typechange.sh\n+++ b/t/t2201-add-update-typechange.sh\n@@ -2,7 +2,6 @@\n \n test_description='more git add -u'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t2202-add-addremove.sh b/t/t2202-add-addremove.sh\nindex 24c60bfd790..9ee659098c4 100755\n--- a/t/t2202-add-addremove.sh\n+++ b/t/t2202-add-addremove.sh\n@@ -2,7 +2,6 @@\n \n test_description='git add --all'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t2203-add-intent.sh b/t/t2203-add-intent.sh\nindex 8fa44a92a27..192ad14b5f4 100755\n--- a/t/t2203-add-intent.sh\n+++ b/t/t2203-add-intent.sh\n@@ -2,7 +2,6 @@\n \n test_description='Intent to add'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'intent to add' '\ndiff --git a/t/t2204-add-ignored.sh b/t/t2204-add-ignored.sh\nindex b7cf1e492c1..31eb233df51 100755\n--- a/t/t2204-add-ignored.sh\n+++ b/t/t2204-add-ignored.sh\n@@ -2,7 +2,6 @@\n \n test_description='giving ignored paths to git add'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t2205-add-worktree-config.sh b/t/t2205-add-worktree-config.sh\nindex 98265ba1b49..43d950de640 100755\n--- a/t/t2205-add-worktree-config.sh\n+++ b/t/t2205-add-worktree-config.sh\n@@ -17,7 +17,6 @@ outside the repository.  Two instances for which this can occur are tested:\n \t   repository can be added to the index.\n \t'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success '1a: setup--config worktree' '\ndiff --git a/t/t2300-cd-to-toplevel.sh b/t/t2300-cd-to-toplevel.sh\nindex b40eeb263fe..c8de6d8a190 100755\n--- a/t/t2300-cd-to-toplevel.sh\n+++ b/t/t2300-cd-to-toplevel.sh\n@@ -2,7 +2,6 @@\n \n test_description='cd_to_toplevel'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n EXEC_PATH=\"$(git --exec-path)\"\ndiff --git a/t/t2400-worktree-add.sh b/t/t2400-worktree-add.sh\nindex cfc4aeb1798..ba320dc4171 100755\n--- a/t/t2400-worktree-add.sh\n+++ b/t/t2400-worktree-add.sh\n@@ -6,7 +6,6 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n TEST_CREATE_REPO_NO_TEMPLATE=1\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n . \"$TEST_DIRECTORY\"/lib-rebase.sh\ndiff --git a/t/t2401-worktree-prune.sh b/t/t2401-worktree-prune.sh\nindex 976d048e3ef..aa5b42c0f7b 100755\n--- a/t/t2401-worktree-prune.sh\n+++ b/t/t2401-worktree-prune.sh\n@@ -5,7 +5,6 @@ test_description='prune $GIT_DIR/worktrees'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success initialize '\ndiff --git a/t/t2402-worktree-list.sh b/t/t2402-worktree-list.sh\nindex 33ea9cb21ba..cb125ec2265 100755\n--- a/t/t2402-worktree-list.sh\n+++ b/t/t2402-worktree-list.sh\n@@ -5,7 +5,6 @@ test_description='test git worktree list'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2403-worktree-move.sh b/t/t2403-worktree-move.sh\nindex 901342ea09b..08531deb5b2 100755\n--- a/t/t2403-worktree-move.sh\n+++ b/t/t2403-worktree-move.sh\n@@ -2,7 +2,6 @@\n \n test_description='test git worktree move, remove, lock and unlock'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2404-worktree-config.sh b/t/t2404-worktree-config.sh\nindex 842937bfb9a..9536d109195 100755\n--- a/t/t2404-worktree-config.sh\n+++ b/t/t2404-worktree-config.sh\n@@ -2,7 +2,6 @@\n \n test_description=\"config file in multi worktree\"\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2405-worktree-submodule.sh b/t/t2405-worktree-submodule.sh\nindex 1d7f6056338..11018f37c70 100755\n--- a/t/t2405-worktree-submodule.sh\n+++ b/t/t2405-worktree-submodule.sh\n@@ -5,7 +5,6 @@ test_description='Combination of submodules and multiple worktrees'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n base_path=$(pwd -P)\ndiff --git a/t/t2406-worktree-repair.sh b/t/t2406-worktree-repair.sh\nindex 7686e60f6ad..bf340b87726 100755\n--- a/t/t2406-worktree-repair.sh\n+++ b/t/t2406-worktree-repair.sh\n@@ -2,7 +2,6 @@\n \n test_description='test git worktree repair'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t2407-worktree-heads.sh b/t/t2407-worktree-heads.sh\nindex 7750dc9265a..57c201869f0 100755\n--- a/t/t2407-worktree-heads.sh\n+++ b/t/t2407-worktree-heads.sh\n@@ -2,7 +2,6 @@\n \n test_description='test operations trying to overwrite refs at worktree HEAD'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2408-worktree-relative.sh b/t/t2408-worktree-relative.sh\nindex a3136db7e28..d51cc8c5ab7 100755\n--- a/t/t2408-worktree-relative.sh\n+++ b/t/t2408-worktree-relative.sh\n@@ -2,7 +2,6 @@\n \n test_description='test worktrees linked with relative paths'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'links worktrees with relative paths' '\ndiff --git a/t/t2500-untracked-overwriting.sh b/t/t2500-untracked-overwriting.sh\nindex 714feb83be5..5c0bf4d21fc 100755\n--- a/t/t2500-untracked-overwriting.sh\n+++ b/t/t2500-untracked-overwriting.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test handling of overwriting untracked files'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_setup_reset () {\ndiff --git a/t/t2501-cwd-empty.sh b/t/t2501-cwd-empty.sh\nindex 8af4e8cfe3c..f6d8d7d03d7 100755\n--- a/t/t2501-cwd-empty.sh\n+++ b/t/t2501-cwd-empty.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test handling of the current working directory becoming empty'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3000-ls-files-others.sh b/t/t3000-ls-files-others.sh\nindex 11af4552f74..13f66fd649d 100755\n--- a/t/t3000-ls-files-others.sh\n+++ b/t/t3000-ls-files-others.sh\n@@ -16,7 +16,6 @@ filesystem.\n     path4       - an empty directory\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup ' '\ndiff --git a/t/t3001-ls-files-others-exclude.sh b/t/t3001-ls-files-others-exclude.sh\nindex 1ed0aa967ec..4b676462852 100755\n--- a/t/t3001-ls-files-others-exclude.sh\n+++ b/t/t3001-ls-files-others-exclude.sh\n@@ -8,7 +8,6 @@ test_description='git ls-files --others --exclude\n This test runs git ls-files --others and tests --exclude patterns.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n rm -fr one three\ndiff --git a/t/t3002-ls-files-dashpath.sh b/t/t3002-ls-files-dashpath.sh\nindex 4dd24550eba..31462cb441e 100755\n--- a/t/t3002-ls-files-dashpath.sh\n+++ b/t/t3002-ls-files-dashpath.sh\n@@ -13,7 +13,6 @@ filesystem.\n     --\t\t- another file with a funny name.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3003-ls-files-exclude.sh b/t/t3003-ls-files-exclude.sh\nindex 7933dff9b38..ac3c811f464 100755\n--- a/t/t3003-ls-files-exclude.sh\n+++ b/t/t3003-ls-files-exclude.sh\n@@ -2,7 +2,6 @@\n \n test_description='ls-files --exclude does not affect index files'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'create repo with file' '\ndiff --git a/t/t3004-ls-files-basic.sh b/t/t3004-ls-files-basic.sh\nindex 12e41a7b40e..a1078f8701d 100755\n--- a/t/t3004-ls-files-basic.sh\n+++ b/t/t3004-ls-files-basic.sh\n@@ -6,7 +6,6 @@ This test runs git ls-files with various unusual or malformed\n command-line arguments.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'ls-files in empty repository' '\ndiff --git a/t/t3005-ls-files-relative.sh b/t/t3005-ls-files-relative.sh\nindex fbfa210a50b..db13aabf625 100755\n--- a/t/t3005-ls-files-relative.sh\n+++ b/t/t3005-ls-files-relative.sh\n@@ -5,7 +5,6 @@ test_description='ls-files tests with relative paths\n This test runs git ls-files with various relative path arguments.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'prepare' '\ndiff --git a/t/t3006-ls-files-long.sh b/t/t3006-ls-files-long.sh\nindex 2aaf91ebc8c..22c7256c3ae 100755\n--- a/t/t3006-ls-files-long.sh\n+++ b/t/t3006-ls-files-long.sh\n@@ -2,7 +2,6 @@\n \n test_description='overly long paths'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3007-ls-files-recurse-submodules.sh b/t/t3007-ls-files-recurse-submodules.sh\nindex f04bdc8c78b..61771eec830 100755\n--- a/t/t3007-ls-files-recurse-submodules.sh\n+++ b/t/t3007-ls-files-recurse-submodules.sh\n@@ -6,7 +6,6 @@ This test verifies the recurse-submodules feature correctly lists files from\n submodules.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup directory structure and submodules' '\ndiff --git a/t/t3008-ls-files-lazy-init-name-hash.sh b/t/t3008-ls-files-lazy-init-name-hash.sh\nindex 51d3dffaa66..85f37049587 100755\n--- a/t/t3008-ls-files-lazy-init-name-hash.sh\n+++ b/t/t3008-ls-files-lazy-init-name-hash.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test the lazy init name hash with various folder structures'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n if test 1 -eq $(test-tool online-cpus)\ndiff --git a/t/t3009-ls-files-others-nonsubmodule.sh b/t/t3009-ls-files-others-nonsubmodule.sh\nindex 14218b34243..963f3462b75 100755\n--- a/t/t3009-ls-files-others-nonsubmodule.sh\n+++ b/t/t3009-ls-files-others-nonsubmodule.sh\n@@ -18,7 +18,6 @@ This test runs git ls-files --others with the following working tree:\n       git repository with a commit and an untracked file\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup: directories' '\ndiff --git a/t/t3010-ls-files-killed-modified.sh b/t/t3010-ls-files-killed-modified.sh\nindex 054178703d7..7af4532cd1d 100755\n--- a/t/t3010-ls-files-killed-modified.sh\n+++ b/t/t3010-ls-files-killed-modified.sh\n@@ -42,7 +42,6 @@ We should report path0, path1, path2/file2, path3/file3, path7 and path8\n modified without reporting path9 and path10.  submod1 is also modified.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'git update-index --add to add various paths.' '\ndiff --git a/t/t3011-common-prefixes-and-directory-traversal.sh b/t/t3011-common-prefixes-and-directory-traversal.sh\nindex 69e44c387fa..3da5b2b6e79 100755\n--- a/t/t3011-common-prefixes-and-directory-traversal.sh\n+++ b/t/t3011-common-prefixes-and-directory-traversal.sh\n@@ -2,7 +2,6 @@\n \n test_description='directory traversal handling, especially with common prefixes'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3012-ls-files-dedup.sh b/t/t3012-ls-files-dedup.sh\nindex 190e2f6eed7..2682b1f43a6 100755\n--- a/t/t3012-ls-files-dedup.sh\n+++ b/t/t3012-ls-files-dedup.sh\n@@ -2,7 +2,6 @@\n \n test_description='git ls-files --deduplicate test'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3013-ls-files-format.sh b/t/t3013-ls-files-format.sh\nindex 6e6ea0b6f3c..8bdaacd85ac 100755\n--- a/t/t3013-ls-files-format.sh\n+++ b/t/t3013-ls-files-format.sh\n@@ -2,7 +2,6 @@\n \n test_description='git ls-files --format test'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n for flag in -s -o -k -t --resolve-undo --deduplicate --eol\ndiff --git a/t/t3020-ls-files-error-unmatch.sh b/t/t3020-ls-files-error-unmatch.sh\nindex 133593d23c0..ac82c9cee8a 100755\n--- a/t/t3020-ls-files-error-unmatch.sh\n+++ b/t/t3020-ls-files-error-unmatch.sh\n@@ -10,7 +10,6 @@ returns an error when a non-existent path is provided on the command\n line.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3040-subprojects-basic.sh b/t/t3040-subprojects-basic.sh\nindex bd65dfcffc7..768d702fbbf 100755\n--- a/t/t3040-subprojects-basic.sh\n+++ b/t/t3040-subprojects-basic.sh\n@@ -2,7 +2,6 @@\n \n test_description='Basic subproject functionality'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup: create superproject' '\ndiff --git a/t/t3050-subprojects-fetch.sh b/t/t3050-subprojects-fetch.sh\nindex 38846941655..f1f09abdd9b 100755\n--- a/t/t3050-subprojects-fetch.sh\n+++ b/t/t3050-subprojects-fetch.sh\n@@ -2,7 +2,6 @@\n \n test_description='fetching and pushing project with subproject'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3060-ls-files-with-tree.sh b/t/t3060-ls-files-with-tree.sh\nindex 5a06732ca73..eb69da61fe7 100755\n--- a/t/t3060-ls-files-with-tree.sh\n+++ b/t/t3060-ls-files-with-tree.sh\n@@ -9,7 +9,6 @@ This test runs git ls-files --with-tree and in particular in\n a scenario known to trigger a crash with some versions of git.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3070-wildmatch.sh b/t/t3070-wildmatch.sh\nindex 4dd42df38c2..3da824117c6 100755\n--- a/t/t3070-wildmatch.sh\n+++ b/t/t3070-wildmatch.sh\n@@ -2,7 +2,6 @@\n \n test_description='wildmatch tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n should_create_test_file() {\ndiff --git a/t/t3100-ls-tree-restrict.sh b/t/t3100-ls-tree-restrict.sh\nindex 436de44971e..8f294d98326 100755\n--- a/t/t3100-ls-tree-restrict.sh\n+++ b/t/t3100-ls-tree-restrict.sh\n@@ -17,7 +17,6 @@ The new path restriction code should do the right thing for path2 and\n path2/baz.  Also path0/ should snow nothing.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success \\\ndiff --git a/t/t3101-ls-tree-dirname.sh b/t/t3101-ls-tree-dirname.sh\nindex 5af2dac0e4b..ac44525810f 100755\n--- a/t/t3101-ls-tree-dirname.sh\n+++ b/t/t3101-ls-tree-dirname.sh\n@@ -20,7 +20,6 @@ Test the handling of multiple directories which have matching file\n entries.  Also test odd filename and missing entries handling.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3102-ls-tree-wildcards.sh b/t/t3102-ls-tree-wildcards.sh\nindex 3942db22900..1e16c6b8ea6 100755\n--- a/t/t3102-ls-tree-wildcards.sh\n+++ b/t/t3102-ls-tree-wildcards.sh\n@@ -2,7 +2,6 @@\n \n test_description='ls-tree with(out) globs'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3103-ls-tree-misc.sh b/t/t3103-ls-tree-misc.sh\nindex 81c63439623..e7636f6908f 100755\n--- a/t/t3103-ls-tree-misc.sh\n+++ b/t/t3103-ls-tree-misc.sh\n@@ -7,7 +7,6 @@ Miscellaneous tests for git ls-tree.\n \n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3104-ls-tree-format.sh b/t/t3104-ls-tree-format.sh\nindex 3adb206a93b..a1b2069a256 100755\n--- a/t/t3104-ls-tree-format.sh\n+++ b/t/t3104-ls-tree-format.sh\n@@ -2,7 +2,6 @@\n \n test_description='ls-tree --format'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-t3100.sh\n \ndiff --git a/t/t3105-ls-tree-output.sh b/t/t3105-ls-tree-output.sh\nindex ce2391e28be..8bdf400682d 100755\n--- a/t/t3105-ls-tree-output.sh\n+++ b/t/t3105-ls-tree-output.sh\n@@ -2,7 +2,6 @@\n \n test_description='ls-tree output'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-t3100.sh\n \ndiff --git a/t/t3200-branch.sh b/t/t3200-branch.sh\nindex ccfa6a720d0..2295db3dcb0 100755\n--- a/t/t3200-branch.sh\n+++ b/t/t3200-branch.sh\n@@ -8,7 +8,6 @@ test_description='git branch assorted tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n \ndiff --git a/t/t3201-branch-contains.sh b/t/t3201-branch-contains.sh\nindex 6e587d27d7a..800fc33165a 100755\n--- a/t/t3201-branch-contains.sh\n+++ b/t/t3201-branch-contains.sh\n@@ -2,7 +2,6 @@\n \n test_description='branch --contains <commit>, --no-contains <commit> --merged, and --no-merged'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3202-show-branch.sh b/t/t3202-show-branch.sh\nindex 3b6dad0c466..a1139f79e2c 100755\n--- a/t/t3202-show-branch.sh\n+++ b/t/t3202-show-branch.sh\n@@ -2,7 +2,6 @@\n \n test_description='test show-branch'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'error descriptions on empty repository' '\ndiff --git a/t/t3203-branch-output.sh b/t/t3203-branch-output.sh\nindex e627f08a179..500c9d0e727 100755\n--- a/t/t3203-branch-output.sh\n+++ b/t/t3203-branch-output.sh\n@@ -2,7 +2,6 @@\n \n test_description='git branch display tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-terminal.sh\n \ndiff --git a/t/t3204-branch-name-interpretation.sh b/t/t3204-branch-name-interpretation.sh\nindex 594e3e43e12..3399344f25d 100755\n--- a/t/t3204-branch-name-interpretation.sh\n+++ b/t/t3204-branch-name-interpretation.sh\n@@ -9,7 +9,6 @@ This script aims to check the behavior of those corner cases.\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n expect_branch() {\ndiff --git a/t/t3205-branch-color.sh b/t/t3205-branch-color.sh\nindex 0b61da92b37..da1c202fa71 100755\n--- a/t/t3205-branch-color.sh\n+++ b/t/t3205-branch-color.sh\n@@ -1,7 +1,6 @@\n #!/bin/sh\n \n test_description='basic branch output coloring'\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'set up some sample branches' '\ndiff --git a/t/t3206-range-diff.sh b/t/t3206-range-diff.sh\nindex 86010931ab6..d2ca43d6aab 100755\n--- a/t/t3206-range-diff.sh\n+++ b/t/t3206-range-diff.sh\n@@ -5,7 +5,6 @@ test_description='range-diff tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Note that because of the range-diff's heuristics, test_commit does more\ndiff --git a/t/t3207-branch-submodule.sh b/t/t3207-branch-submodule.sh\nindex 904eea7df59..fe72b247164 100755\n--- a/t/t3207-branch-submodule.sh\n+++ b/t/t3207-branch-submodule.sh\n@@ -5,7 +5,6 @@ test_description='git branch submodule tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n \ndiff --git a/t/t3211-peel-ref.sh b/t/t3211-peel-ref.sh\nindex 9cbc34fc583..37b9d26f4b6 100755\n--- a/t/t3211-peel-ref.sh\n+++ b/t/t3211-peel-ref.sh\n@@ -4,7 +4,6 @@ test_description='tests for the peel_ref optimization of packed-refs'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'create annotated tag in refs/tags' '\ndiff --git a/t/t3300-funny-names.sh b/t/t3300-funny-names.sh\nindex d3ac826283e..f5bf16abcd8 100755\n--- a/t/t3300-funny-names.sh\n+++ b/t/t3300-funny-names.sh\n@@ -9,7 +9,6 @@ This test tries pathnames with funny characters in the working\n tree, index, and tree objects.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n HT='\t'\ndiff --git a/t/t3301-notes.sh b/t/t3301-notes.sh\nindex 813dfd8db97..d6c50460d08 100755\n--- a/t/t3301-notes.sh\n+++ b/t/t3301-notes.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test commit notes'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n write_script fake_editor <<\\EOF\ndiff --git a/t/t3302-notes-index-expensive.sh b/t/t3302-notes-index-expensive.sh\nindex d0c4d38b4d4..bb5fea02a03 100755\n--- a/t/t3302-notes-index-expensive.sh\n+++ b/t/t3302-notes-index-expensive.sh\n@@ -8,7 +8,6 @@ test_description='Test commit notes index (expensive!)'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n create_repo () {\ndiff --git a/t/t3303-notes-subtrees.sh b/t/t3303-notes-subtrees.sh\nindex bc9b791d1b9..eac193757bf 100755\n--- a/t/t3303-notes-subtrees.sh\n+++ b/t/t3303-notes-subtrees.sh\n@@ -5,7 +5,6 @@ test_description='Test commit notes organized in subtrees'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n number_of_commits=100\ndiff --git a/t/t3304-notes-mixed.sh b/t/t3304-notes-mixed.sh\nindex 2c3a2452668..03dfcd3954c 100755\n--- a/t/t3304-notes-mixed.sh\n+++ b/t/t3304-notes-mixed.sh\n@@ -5,7 +5,6 @@ test_description='Test notes trees that also contain non-notes'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n number_of_commits=100\ndiff --git a/t/t3305-notes-fanout.sh b/t/t3305-notes-fanout.sh\nindex 1ec1fb6715e..fcecdc94ff7 100755\n--- a/t/t3305-notes-fanout.sh\n+++ b/t/t3305-notes-fanout.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test that adding/removing many notes triggers automatic fanout restructuring'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n path_has_fanout() {\ndiff --git a/t/t3306-notes-prune.sh b/t/t3306-notes-prune.sh\nindex b6e9f643e3c..8f4102ff9e4 100755\n--- a/t/t3306-notes-prune.sh\n+++ b/t/t3306-notes-prune.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test git notes prune'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup: create a few commits with notes' '\ndiff --git a/t/t3307-notes-man.sh b/t/t3307-notes-man.sh\nindex ae316502c45..1aa366a410e 100755\n--- a/t/t3307-notes-man.sh\n+++ b/t/t3307-notes-man.sh\n@@ -4,7 +4,6 @@ test_description='Examples from the git-notes man page\n \n Make sure the manual is not full of lies.'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3308-notes-merge.sh b/t/t3308-notes-merge.sh\nindex e1d05ff6bc9..202702be1a7 100755\n--- a/t/t3308-notes-merge.sh\n+++ b/t/t3308-notes-merge.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test merging of notes trees'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3309-notes-merge-auto-resolve.sh b/t/t3309-notes-merge-auto-resolve.sh\nindex f55277f499d..9bd5dbf341f 100755\n--- a/t/t3309-notes-merge-auto-resolve.sh\n+++ b/t/t3309-notes-merge-auto-resolve.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test notes merging with auto-resolving strategies'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Set up a notes merge scenario with all kinds of potential conflicts\ndiff --git a/t/t3310-notes-merge-manual-resolve.sh b/t/t3310-notes-merge-manual-resolve.sh\nindex 04866b89bed..597df5ebc0a 100755\n--- a/t/t3310-notes-merge-manual-resolve.sh\n+++ b/t/t3310-notes-merge-manual-resolve.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test notes merging with manual conflict resolution'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Set up a notes merge scenario with different kinds of conflicts\ndiff --git a/t/t3311-notes-merge-fanout.sh b/t/t3311-notes-merge-fanout.sh\nindex ce4144db0f2..5b675417e9b 100755\n--- a/t/t3311-notes-merge-fanout.sh\n+++ b/t/t3311-notes-merge-fanout.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test notes merging at various fanout levels'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n verify_notes () {\ndiff --git a/t/t3320-notes-merge-worktrees.sh b/t/t3320-notes-merge-worktrees.sh\nindex 0fd33280cf9..96243b72222 100755\n--- a/t/t3320-notes-merge-worktrees.sh\n+++ b/t/t3320-notes-merge-worktrees.sh\n@@ -8,7 +8,6 @@ test_description='Test merging of notes trees in multiple worktrees'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup commit' '\ndiff --git a/t/t3321-notes-stripspace.sh b/t/t3321-notes-stripspace.sh\nindex beca3460567..c4a7839540a 100755\n--- a/t/t3321-notes-stripspace.sh\n+++ b/t/t3321-notes-stripspace.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test commit notes with stripspace behavior'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n MULTI_LF=\"$LF$LF$LF\"\ndiff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh\nindex 09f230eefb2..bab675938a3 100755\n--- a/t/t3400-rebase.sh\n+++ b/t/t3400-rebase.sh\n@@ -11,7 +11,6 @@ among other things.\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n GIT_AUTHOR_NAME=author@name\ndiff --git a/t/t3401-rebase-and-am-rename.sh b/t/t3401-rebase-and-am-rename.sh\nindex 328c1d3a3f4..f18bae94507 100755\n--- a/t/t3401-rebase-and-am-rename.sh\n+++ b/t/t3401-rebase-and-am-rename.sh\n@@ -2,7 +2,6 @@\n \n test_description='git rebase + directory rename tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n \ndiff --git a/t/t3402-rebase-merge.sh b/t/t3402-rebase-merge.sh\nindex 5c67d07ba3e..761de63b6b9 100755\n--- a/t/t3402-rebase-merge.sh\n+++ b/t/t3402-rebase-merge.sh\n@@ -8,7 +8,6 @@ test_description='git rebase --merge test'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n T=\"A quick brown fox\ndiff --git a/t/t3403-rebase-skip.sh b/t/t3403-rebase-skip.sh\nindex 4f1d6e8ea64..a1911c4a9d6 100755\n--- a/t/t3403-rebase-skip.sh\n+++ b/t/t3403-rebase-skip.sh\n@@ -8,7 +8,6 @@ test_description='git rebase --merge --skip tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n . \"$TEST_DIRECTORY\"/lib-rebase.sh\ndiff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh\nindex 77cceda14a0..b11f04eb334 100755\n--- a/t/t3404-rebase-interactive.sh\n+++ b/t/t3404-rebase-interactive.sh\n@@ -26,7 +26,6 @@ Initial setup:\n  touch file \"conflict\".\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n . \"$TEST_DIRECTORY\"/lib-rebase.sh\ndiff --git a/t/t3405-rebase-malformed.sh b/t/t3405-rebase-malformed.sh\nindex 8979bc34073..25243318618 100755\n--- a/t/t3405-rebase-malformed.sh\n+++ b/t/t3405-rebase-malformed.sh\n@@ -5,7 +5,6 @@ test_description='rebase should handle arbitrary git message'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n \ndiff --git a/t/t3406-rebase-message.sh b/t/t3406-rebase-message.sh\nindex 82108b67e67..a1d7fa7f7c6 100755\n--- a/t/t3406-rebase-message.sh\n+++ b/t/t3406-rebase-message.sh\n@@ -5,7 +5,6 @@ test_description='messages from rebase operation'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3407-rebase-abort.sh b/t/t3407-rebase-abort.sh\nindex 2c3f38d45a8..9f49c4228b6 100755\n--- a/t/t3407-rebase-abort.sh\n+++ b/t/t3407-rebase-abort.sh\n@@ -5,7 +5,6 @@ test_description='git rebase --abort tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3408-rebase-multi-line.sh b/t/t3408-rebase-multi-line.sh\nindex 7b4607d72f2..cde3562e3a6 100755\n--- a/t/t3408-rebase-multi-line.sh\n+++ b/t/t3408-rebase-multi-line.sh\n@@ -5,7 +5,6 @@ test_description='rebasing a commit with multi-line first paragraph.'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3409-rebase-environ.sh b/t/t3409-rebase-environ.sh\nindex acaf5558dbe..83ffb39d9ff 100755\n--- a/t/t3409-rebase-environ.sh\n+++ b/t/t3409-rebase-environ.sh\n@@ -2,7 +2,6 @@\n \n test_description='git rebase interactive environment'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3412-rebase-root.sh b/t/t3412-rebase-root.sh\nindex e75b3d0e07c..58371d8a547 100755\n--- a/t/t3412-rebase-root.sh\n+++ b/t/t3412-rebase-root.sh\n@@ -7,7 +7,6 @@ Tests if git rebase --root --onto <newparent> can rebase the root commit.\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n log_with_names () {\ndiff --git a/t/t3413-rebase-hook.sh b/t/t3413-rebase-hook.sh\nindex 426ff098e1d..b4ff614987e 100755\n--- a/t/t3413-rebase-hook.sh\n+++ b/t/t3413-rebase-hook.sh\n@@ -5,7 +5,6 @@ test_description='git rebase with its hook(s)'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3415-rebase-autosquash.sh b/t/t3415-rebase-autosquash.sh\nindex 22452ff84cb..fcc40d6fe1f 100755\n--- a/t/t3415-rebase-autosquash.sh\n+++ b/t/t3415-rebase-autosquash.sh\n@@ -5,7 +5,6 @@ test_description='auto squash'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n . \"$TEST_DIRECTORY\"/lib-rebase.sh\ndiff --git a/t/t3416-rebase-onto-threedots.sh b/t/t3416-rebase-onto-threedots.sh\nindex f8c4ed78c9e..ea501f2b42b 100755\n--- a/t/t3416-rebase-onto-threedots.sh\n+++ b/t/t3416-rebase-onto-threedots.sh\n@@ -5,7 +5,6 @@ test_description='git rebase --onto A...B'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY/lib-rebase.sh\"\n \ndiff --git a/t/t3417-rebase-whitespace-fix.sh b/t/t3417-rebase-whitespace-fix.sh\nindex 22ee3a20459..96f2cf22faf 100755\n--- a/t/t3417-rebase-whitespace-fix.sh\n+++ b/t/t3417-rebase-whitespace-fix.sh\n@@ -5,7 +5,6 @@ test_description='git rebase --whitespace=fix\n This test runs git rebase --whitespace=fix and make sure that it works.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # prepare initial revision of \"file\" with a blank line at the end\ndiff --git a/t/t3418-rebase-continue.sh b/t/t3418-rebase-continue.sh\nindex c0d29c2154f..127216f7225 100755\n--- a/t/t3418-rebase-continue.sh\n+++ b/t/t3418-rebase-continue.sh\n@@ -5,7 +5,6 @@ test_description='git rebase --continue tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n . \"$TEST_DIRECTORY\"/lib-rebase.sh\ndiff --git a/t/t3419-rebase-patch-id.sh b/t/t3419-rebase-patch-id.sh\nindex 6c61f240cf9..7181f176b81 100755\n--- a/t/t3419-rebase-patch-id.sh\n+++ b/t/t3419-rebase-patch-id.sh\n@@ -5,7 +5,6 @@ test_description='git rebase - test patch id computation'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n scramble () {\ndiff --git a/t/t3420-rebase-autostash.sh b/t/t3420-rebase-autostash.sh\nindex b43046b3b0d..ad3ba6a9848 100755\n--- a/t/t3420-rebase-autostash.sh\n+++ b/t/t3420-rebase-autostash.sh\n@@ -7,7 +7,6 @@ test_description='git rebase --autostash tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3421-rebase-topology-linear.sh b/t/t3421-rebase-topology-linear.sh\nindex 737af80bb3d..f5b7807abd0 100755\n--- a/t/t3421-rebase-topology-linear.sh\n+++ b/t/t3421-rebase-topology-linear.sh\n@@ -2,7 +2,6 @@\n \n test_description='basic rebase topology tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n \ndiff --git a/t/t3422-rebase-incompatible-options.sh b/t/t3422-rebase-incompatible-options.sh\nindex b40f26250b7..b9408f9ba12 100755\n--- a/t/t3422-rebase-incompatible-options.sh\n+++ b/t/t3422-rebase-incompatible-options.sh\n@@ -2,7 +2,6 @@\n \n test_description='test if rebase detects and aborts on incompatible options'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3423-rebase-reword.sh b/t/t3423-rebase-reword.sh\nindex 2fab703d615..4859bb8f722 100755\n--- a/t/t3423-rebase-reword.sh\n+++ b/t/t3423-rebase-reword.sh\n@@ -2,7 +2,6 @@\n \n test_description='git rebase interactive with rewording'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n . \"$TEST_DIRECTORY\"/lib-rebase.sh\ndiff --git a/t/t3424-rebase-empty.sh b/t/t3424-rebase-empty.sh\nindex 515c949ae37..1ee6b00fd57 100755\n--- a/t/t3424-rebase-empty.sh\n+++ b/t/t3424-rebase-empty.sh\n@@ -2,7 +2,6 @@\n \n test_description='git rebase of commits that start or become empty'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup test repository' '\ndiff --git a/t/t3425-rebase-topology-merges.sh b/t/t3425-rebase-topology-merges.sh\nindex a16428bdf54..675491234a6 100755\n--- a/t/t3425-rebase-topology-merges.sh\n+++ b/t/t3425-rebase-topology-merges.sh\n@@ -2,7 +2,6 @@\n \n test_description='rebase topology tests with merges'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n \ndiff --git a/t/t3426-rebase-submodule.sh b/t/t3426-rebase-submodule.sh\nindex 94ea88e384e..ba069dccbdf 100755\n--- a/t/t3426-rebase-submodule.sh\n+++ b/t/t3426-rebase-submodule.sh\n@@ -2,7 +2,6 @@\n \n test_description='rebase can handle submodules'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-submodule-update.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\ndiff --git a/t/t3427-rebase-subtree.sh b/t/t3427-rebase-subtree.sh\nindex 5e9046e3df3..1b3e97c8755 100755\n--- a/t/t3427-rebase-subtree.sh\n+++ b/t/t3427-rebase-subtree.sh\n@@ -7,7 +7,6 @@ This test runs git rebase and tests the subtree strategy.\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n \ndiff --git a/t/t3428-rebase-signoff.sh b/t/t3428-rebase-signoff.sh\nindex 365436ebfc3..6f57aed9fac 100755\n--- a/t/t3428-rebase-signoff.sh\n+++ b/t/t3428-rebase-signoff.sh\n@@ -5,7 +5,6 @@ test_description='git rebase --signoff\n This test runs git rebase --signoff and make sure that it works.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n \ndiff --git a/t/t3429-rebase-edit-todo.sh b/t/t3429-rebase-edit-todo.sh\nindex 8e0d03969a2..abd66f36021 100755\n--- a/t/t3429-rebase-edit-todo.sh\n+++ b/t/t3429-rebase-edit-todo.sh\n@@ -2,7 +2,6 @@\n \n test_description='rebase should reread the todo file if an exec modifies it'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n \ndiff --git a/t/t3430-rebase-merges.sh b/t/t3430-rebase-merges.sh\nindex cb891eeb5fd..2593711fecd 100755\n--- a/t/t3430-rebase-merges.sh\n+++ b/t/t3430-rebase-merges.sh\n@@ -21,7 +21,6 @@ Initial setup:\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n . \"$TEST_DIRECTORY\"/lib-log-graph.sh\ndiff --git a/t/t3431-rebase-fork-point.sh b/t/t3431-rebase-fork-point.sh\nindex 7b9c135c6e2..be09fc78c16 100755\n--- a/t/t3431-rebase-fork-point.sh\n+++ b/t/t3431-rebase-fork-point.sh\n@@ -8,7 +8,6 @@ test_description='git rebase --fork-point test'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # A---B---D---E    (main)\ndiff --git a/t/t3432-rebase-fast-forward.sh b/t/t3432-rebase-fast-forward.sh\nindex 7f1a5dd3deb..5086e14c022 100755\n--- a/t/t3432-rebase-fast-forward.sh\n+++ b/t/t3432-rebase-fast-forward.sh\n@@ -8,7 +8,6 @@ test_description='ensure rebase fast-forwards commits when possible'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3433-rebase-across-mode-change.sh b/t/t3433-rebase-across-mode-change.sh\nindex c8172b08522..05df964670f 100755\n--- a/t/t3433-rebase-across-mode-change.sh\n+++ b/t/t3433-rebase-across-mode-change.sh\n@@ -2,7 +2,6 @@\n \n test_description='git rebase across mode change'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3434-rebase-i18n.sh b/t/t3434-rebase-i18n.sh\nindex 97fc9a23f21..8c94fdffc43 100755\n--- a/t/t3434-rebase-i18n.sh\n+++ b/t/t3434-rebase-i18n.sh\n@@ -17,7 +17,6 @@ Initial setup:\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n if ! test_have_prereq ICONV\ndiff --git a/t/t3435-rebase-gpg-sign.sh b/t/t3435-rebase-gpg-sign.sh\nindex 6e329fea7c0..6aa2aeb628d 100755\n--- a/t/t3435-rebase-gpg-sign.sh\n+++ b/t/t3435-rebase-gpg-sign.sh\n@@ -8,7 +8,6 @@ test_description='test rebase --[no-]gpg-sign'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY/lib-rebase.sh\"\n . \"$TEST_DIRECTORY/lib-gpg.sh\"\ndiff --git a/t/t3436-rebase-more-options.sh b/t/t3436-rebase-more-options.sh\nindex 4d9744e5fc7..94671d3c465 100755\n--- a/t/t3436-rebase-more-options.sh\n+++ b/t/t3436-rebase-more-options.sh\n@@ -5,7 +5,6 @@\n \n test_description='tests to ensure compatibility between am and interactive backends'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n . \"$TEST_DIRECTORY\"/lib-rebase.sh\ndiff --git a/t/t3437-rebase-fixup-options.sh b/t/t3437-rebase-fixup-options.sh\nindex 7929e2e2e3a..6f9307e0e3c 100755\n--- a/t/t3437-rebase-fixup-options.sh\n+++ b/t/t3437-rebase-fixup-options.sh\n@@ -14,7 +14,6 @@ to the \"fixup\" command that works with \"fixup!\", \"fixup -C\" works with\n \"amend!\" upon --autosquash.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n . \"$TEST_DIRECTORY\"/lib-rebase.sh\ndiff --git a/t/t3438-rebase-broken-files.sh b/t/t3438-rebase-broken-files.sh\nindex 821f08e5afb..78d42f4c799 100755\n--- a/t/t3438-rebase-broken-files.sh\n+++ b/t/t3438-rebase-broken-files.sh\n@@ -2,7 +2,6 @@\n \n test_description='rebase behavior when on-disk files are broken'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'set up conflicting branches' '\ndiff --git a/t/t3500-cherry.sh b/t/t3500-cherry.sh\nindex 61ca87512d5..78c3eac54b5 100755\n--- a/t/t3500-cherry.sh\n+++ b/t/t3500-cherry.sh\n@@ -11,7 +11,6 @@ checks that git cherry only returns the second patch in the local branch\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n GIT_AUTHOR_EMAIL=bogus_email_address\ndiff --git a/t/t3501-revert-cherry-pick.sh b/t/t3501-revert-cherry-pick.sh\nindex 411027fb58c..17a99379625 100755\n--- a/t/t3501-revert-cherry-pick.sh\n+++ b/t/t3501-revert-cherry-pick.sh\n@@ -5,7 +5,6 @@ test_description='miscellaneous basic tests for cherry-pick and revert'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3502-cherry-pick-merge.sh b/t/t3502-cherry-pick-merge.sh\nindex 1b2c0d6aca6..5495eacfec1 100755\n--- a/t/t3502-cherry-pick-merge.sh\n+++ b/t/t3502-cherry-pick-merge.sh\n@@ -11,7 +11,6 @@ test_description='cherry picking and reverting a merge\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3503-cherry-pick-root.sh b/t/t3503-cherry-pick-root.sh\nindex 76d393dc8a3..95fe4feaeee 100755\n--- a/t/t3503-cherry-pick-root.sh\n+++ b/t/t3503-cherry-pick-root.sh\n@@ -5,7 +5,6 @@ test_description='test cherry-picking (and reverting) a root commit'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3504-cherry-pick-rerere.sh b/t/t3504-cherry-pick-rerere.sh\nindex 109016eba92..18aeba161c0 100755\n--- a/t/t3504-cherry-pick-rerere.sh\n+++ b/t/t3504-cherry-pick-rerere.sh\n@@ -5,7 +5,6 @@ test_description='cherry-pick should rerere for conflicts'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3505-cherry-pick-empty.sh b/t/t3505-cherry-pick-empty.sh\nindex ead3fb46807..9748443530c 100755\n--- a/t/t3505-cherry-pick-empty.sh\n+++ b/t/t3505-cherry-pick-empty.sh\n@@ -5,7 +5,6 @@ test_description='test cherry-picking an empty commit'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3506-cherry-pick-ff.sh b/t/t3506-cherry-pick-ff.sh\nindex b71bad17b85..7e11bd4a4c5 100755\n--- a/t/t3506-cherry-pick-ff.sh\n+++ b/t/t3506-cherry-pick-ff.sh\n@@ -5,7 +5,6 @@ test_description='test cherry-picking with --ff option'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3507-cherry-pick-conflict.sh b/t/t3507-cherry-pick-conflict.sh\nindex 10e9c91dbbd..f3947b400a3 100755\n--- a/t/t3507-cherry-pick-conflict.sh\n+++ b/t/t3507-cherry-pick-conflict.sh\n@@ -13,7 +13,6 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n TEST_CREATE_REPO_NO_TEMPLATE=1\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n pristine_detach () {\ndiff --git a/t/t3508-cherry-pick-many-commits.sh b/t/t3508-cherry-pick-many-commits.sh\nindex afa7727a4af..2d53ce754c5 100755\n--- a/t/t3508-cherry-pick-many-commits.sh\n+++ b/t/t3508-cherry-pick-many-commits.sh\n@@ -5,7 +5,6 @@ test_description='test cherry-picking many commits'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n check_head_differs_from() {\ndiff --git a/t/t3509-cherry-pick-merge-df.sh b/t/t3509-cherry-pick-merge-df.sh\nindex 171cc6d76b7..f4159246e1e 100755\n--- a/t/t3509-cherry-pick-merge-df.sh\n+++ b/t/t3509-cherry-pick-merge-df.sh\n@@ -4,7 +4,6 @@ test_description='Test cherry-pick with directory/file conflicts'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'Initialize repository' '\ndiff --git a/t/t3510-cherry-pick-sequence.sh b/t/t3510-cherry-pick-sequence.sh\nindex 93c725bac3c..7eb52b12edc 100755\n--- a/t/t3510-cherry-pick-sequence.sh\n+++ b/t/t3510-cherry-pick-sequence.sh\n@@ -12,7 +12,6 @@ test_description='Test cherry-pick continuation features\n \n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Repeat first match 10 times\ndiff --git a/t/t3511-cherry-pick-x.sh b/t/t3511-cherry-pick-x.sh\nindex dd5d92ef302..84a587daf3a 100755\n--- a/t/t3511-cherry-pick-x.sh\n+++ b/t/t3511-cherry-pick-x.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test cherry-pick -x and -s'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n pristine_detach () {\ndiff --git a/t/t3512-cherry-pick-submodule.sh b/t/t3512-cherry-pick-submodule.sh\nindex 9387a22a9e7..f22d1ddead1 100755\n--- a/t/t3512-cherry-pick-submodule.sh\n+++ b/t/t3512-cherry-pick-submodule.sh\n@@ -5,7 +5,6 @@ test_description='cherry-pick can handle submodules'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-submodule-update.sh\n \ndiff --git a/t/t3513-revert-submodule.sh b/t/t3513-revert-submodule.sh\nindex e178968b408..8bfe3ed2467 100755\n--- a/t/t3513-revert-submodule.sh\n+++ b/t/t3513-revert-submodule.sh\n@@ -2,7 +2,6 @@\n \n test_description='revert can handle submodules'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-submodule-update.sh\n \ndiff --git a/t/t3514-cherry-pick-revert-gpg.sh b/t/t3514-cherry-pick-revert-gpg.sh\nindex 133dc072178..5b2e250eaa5 100755\n--- a/t/t3514-cherry-pick-revert-gpg.sh\n+++ b/t/t3514-cherry-pick-revert-gpg.sh\n@@ -5,7 +5,6 @@\n \n test_description='test {cherry-pick,revert} --[no-]gpg-sign'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY/lib-gpg.sh\"\n \ndiff --git a/t/t3600-rm.sh b/t/t3600-rm.sh\nindex 31ac31d4bcd..98259e2adaa 100755\n--- a/t/t3600-rm.sh\n+++ b/t/t3600-rm.sh\n@@ -8,7 +8,6 @@ test_description='Test of the various options to git rm.'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Setup some files to be removed, some with funny characters\ndiff --git a/t/t3601-rm-pathspec-file.sh b/t/t3601-rm-pathspec-file.sh\nindex 7cef12981c4..31bd9960fcd 100755\n--- a/t/t3601-rm-pathspec-file.sh\n+++ b/t/t3601-rm-pathspec-file.sh\n@@ -2,7 +2,6 @@\n \n test_description='rm --pathspec-from-file'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_tick\ndiff --git a/t/t3602-rm-sparse-checkout.sh b/t/t3602-rm-sparse-checkout.sh\nindex fcdefba48cc..08580fd3dcc 100755\n--- a/t/t3602-rm-sparse-checkout.sh\n+++ b/t/t3602-rm-sparse-checkout.sh\n@@ -2,7 +2,6 @@\n \n test_description='git rm in sparse checked out working trees'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' \"\ndiff --git a/t/t3650-replay-basics.sh b/t/t3650-replay-basics.sh\nindex 12bd3db4cb7..389670262e4 100755\n--- a/t/t3650-replay-basics.sh\n+++ b/t/t3650-replay-basics.sh\n@@ -5,7 +5,6 @@ test_description='basic git replay tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n GIT_AUTHOR_NAME=author@name\ndiff --git a/t/t3700-add.sh b/t/t3700-add.sh\nindex 839c904745a..4c543a1a7e8 100755\n--- a/t/t3700-add.sh\n+++ b/t/t3700-add.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test of git add, including the -- option.'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n . \"$TEST_DIRECTORY\"/lib-unique-files.sh\ndiff --git a/t/t3701-add-interactive.sh b/t/t3701-add-interactive.sh\nindex 718438ffc7d..b8a05d95f3f 100755\n--- a/t/t3701-add-interactive.sh\n+++ b/t/t3701-add-interactive.sh\n@@ -4,7 +4,6 @@ test_description='add -i basic tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-terminal.sh\n \ndiff --git a/t/t3702-add-edit.sh b/t/t3702-add-edit.sh\nindex 82bfb2fd2ac..8bacacbac68 100755\n--- a/t/t3702-add-edit.sh\n+++ b/t/t3702-add-edit.sh\n@@ -5,7 +5,6 @@\n \n test_description='add -e basic tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n \ndiff --git a/t/t3703-add-magic-pathspec.sh b/t/t3703-add-magic-pathspec.sh\nindex d84071038e0..3ef525a559d 100755\n--- a/t/t3703-add-magic-pathspec.sh\n+++ b/t/t3703-add-magic-pathspec.sh\n@@ -2,7 +2,6 @@\n \n test_description='magic pathspec tests using git-add'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3704-add-pathspec-file.sh b/t/t3704-add-pathspec-file.sh\nindex 3aa59f6f639..b9c96e273fb 100755\n--- a/t/t3704-add-pathspec-file.sh\n+++ b/t/t3704-add-pathspec-file.sh\n@@ -2,7 +2,6 @@\n \n test_description='add --pathspec-from-file'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_tick\ndiff --git a/t/t3705-add-sparse-checkout.sh b/t/t3705-add-sparse-checkout.sh\nindex 6ae45a788d1..2bade9e804f 100755\n--- a/t/t3705-add-sparse-checkout.sh\n+++ b/t/t3705-add-sparse-checkout.sh\n@@ -2,7 +2,6 @@\n \n test_description='git add in sparse checked out working trees'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n SPARSE_ENTRY_BLOB=\"\"\ndiff --git a/t/t3800-mktag.sh b/t/t3800-mktag.sh\nindex d3e428ff46e..e3cf0ffbe59 100755\n--- a/t/t3800-mktag.sh\n+++ b/t/t3800-mktag.sh\n@@ -4,7 +4,6 @@\n \n test_description='git mktag: tag object verify test'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n ###########################################################\ndiff --git a/t/t3900-i18n-commit.sh b/t/t3900-i18n-commit.sh\nindex 9d4b5ab1f95..3c930ec202d 100755\n--- a/t/t3900-i18n-commit.sh\n+++ b/t/t3900-i18n-commit.sh\n@@ -5,7 +5,6 @@\n \n test_description='commit and log output encodings'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n if ! test_have_prereq ICONV\ndiff --git a/t/t3901-i18n-patch.sh b/t/t3901-i18n-patch.sh\nindex e0659c92935..f03601b49a9 100755\n--- a/t/t3901-i18n-patch.sh\n+++ b/t/t3901-i18n-patch.sh\n@@ -8,7 +8,6 @@ test_description='i18n settings and format-patch | am pipe'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n if ! test_have_prereq ICONV\ndiff --git a/t/t3902-quoted.sh b/t/t3902-quoted.sh\nindex 72a5a565e97..f528008c363 100755\n--- a/t/t3902-quoted.sh\n+++ b/t/t3902-quoted.sh\n@@ -5,7 +5,6 @@\n \n test_description='quoted output'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n FN='濱野'\ndiff --git a/t/t3903-stash.sh b/t/t3903-stash.sh\nindex c87592ee2f3..74666ff3e4b 100755\n--- a/t/t3903-stash.sh\n+++ b/t/t3903-stash.sh\n@@ -8,7 +8,6 @@ test_description='Test git stash'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-unique-files.sh\n \ndiff --git a/t/t3904-stash-patch.sh b/t/t3904-stash-patch.sh\nindex aa5019fd6c3..ae313e3c705 100755\n--- a/t/t3904-stash-patch.sh\n+++ b/t/t3904-stash-patch.sh\n@@ -2,7 +2,6 @@\n \n test_description='stash -p'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./lib-patch-mode.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3905-stash-include-untracked.sh b/t/t3905-stash-include-untracked.sh\nindex a1733f45c3a..1289ae3e07c 100755\n--- a/t/t3905-stash-include-untracked.sh\n+++ b/t/t3905-stash-include-untracked.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test git stash --include-untracked'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'stash save --include-untracked some dirty working directory' '\ndiff --git a/t/t3906-stash-submodule.sh b/t/t3906-stash-submodule.sh\nindex 0f61f01ef43..0f7348ec21b 100755\n--- a/t/t3906-stash-submodule.sh\n+++ b/t/t3906-stash-submodule.sh\n@@ -2,7 +2,6 @@\n \n test_description='stash can handle submodules'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-submodule-update.sh\n \ndiff --git a/t/t3907-stash-show-config.sh b/t/t3907-stash-show-config.sh\nindex 7a2eb98b864..10914bba7b3 100755\n--- a/t/t3907-stash-show-config.sh\n+++ b/t/t3907-stash-show-config.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test git stash show configuration.'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3908-stash-in-worktree.sh b/t/t3908-stash-in-worktree.sh\nindex 347a89b030b..2b2b366ef94 100755\n--- a/t/t3908-stash-in-worktree.sh\n+++ b/t/t3908-stash-in-worktree.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test git stash in a worktree'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3909-stash-pathspec-file.sh b/t/t3909-stash-pathspec-file.sh\nindex 83269d0eb4c..73f2dbdeb02 100755\n--- a/t/t3909-stash-pathspec-file.sh\n+++ b/t/t3909-stash-pathspec-file.sh\n@@ -2,7 +2,6 @@\n \n test_description='stash --pathspec-from-file'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_tick\ndiff --git a/t/t3920-crlf-messages.sh b/t/t3920-crlf-messages.sh\nindex 31877f00c77..e2e1251a057 100755\n--- a/t/t3920-crlf-messages.sh\n+++ b/t/t3920-crlf-messages.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test ref-filter and pretty APIs for commit and tag messages using CRLF'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n LIB_CRLF_BRANCHES=\"\"\ndiff --git a/t/t4000-diff-format.sh b/t/t4000-diff-format.sh\nindex 8d50331b8c8..a51f881b1c9 100755\n--- a/t/t4000-diff-format.sh\n+++ b/t/t4000-diff-format.sh\n@@ -10,7 +10,6 @@ same command line parser, so testing one should be sufficient; pick\n diff-files as a representative.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-diff.sh\n \ndiff --git a/t/t4001-diff-rename.sh b/t/t4001-diff-rename.sh\nindex cd1931dd555..4f520d600de 100755\n--- a/t/t4001-diff-rename.sh\n+++ b/t/t4001-diff-rename.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test rename detection in diff engine.'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-diff.sh\n \ndiff --git a/t/t4002-diff-basic.sh b/t/t4002-diff-basic.sh\nindex cb3307010c1..e44648e6f3d 100755\n--- a/t/t4002-diff-basic.sh\n+++ b/t/t4002-diff-basic.sh\n@@ -7,7 +7,6 @@ test_description='Test diff raw-output.\n \n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n . \"$TEST_DIRECTORY\"/lib-read-tree-m-3way.sh\ndiff --git a/t/t4003-diff-rename-1.sh b/t/t4003-diff-rename-1.sh\nindex ebe091828c8..fd4faee5d25 100755\n--- a/t/t4003-diff-rename-1.sh\n+++ b/t/t4003-diff-rename-1.sh\n@@ -7,7 +7,6 @@ test_description='More rename detection\n \n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-diff.sh ;# test-lib chdir's into trash\n \ndiff --git a/t/t4004-diff-rename-symlink.sh b/t/t4004-diff-rename-symlink.sh\nindex 1d70d4d221b..faf3465deb4 100755\n--- a/t/t4004-diff-rename-symlink.sh\n+++ b/t/t4004-diff-rename-symlink.sh\n@@ -10,7 +10,6 @@ copy of symbolic links, but should not produce rename/copy followed\n by an edit for them.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-diff.sh\n \ndiff --git a/t/t4005-diff-rename-2.sh b/t/t4005-diff-rename-2.sh\nindex 5c756dc2435..92d1141fbe0 100755\n--- a/t/t4005-diff-rename-2.sh\n+++ b/t/t4005-diff-rename-2.sh\n@@ -6,7 +6,6 @@\n test_description='Same rename detection as t4003 but testing diff-raw.'\n \n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-diff.sh ;# test-lib chdir's into trash\n \ndiff --git a/t/t4006-diff-mode.sh b/t/t4006-diff-mode.sh\nindex dbd4c0da213..2299b91fc4b 100755\n--- a/t/t4006-diff-mode.sh\n+++ b/t/t4006-diff-mode.sh\n@@ -7,7 +7,6 @@ test_description='Test mode change diffs.\n \n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n sed_script='s/\\(:100644 100755\\) \\('\"$OID_REGEX\"'\\) \\2 /\\1 X X /'\ndiff --git a/t/t4007-rename-3.sh b/t/t4007-rename-3.sh\nindex b86165cbac5..e8faf0dd2ef 100755\n--- a/t/t4007-rename-3.sh\n+++ b/t/t4007-rename-3.sh\n@@ -7,7 +7,6 @@ test_description='Rename interaction with pathspec.\n \n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-diff.sh ;# test-lib chdir's into trash\n \ndiff --git a/t/t4008-diff-break-rewrite.sh b/t/t4008-diff-break-rewrite.sh\nindex b0ef0026e08..c187c52dab2 100755\n--- a/t/t4008-diff-break-rewrite.sh\n+++ b/t/t4008-diff-break-rewrite.sh\n@@ -22,7 +22,6 @@ With -B, this should be detected as two complete rewrites.\n Further, with -B and -M together, these should turn into two renames.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-diff.sh ;# test-lib chdir's into trash\n \ndiff --git a/t/t4009-diff-rename-4.sh b/t/t4009-diff-rename-4.sh\nindex 3480781dabf..59e71e3acde 100755\n--- a/t/t4009-diff-rename-4.sh\n+++ b/t/t4009-diff-rename-4.sh\n@@ -7,7 +7,6 @@ test_description='Same rename detection as t4003 but testing diff-raw -z.\n \n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-diff.sh ;# test-lib chdir's into trash\n \ndiff --git a/t/t4010-diff-pathspec.sh b/t/t4010-diff-pathspec.sh\nindex 9d9650eba7e..c84c3fa05b2 100755\n--- a/t/t4010-diff-pathspec.sh\n+++ b/t/t4010-diff-pathspec.sh\n@@ -10,7 +10,6 @@ Prepare:\n         path1/file1\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-diff.sh ;# test-lib chdir's into trash\n \ndiff --git a/t/t4011-diff-symlink.sh b/t/t4011-diff-symlink.sh\nindex bc8ba887191..ac837b6c9ec 100755\n--- a/t/t4011-diff-symlink.sh\n+++ b/t/t4011-diff-symlink.sh\n@@ -7,7 +7,6 @@ test_description='Test diff of symlinks.\n \n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-diff.sh\n \ndiff --git a/t/t4012-diff-binary.sh b/t/t4012-diff-binary.sh\nindex c64d9d2f405..d1d30ac2a94 100755\n--- a/t/t4012-diff-binary.sh\n+++ b/t/t4012-diff-binary.sh\n@@ -6,7 +6,6 @@\n test_description='Binary diff and apply\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n cat >expect.binary-numstat <<\\EOF\ndiff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh\nindex 87d248d0347..3855d68dbc0 100755\n--- a/t/t4013-diff-various.sh\n+++ b/t/t4013-diff-various.sh\n@@ -8,7 +8,6 @@ test_description='Various diff formatting options'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-diff.sh\n \ndiff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh\nindex 1c46e963e43..884f83fb8a4 100755\n--- a/t/t4014-format-patch.sh\n+++ b/t/t4014-format-patch.sh\n@@ -8,7 +8,6 @@ test_description='various format-patch tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-terminal.sh\n \ndiff --git a/t/t4015-diff-whitespace.sh b/t/t4015-diff-whitespace.sh\nindex 851cfe4f32c..52e3e476ffa 100755\n--- a/t/t4015-diff-whitespace.sh\n+++ b/t/t4015-diff-whitespace.sh\n@@ -7,7 +7,6 @@ test_description='Test special whitespace in diff engine.\n \n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-diff.sh\n \ndiff --git a/t/t4016-diff-quote.sh b/t/t4016-diff-quote.sh\nindex 5a8d8876831..876271d6826 100755\n--- a/t/t4016-diff-quote.sh\n+++ b/t/t4016-diff-quote.sh\n@@ -6,7 +6,6 @@\n test_description='Quoting paths in diff output.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n P0='pathname'\ndiff --git a/t/t4017-diff-retval.sh b/t/t4017-diff-retval.sh\nindex 1cea73ef5a3..c2863c99b71 100755\n--- a/t/t4017-diff-retval.sh\n+++ b/t/t4017-diff-retval.sh\n@@ -5,7 +5,6 @@ test_description='Return value of diffs'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t4018-diff-funcname.sh b/t/t4018-diff-funcname.sh\nindex 8128c30e7f2..e026fac1f40 100755\n--- a/t/t4018-diff-funcname.sh\n+++ b/t/t4018-diff-funcname.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test custom diff function name patterns'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t4019-diff-wserror.sh b/t/t4019-diff-wserror.sh\nindex d2b3109c2d3..4001dacee39 100755\n--- a/t/t4019-diff-wserror.sh\n+++ b/t/t4019-diff-wserror.sh\n@@ -2,7 +2,6 @@\n \n test_description='diff whitespace error detection'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t4020-diff-external.sh b/t/t4020-diff-external.sh\nindex 0e5a05894fd..f1efe482a59 100755\n--- a/t/t4020-diff-external.sh\n+++ b/t/t4020-diff-external.sh\n@@ -2,7 +2,6 @@\n \n test_description='external diff interface test'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t4021-format-patch-numbered.sh b/t/t4021-format-patch-numbered.sh\nindex 1219aa226dc..9be65fd4440 100755\n--- a/t/t4021-format-patch-numbered.sh\n+++ b/t/t4021-format-patch-numbered.sh\n@@ -5,7 +5,6 @@\n \n test_description='Format-patch numbering options'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t4022-diff-rewrite.sh b/t/t4022-diff-rewrite.sh\nindex 77bc36d5d8f..6fed993ea0b 100755\n--- a/t/t4022-diff-rewrite.sh\n+++ b/t/t4022-diff-rewrite.sh\n@@ -2,7 +2,6 @@\n \n test_description='rewrite diff'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-diff-data.sh\n \ndiff --git a/t/t4023-diff-rename-typechange.sh b/t/t4023-diff-rename-typechange.sh\nindex e6f4fe441e1..787605ce3fd 100755\n--- a/t/t4023-diff-rename-typechange.sh\n+++ b/t/t4023-diff-rename-typechange.sh\n@@ -2,7 +2,6 @@\n \n test_description='typechange rename detection'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-diff.sh\n \ndiff --git a/t/t4024-diff-optimize-common.sh b/t/t4024-diff-optimize-common.sh\nindex e2f0eca4af0..b98ac0a0c03 100755\n--- a/t/t4024-diff-optimize-common.sh\n+++ b/t/t4024-diff-optimize-common.sh\n@@ -2,7 +2,6 @@\n \n test_description='common tail optimization'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n z=zzzzzzzz ;# 8\ndiff --git a/t/t4025-hunk-header.sh b/t/t4025-hunk-header.sh\nindex 5397cb7d42d..c39bb07a417 100755\n--- a/t/t4025-hunk-header.sh\n+++ b/t/t4025-hunk-header.sh\n@@ -2,7 +2,6 @@\n \n test_description='diff hunk header truncation'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n N='日本語'\ndiff --git a/t/t4026-color.sh b/t/t4026-color.sh\nindex b05f2a9b607..08f6805e1c8 100755\n--- a/t/t4026-color.sh\n+++ b/t/t4026-color.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test diff/status color escape codes'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n ESC=$(printf '\\033')\ndiff --git a/t/t4027-diff-submodule.sh b/t/t4027-diff-submodule.sh\nindex 40164ae07d2..295da987cce 100755\n--- a/t/t4027-diff-submodule.sh\n+++ b/t/t4027-diff-submodule.sh\n@@ -2,7 +2,6 @@\n \n test_description='difference in submodules'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-diff.sh\n \ndiff --git a/t/t4028-format-patch-mime-headers.sh b/t/t4028-format-patch-mime-headers.sh\nindex 60cb819c42e..a06a7479260 100755\n--- a/t/t4028-format-patch-mime-headers.sh\n+++ b/t/t4028-format-patch-mime-headers.sh\n@@ -2,7 +2,6 @@\n \n test_description='format-patch mime headers and extra headers do not conflict'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'create commit with utf-8 body' '\ndiff --git a/t/t4029-diff-trailing-space.sh b/t/t4029-diff-trailing-space.sh\nindex 5f8ffef74b6..32b6e9a4e76 100755\n--- a/t/t4029-diff-trailing-space.sh\n+++ b/t/t4029-diff-trailing-space.sh\n@@ -4,7 +4,6 @@\n #\n test_description='diff honors config option, diff.suppressBlankEmpty'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n cat <<\\EOF >expected ||\ndiff --git a/t/t4030-diff-textconv.sh b/t/t4030-diff-textconv.sh\nindex 29f6d610c2e..daebf9796f5 100755\n--- a/t/t4030-diff-textconv.sh\n+++ b/t/t4030-diff-textconv.sh\n@@ -2,7 +2,6 @@\n \n test_description='diff.*.textconv tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n find_diff() {\ndiff --git a/t/t4031-diff-rewrite-binary.sh b/t/t4031-diff-rewrite-binary.sh\nindex 1b8cd3e4c97..c4394a27b56 100755\n--- a/t/t4031-diff-rewrite-binary.sh\n+++ b/t/t4031-diff-rewrite-binary.sh\n@@ -2,7 +2,6 @@\n \n test_description='rewrite diff on binary file'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # We must be large enough to meet the MINIMUM_BREAK_SIZE\ndiff --git a/t/t4032-diff-inter-hunk-context.sh b/t/t4032-diff-inter-hunk-context.sh\nindex 7db92d0d9f4..bada0cbd32f 100755\n--- a/t/t4032-diff-inter-hunk-context.sh\n+++ b/t/t4032-diff-inter-hunk-context.sh\n@@ -2,7 +2,6 @@\n \n test_description='diff hunk fusing'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n f() {\ndiff --git a/t/t4033-diff-patience.sh b/t/t4033-diff-patience.sh\nindex f7be7f5ef01..113304dc596 100755\n--- a/t/t4033-diff-patience.sh\n+++ b/t/t4033-diff-patience.sh\n@@ -2,7 +2,6 @@\n \n test_description='patience diff algorithm'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-diff-alternative.sh\n \ndiff --git a/t/t4034-diff-words.sh b/t/t4034-diff-words.sh\nindex 4dcd7e99250..f51d3557f10 100755\n--- a/t/t4034-diff-words.sh\n+++ b/t/t4034-diff-words.sh\n@@ -2,7 +2,6 @@\n \n test_description='word diff colors'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-diff.sh\n \ndiff --git a/t/t4035-diff-quiet.sh b/t/t4035-diff-quiet.sh\nindex 76f8034c60f..0352bf81a90 100755\n--- a/t/t4035-diff-quiet.sh\n+++ b/t/t4035-diff-quiet.sh\n@@ -2,7 +2,6 @@\n \n test_description='Return value of diffs'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t4036-format-patch-signer-mime.sh b/t/t4036-format-patch-signer-mime.sh\nindex 48655bcc789..98d9713d8b2 100755\n--- a/t/t4036-format-patch-signer-mime.sh\n+++ b/t/t4036-format-patch-signer-mime.sh\n@@ -2,7 +2,6 @@\n \n test_description='format-patch -s should force MIME encoding as needed'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t4037-diff-r-t-dirs.sh b/t/t4037-diff-r-t-dirs.sh\nindex b5f96fe23bd..f5ce3b29a2a 100755\n--- a/t/t4037-diff-r-t-dirs.sh\n+++ b/t/t4037-diff-r-t-dirs.sh\n@@ -2,7 +2,6 @@\n \n test_description='diff -r -t shows directory additions and deletions'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t4038-diff-combined.sh b/t/t4038-diff-combined.sh\nindex 00190802d83..2ce26e585c9 100755\n--- a/t/t4038-diff-combined.sh\n+++ b/t/t4038-diff-combined.sh\n@@ -5,7 +5,6 @@ test_description='combined diff'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-diff.sh\n \ndiff --git a/t/t4039-diff-assume-unchanged.sh b/t/t4039-diff-assume-unchanged.sh\nindex 78090e6852d..0eb0314a8b3 100755\n--- a/t/t4039-diff-assume-unchanged.sh\n+++ b/t/t4039-diff-assume-unchanged.sh\n@@ -2,7 +2,6 @@\n \n test_description='diff with assume-unchanged entries'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # external diff has been tested in t4020-diff-external.sh\ndiff --git a/t/t4040-whitespace-status.sh b/t/t4040-whitespace-status.sh\nindex eec3d73dc2b..1b27a0e3813 100755\n--- a/t/t4040-whitespace-status.sh\n+++ b/t/t4040-whitespace-status.sh\n@@ -2,7 +2,6 @@\n \n test_description='diff --exit-code with whitespace'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t4041-diff-submodule-option.sh b/t/t4041-diff-submodule-option.sh\nindex aa149e0085e..28f9d83d4c1 100755\n--- a/t/t4041-diff-submodule-option.sh\n+++ b/t/t4041-diff-submodule-option.sh\n@@ -12,7 +12,6 @@ This test tries to verify the sanity of the --submodule option of git diff.\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Test non-UTF-8 encoding in case iconv is available.\ndiff --git a/t/t4042-diff-textconv-caching.sh b/t/t4042-diff-textconv-caching.sh\nindex a179205394d..ff0e73531b9 100755\n--- a/t/t4042-diff-textconv-caching.sh\n+++ b/t/t4042-diff-textconv-caching.sh\n@@ -2,7 +2,6 @@\n \n test_description='test textconv caching'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n cat >helper <<'EOF'\ndiff --git a/t/t4043-diff-rename-binary.sh b/t/t4043-diff-rename-binary.sh\nindex e4864939081..2a2cf913520 100755\n--- a/t/t4043-diff-rename-binary.sh\n+++ b/t/t4043-diff-rename-binary.sh\n@@ -5,7 +5,6 @@\n \n test_description='Move a binary file'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n \ndiff --git a/t/t4044-diff-index-unique-abbrev.sh b/t/t4044-diff-index-unique-abbrev.sh\nindex 9f6043dabac..8400bfbd3c7 100755\n--- a/t/t4044-diff-index-unique-abbrev.sh\n+++ b/t/t4044-diff-index-unique-abbrev.sh\n@@ -2,7 +2,6 @@\n \n test_description='test unique sha1 abbreviation on \"index from..to\" line'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t4045-diff-relative.sh b/t/t4045-diff-relative.sh\nindex 9b46c4c1bef..2c8493fe66c 100755\n--- a/t/t4045-diff-relative.sh\n+++ b/t/t4045-diff-relative.sh\n@@ -2,7 +2,6 @@\n \n test_description='diff --relative tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t4046-diff-unmerged.sh b/t/t4046-diff-unmerged.sh\nindex afda629c981..7c27f053663 100755\n--- a/t/t4046-diff-unmerged.sh\n+++ b/t/t4046-diff-unmerged.sh\n@@ -2,7 +2,6 @@\n \n test_description='diff with unmerged index entries'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t4047-diff-dirstat.sh b/t/t4047-diff-dirstat.sh\nindex 7b73462d53d..a7ce8d3161b 100755\n--- a/t/t4047-diff-dirstat.sh\n+++ b/t/t4047-diff-dirstat.sh\n@@ -2,7 +2,6 @@\n \n test_description='diff --dirstat tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # set up two commits where the second commit has these files\ndiff --git a/t/t4048-diff-combined-binary.sh b/t/t4048-diff-combined-binary.sh\nindex f399484bcef..0260cf64f5d 100755\n--- a/t/t4048-diff-combined-binary.sh\n+++ b/t/t4048-diff-combined-binary.sh\n@@ -4,7 +4,6 @@ test_description='combined and merge diff handle binary files and textconv'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup binary merge conflict' '\ndiff --git a/t/t4049-diff-stat-count.sh b/t/t4049-diff-stat-count.sh\nindex 0a4fc735d44..eceb47c8594 100755\n--- a/t/t4049-diff-stat-count.sh\n+++ b/t/t4049-diff-stat-count.sh\n@@ -3,7 +3,6 @@\n \n test_description='diff --stat-count'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t4050-diff-histogram.sh b/t/t4050-diff-histogram.sh\nindex c61b30f96da..fd3e86a74f3 100755\n--- a/t/t4050-diff-histogram.sh\n+++ b/t/t4050-diff-histogram.sh\n@@ -2,7 +2,6 @@\n \n test_description='histogram diff algorithm'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-diff-alternative.sh\n \ndiff --git a/t/t4051-diff-function-context.sh b/t/t4051-diff-function-context.sh\nindex 725278ad19c..4838a1df8b4 100755\n--- a/t/t4051-diff-function-context.sh\n+++ b/t/t4051-diff-function-context.sh\n@@ -2,7 +2,6 @@\n \n test_description='diff function context'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n dir=\"$TEST_DIRECTORY/t4051\"\ndiff --git a/t/t4052-stat-output.sh b/t/t4052-stat-output.sh\nindex 7badd72488d..740bb970918 100755\n--- a/t/t4052-stat-output.sh\n+++ b/t/t4052-stat-output.sh\n@@ -8,7 +8,6 @@ test_description='test --stat output of various commands'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-terminal.sh\n \ndiff --git a/t/t4053-diff-no-index.sh b/t/t4053-diff-no-index.sh\nindex 651ec776606..5e5bad61ca1 100755\n--- a/t/t4053-diff-no-index.sh\n+++ b/t/t4053-diff-no-index.sh\n@@ -2,7 +2,6 @@\n \n test_description='diff --no-index'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t4054-diff-bogus-tree.sh b/t/t4054-diff-bogus-tree.sh\nindex 05c88f8cdf0..1131431fe0e 100755\n--- a/t/t4054-diff-bogus-tree.sh\n+++ b/t/t4054-diff-bogus-tree.sh\n@@ -2,7 +2,6 @@\n \n test_description='test diff with a bogus tree containing the null sha1'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'create bogus tree' '\ndiff --git a/t/t4055-diff-context.sh b/t/t4055-diff-context.sh\nindex 3ea9ae99e04..f7ff234cf93 100755\n--- a/t/t4055-diff-context.sh\n+++ b/t/t4055-diff-context.sh\n@@ -5,7 +5,6 @@\n \n test_description='diff.context configuration'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t4056-diff-order.sh b/t/t4056-diff-order.sh\nindex 32c5fcb9a27..aec1d9d1b42 100755\n--- a/t/t4056-diff-order.sh\n+++ b/t/t4056-diff-order.sh\n@@ -5,7 +5,6 @@ test_description='diff order & rotate'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n create_files () {\ndiff --git a/t/t4057-diff-combined-paths.sh b/t/t4057-diff-combined-paths.sh\nindex 9a7505cbb8b..04b8a1542a8 100755\n--- a/t/t4057-diff-combined-paths.sh\n+++ b/t/t4057-diff-combined-paths.sh\n@@ -5,7 +5,6 @@ test_descriptio"},{"id":"506944","messageId":"41165e8c-eb5d-4fda-8f6b-67b7ec74bcbe@gmail.com","threadId":"62459","inReplyTo":"c23e1a08854530f5c2474725ddde1da1068c2c12.1730901926.git.ps@pks.im","subject":"Re: [PATCH 09/26] strvec: introduce new `strvec_splice()` function","fromName":"Rubén Justo","fromEmail":"rjusto@gmail.com","sentAt":"2024-11-10T21:39:08Z","receivedAt":"2024-11-10T21:39:12Z","isPatch":true,"sender":{"key":"rjusto@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5685487?v=4"},"body":"On Wed, Nov 06, 2024 at 04:10:44PM +0100, Patrick Steinhardt wrote:\n> Introduce a new `strvec_splice()` function that can replace a range of\n> strings in the vector with another array of strings. This function will\n> be used in subsequent commits.\n> \n> Signed-off-by: Patrick Steinhardt <ps@pks.im>\n> ---\n>  strvec.c              | 19 +++++++++++++\n>  strvec.h              |  9 ++++++\n>  t/unit-tests/strvec.c | 65 +++++++++++++++++++++++++++++++++++++++++++\n>  3 files changed, 93 insertions(+)\n> \n> diff --git a/strvec.c b/strvec.c\n> index f712070f574..81075c50cca 100644\n> --- a/strvec.c\n> +++ b/strvec.c\n> @@ -56,6 +56,25 @@ void strvec_pushv(struct strvec *array, const char **items)\n>  \t\tstrvec_push(array, *items);\n>  }\n>  \n> +void strvec_splice(struct strvec *array, size_t pos, size_t len,\n> +\t\t   const char **replacement, size_t replacement_len)\n\nThere's nothing wrong with `replacement_len`, but it has caught my\nattention because in other strvec APIs we use null-terminated arrays.\n\n> +{\n> +\tif (pos + len > array->alloc)\n> +\t\tBUG(\"range outside of array boundary\");\n> +\tif (replacement_len > len)\n> +\t\tALLOC_GROW(array->v, array->nr + (replacement_len - len) + 1,\n> +\t\t\t   array->alloc);\n> +\tfor (size_t i = 0; i < len; i++)\n> +\t\tfree((char *)array->v[pos + i]);\n> +\tif (replacement_len != len) {\n> +\t\tmemmove(array->v + pos + replacement_len, array->v + pos + len,\n> +\t\t\t(array->nr - pos - len + 1) * sizeof(char *));\n> +\t\tarray->nr += (replacement_len - len);\n> +\t}\n> +\tfor (size_t i = 0; i < replacement_len; i++)\n> +\t\tarray->v[pos + i] = xstrdup(replacement[i]);\n> +}\n> +\n>  const char *strvec_replace(struct strvec *array, size_t idx, const char *replacement)\n>  {\n>  \tchar *to_free;\n> diff --git a/strvec.h b/strvec.h\n> index 4b73c1f092e..4e61cc93369 100644\n> --- a/strvec.h\n> +++ b/strvec.h\n> @@ -67,6 +67,15 @@ void strvec_pushl(struct strvec *, ...);\n>  /* Push a null-terminated array of strings onto the end of the array. */\n>  void strvec_pushv(struct strvec *, const char **);\n>  \n> +/*\n> + * Replace `len` values starting at `pos` with the provided replacement\n> + * strings. If `len` is zero this is effectively an insert at the given `pos`.\n> + * If `replacement_len` is zero this is effectively a delete of `len` items\n> + * starting at `pos`.\n> + */\n> +void strvec_splice(struct strvec *array, size_t pos, size_t len,\n> +\t\t   const char **replacement, size_t replacement_len);\n> +\n>  /**\n>   * Replace the value at the given index with a new value. The index must be\n>   * valid. Returns a pointer to the inserted value.\n> diff --git a/t/unit-tests/strvec.c b/t/unit-tests/strvec.c\n> index bf4c0cb172e..855b6023371 100644\n> --- a/t/unit-tests/strvec.c\n> +++ b/t/unit-tests/strvec.c\n> @@ -88,6 +88,71 @@ void test_strvec__pushv(void)\n>  \tstrvec_clear(&vec);\n>  }\n>  \n> +void test_strvec__splice_with_same_size_replacement(void)\n> +{\n> +\tstruct strvec vec = STRVEC_INIT;\n> +\tconst char *replacement[] = { \"1\" };\n> +\n> +\tstrvec_pushl(&vec, \"foo\", \"bar\", \"baz\", NULL);\n> +\tstrvec_splice(&vec, 1, 1, replacement, ARRAY_SIZE(replacement));\n> +\tcheck_strvec(&vec, \"foo\", \"1\", \"baz\", NULL);\n> +\tstrvec_clear(&vec);\n> +}\n> +\n> +void test_strvec__splice_with_smaller_replacement(void)\n> +{\n> +\tstruct strvec vec = STRVEC_INIT;\n> +\tconst char *replacement[] = { \"1\" };\n> +\n> +\tstrvec_pushl(&vec, \"foo\", \"bar\", \"baz\", NULL);\n> +\tstrvec_splice(&vec, 1, 2, replacement, ARRAY_SIZE(replacement));\n> +\tcheck_strvec(&vec, \"foo\", \"1\", NULL);\n> +\tstrvec_clear(&vec);\n> +}\n> +\n> +void test_strvec__splice_with_bigger_replacement(void)\n> +{\n> +\tstruct strvec vec = STRVEC_INIT;\n> +\tconst char *replacement[] = { \"1\", \"2\", \"3\" };\n> +\n> +\tstrvec_pushl(&vec, \"foo\", \"bar\", \"baz\", NULL);\n> +\tstrvec_splice(&vec, 0, 2, replacement, ARRAY_SIZE(replacement));\n> +\tcheck_strvec(&vec, \"1\", \"2\", \"3\", \"baz\", NULL);\n> +\tstrvec_clear(&vec);\n> +}\n> +\n> +void test_strvec__splice_with_empty_replacement(void)\n> +{\n> +\tstruct strvec vec = STRVEC_INIT;\n> +\n> +\tstrvec_pushl(&vec, \"foo\", \"bar\", \"baz\", NULL);\n> +\tstrvec_splice(&vec, 0, 2, NULL, 0);\n> +\tcheck_strvec(&vec, \"baz\", NULL);\n> +\tstrvec_clear(&vec);\n> +}\n> +\n> +void test_strvec__splice_with_empty_original(void)\n> +{\n> +\tstruct strvec vec = STRVEC_INIT;\n> +\tconst char *replacement[] = { \"1\", \"2\" };\n> +\n> +\tstrvec_pushl(&vec, \"foo\", \"bar\", \"baz\", NULL);\n> +\tstrvec_splice(&vec, 1, 0, replacement, ARRAY_SIZE(replacement));\n> +\tcheck_strvec(&vec, \"foo\", \"1\", \"2\", \"bar\", \"baz\", NULL);\n> +\tstrvec_clear(&vec);\n> +}\n> +\n> +void test_strvec__splice_at_tail(void)\n> +{\n> +\tstruct strvec vec = STRVEC_INIT;\n> +\tconst char *replacement[] = { \"1\", \"2\" };\n> +\n> +\tstrvec_pushl(&vec, \"foo\", \"bar\", NULL);\n> +\tstrvec_splice(&vec, 2, 0, replacement, ARRAY_SIZE(replacement));\n> +\tcheck_strvec(&vec, \"foo\", \"bar\", \"1\", \"2\", NULL);\n> +\tstrvec_clear(&vec);\n> +}\n> +\n>  void test_strvec__replace_at_head(void)\n>  {\n>  \tstruct strvec vec = STRVEC_INIT;\n> -- \n> 2.47.0.229.g8f8d6eee53.dirty\n> \n"},{"id":"506945","messageId":"8b9c998b-9098-47d7-af49-ecea51d5278f@gmail.com","threadId":"62459","inReplyTo":"93aed59eaf67739e25dee4bd6cc0a3f2a527f345.1730901926.git.ps@pks.im","subject":"Re: [PATCH 10/26] git: refactor alias handling to use a `struct strvec`","fromName":"Rubén Justo","fromEmail":"rjusto@gmail.com","sentAt":"2024-11-10T21:41:14Z","receivedAt":"2024-11-10T21:41:18Z","isPatch":true,"sender":{"key":"rjusto@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5685487?v=4"},"body":"On Wed, Nov 06, 2024 at 04:10:47PM +0100, Patrick Steinhardt wrote:\n> In `handle_alias()` we use both `argcp` and `argv` as in-out parameters.\n> Callers mostly pass through the static array from `main()`, but once we\n> handle an alias we replace it with an allocated array that may contain\n> some allocated strings. Callers do not handle this scenario at all and\n> thus leak memory.\n> \n> We could in theory handle the lifetime of `argv` in a hacky fashion by\n> letting callers free it in case they see that an alias was handled. But\n> while that would likely work, we still wouldn't be able to easily handle\n> the lifetime of strings referenced by `argv`.\n> \n> Refactor the code to instead use a `struct strvec`, which effectively\n> removes the need for us to manually track lifetimes.\n> \n> Signed-off-by: Patrick Steinhardt <ps@pks.im>\n> ---\n>  git.c            | 58 ++++++++++++++++++++++++++----------------------\n>  t/t0014-alias.sh |  1 +\n>  2 files changed, 33 insertions(+), 26 deletions(-)\n> \n> diff --git a/git.c b/git.c\n> index c2c1b8e22c2..88356afe5fb 100644\n> --- a/git.c\n> +++ b/git.c\n> @@ -362,7 +362,7 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)\n>  \treturn (*argv) - orig_argv;\n>  }\n>  \n> -static int handle_alias(int *argcp, const char ***argv)\n> +static int handle_alias(struct strvec *args)\n>  {\n>  \tint envchanged = 0, ret = 0, saved_errno = errno;\n>  \tint count, option_count;\n> @@ -370,10 +370,10 @@ static int handle_alias(int *argcp, const char ***argv)\n>  \tconst char *alias_command;\n>  \tchar *alias_string;\n>  \n> -\talias_command = (*argv)[0];\n> +\talias_command = args->v[0];\n>  \talias_string = alias_lookup(alias_command);\n>  \tif (alias_string) {\n> -\t\tif (*argcp > 1 && !strcmp((*argv)[1], \"-h\"))\n> +\t\tif (args->nr > 1 && !strcmp(args->v[1], \"-h\"))\n>  \t\t\tfprintf_ln(stderr, _(\"'%s' is aliased to '%s'\"),\n>  \t\t\t\t   alias_command, alias_string);\n>  \t\tif (alias_string[0] == '!') {\n> @@ -390,7 +390,7 @@ static int handle_alias(int *argcp, const char ***argv)\n>  \t\t\tchild.wait_after_clean = 1;\n>  \t\t\tchild.trace2_child_class = \"shell_alias\";\n>  \t\t\tstrvec_push(&child.args, alias_string + 1);\n> -\t\t\tstrvec_pushv(&child.args, (*argv) + 1);\n> +\t\t\tstrvec_pushv(&child.args, args->v + 1);\n>  \n>  \t\t\ttrace2_cmd_alias(alias_command, child.args.v);\n>  \t\t\ttrace2_cmd_name(\"_run_shell_alias_\");\n> @@ -423,15 +423,13 @@ static int handle_alias(int *argcp, const char ***argv)\n>  \t\ttrace_argv_printf(new_argv,\n>  \t\t\t\t  \"trace: alias expansion: %s =>\",\n>  \t\t\t\t  alias_command);\n> -\n> -\t\tREALLOC_ARRAY(new_argv, count + *argcp);\n> -\t\t/* insert after command name */\n> -\t\tCOPY_ARRAY(new_argv + count, *argv + 1, *argcp);\n> -\n>  \t\ttrace2_cmd_alias(alias_command, new_argv);\n>  \n> -\t\t*argv = new_argv;\n> -\t\t*argcp += count - 1;\n> +\t\t/* Replace the alias with the new arguments. */\n> +\t\tstrvec_splice(args, 0, 1, new_argv, count);\n\nSo, we take advantage here of the `replacement_len` argument for\n`strvec_splice()`.  OK. \n\n> +\n> +\t\tfree(alias_string);\n> +\t\tfree(new_argv);\n>  \n>  \t\tret = 1;\n>  \t}\n> @@ -800,10 +798,10 @@ static void execv_dashed_external(const char **argv)\n>  \t\texit(128);\n>  }\n>  \n> -static int run_argv(int *argcp, const char ***argv)\n> +static int run_argv(struct strvec *args)\n>  {\n>  \tint done_alias = 0;\n> -\tstruct string_list cmd_list = STRING_LIST_INIT_NODUP;\n> +\tstruct string_list cmd_list = STRING_LIST_INIT_DUP;\n>  \tstruct string_list_item *seen;\n>  \n>  \twhile (1) {\n> @@ -817,8 +815,8 @@ static int run_argv(int *argcp, const char ***argv)\n>  \t\t * process.\n>  \t\t */\n>  \t\tif (!done_alias)\n> -\t\t\thandle_builtin(*argcp, *argv);\n> -\t\telse if (get_builtin(**argv)) {\n> +\t\t\thandle_builtin(args->nr, args->v);\n> +\t\telse if (get_builtin(args->v[0])) {\n>  \t\t\tstruct child_process cmd = CHILD_PROCESS_INIT;\n>  \t\t\tint i;\n>  \n> @@ -834,8 +832,8 @@ static int run_argv(int *argcp, const char ***argv)\n>  \t\t\tcommit_pager_choice();\n>  \n>  \t\t\tstrvec_push(&cmd.args, \"git\");\n> -\t\t\tfor (i = 0; i < *argcp; i++)\n> -\t\t\t\tstrvec_push(&cmd.args, (*argv)[i]);\n> +\t\t\tfor (i = 0; i < args->nr; i++)\n> +\t\t\t\tstrvec_push(&cmd.args, args->v[i]);\n>  \n>  \t\t\ttrace_argv_printf(cmd.args.v, \"trace: exec:\");\n>  \n> @@ -850,13 +848,13 @@ static int run_argv(int *argcp, const char ***argv)\n>  \t\t\ti = run_command(&cmd);\n>  \t\t\tif (i >= 0 || errno != ENOENT)\n>  \t\t\t\texit(i);\n> -\t\t\tdie(\"could not execute builtin %s\", **argv);\n> +\t\t\tdie(\"could not execute builtin %s\", args->v[0]);\n>  \t\t}\n>  \n>  \t\t/* .. then try the external ones */\n> -\t\texecv_dashed_external(*argv);\n> +\t\texecv_dashed_external(args->v);\n>  \n> -\t\tseen = unsorted_string_list_lookup(&cmd_list, *argv[0]);\n> +\t\tseen = unsorted_string_list_lookup(&cmd_list, args->v[0]);\n>  \t\tif (seen) {\n>  \t\t\tint i;\n>  \t\t\tstruct strbuf sb = STRBUF_INIT;\n> @@ -873,14 +871,14 @@ static int run_argv(int *argcp, const char ***argv)\n>  \t\t\t      \" not terminate:%s\"), cmd_list.items[0].string, sb.buf);\n>  \t\t}\n>  \n> -\t\tstring_list_append(&cmd_list, *argv[0]);\n> +\t\tstring_list_append(&cmd_list, args->v[0]);\n>  \n>  \t\t/*\n>  \t\t * It could be an alias -- this works around the insanity\n>  \t\t * of overriding \"git log\" with \"git show\" by having\n>  \t\t * alias.log = show\n>  \t\t */\n> -\t\tif (!handle_alias(argcp, argv))\n> +\t\tif (!handle_alias(args))\n>  \t\t\tbreak;\n>  \t\tdone_alias = 1;\n>  \t}\n> @@ -892,6 +890,7 @@ static int run_argv(int *argcp, const char ***argv)\n>  \n>  int cmd_main(int argc, const char **argv)\n>  {\n> +\tstruct strvec args = STRVEC_INIT;\n>  \tconst char *cmd;\n>  \tint done_help = 0;\n>  \n> @@ -951,25 +950,32 @@ int cmd_main(int argc, const char **argv)\n>  \t */\n>  \tsetup_path();\n>  \n> +\tfor (size_t i = 0; i < argc; i++)\n> +\t\tstrvec_push(&args, argv[i]);\n> +\n>  \twhile (1) {\n> -\t\tint was_alias = run_argv(&argc, &argv);\n> +\t\tint was_alias = run_argv(&args);\n>  \t\tif (errno != ENOENT)\n>  \t\t\tbreak;\n>  \t\tif (was_alias) {\n>  \t\t\tfprintf(stderr, _(\"expansion of alias '%s' failed; \"\n>  \t\t\t\t\t  \"'%s' is not a git command\\n\"),\n> -\t\t\t\tcmd, argv[0]);\n> +\t\t\t\tcmd, args.v[0]);\n> +\t\t\tstrvec_clear(&args);\n>  \t\t\texit(1);\n>  \t\t}\n>  \t\tif (!done_help) {\n> -\t\t\tcmd = argv[0] = help_unknown_cmd(cmd);\n> +\t\t\tstrvec_replace(&args, 0, help_unknown_cmd(cmd));\n> +\t\t\tcmd = args.v[0];\n>  \t\t\tdone_help = 1;\n> -\t\t} else\n> +\t\t} else {\n>  \t\t\tbreak;\n> +\t\t}\n>  \t}\n>  \n>  \tfprintf(stderr, _(\"failed to run command '%s': %s\\n\"),\n>  \t\tcmd, strerror(errno));\n> +\tstrvec_clear(&args);\n>  \n>  \treturn 1;\n>  }\n> diff --git a/t/t0014-alias.sh b/t/t0014-alias.sh\n> index 854d59ec58c..2a6f39ad9c8 100755\n> --- a/t/t0014-alias.sh\n> +++ b/t/t0014-alias.sh\n> @@ -2,6 +2,7 @@\n>  \n>  test_description='git command aliasing'\n>  \n> +TEST_PASSES_SANITIZE_LEAK=true\n>  . ./test-lib.sh\n>  \n>  test_expect_success 'nested aliases - internal execution' '\n> -- \n> 2.47.0.229.g8f8d6eee53.dirty\n> \n"},{"id":"506946","messageId":"df95ded8-2068-416c-a4cc-2dd564f94e6c@gmail.com","threadId":"62459","inReplyTo":"88e727407242248173f1e0f39d7b85b681234f4a.1730901926.git.ps@pks.im","subject":"Re: [PATCH 12/26] split-index: fix memory leak in `move_cache_to_base_index()`","fromName":"Rubén Justo","fromEmail":"rjusto@gmail.com","sentAt":"2024-11-10T21:45:21Z","receivedAt":"2024-11-10T21:45:25Z","isPatch":true,"sender":{"key":"rjusto@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5685487?v=4"},"body":"On Wed, Nov 06, 2024 at 04:10:52PM +0100, Patrick Steinhardt wrote:\n> In `move_cache_to_base_index()` we move the index cache of the main\n> index into the split index, which is used when writing a shared index.\n> But we don't release the old split index base in case we already had a\n> split index before this operation, which can thus leak memory.\n> \n> Plug the leak by releasing the previous base.\n> \n> Signed-off-by: Patrick Steinhardt <ps@pks.im>\n> ---\n>  split-index.c          | 6 +++++-\n>  t/t1700-split-index.sh | 1 +\n>  2 files changed, 6 insertions(+), 1 deletion(-)\n> \n> diff --git a/split-index.c b/split-index.c\n> index 120c8190b18..cfbc773e6cd 100644\n> --- a/split-index.c\n> +++ b/split-index.c\n> @@ -97,7 +97,11 @@ void move_cache_to_base_index(struct index_state *istate)\n>  \t\tmem_pool_combine(istate->ce_mem_pool, istate->split_index->base->ce_mem_pool);\n>  \t}\n>  \n> -\tALLOC_ARRAY(si->base, 1);\n> +\tif (si->base)\n> +\t\trelease_index(si->base);\n> +\telse\n> +\t\tALLOC_ARRAY(si->base, 1);\n> +\n>  \tindex_state_init(si->base, istate->repo);\n\nThis change sounded strange to me.  It's like:\n\n   if (si-base) {\n   \tdiscard_index(si->base);\n   } else {\n   \tALLOC_ARRAY(si->base, 1);\n   \tindex_state_init(si->base, istate->repo);\n   }\n\nOK.\n\n>  \tsi->base->version = istate->version;\n>  \t/* zero timestamp disables racy test in ce_write_index() */\n> diff --git a/t/t1700-split-index.sh b/t/t1700-split-index.sh\n> index ac4a5b2734c..2625ac44889 100755\n> --- a/t/t1700-split-index.sh\n> +++ b/t/t1700-split-index.sh\n> @@ -5,6 +5,7 @@ test_description='split index mode tests'\n>  GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n>  export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n>  \n> +TEST_PASSES_SANITIZE_LEAK=true\n>  . ./test-lib.sh\n>  \n>  # We need total control of index splitting here\n> -- \n> 2.47.0.229.g8f8d6eee53.dirty\n> \n"},{"id":"506947","messageId":"c376f2ef-fc43-4815-8e26-f13da3729ed1@gmail.com","threadId":"62459","inReplyTo":"2fb012662d6c5720be1fe86973640c7a2d6f5681.1730901926.git.ps@pks.im","subject":"Re: [PATCH 15/26] help: fix leaking `struct cmdnames`","fromName":"Rubén Justo","fromEmail":"rjusto@gmail.com","sentAt":"2024-11-10T21:46:29Z","receivedAt":"2024-11-10T21:46:33Z","isPatch":true,"sender":{"key":"rjusto@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5685487?v=4"},"body":"On Wed, Nov 06, 2024 at 04:11:03PM +0100, Patrick Steinhardt wrote:\n> We're populating multiple `struct cmdnames`, but don't ever free them.\n> Create a common exit path where we do so.\n> \n> Note that this also requires us to use `FREE_AND_NULL()` when freeing\n> `cmdnames::names`, as we may otherwise try to free it multiple times.\n> \n> Signed-off-by: Patrick Steinhardt <ps@pks.im>\n> ---\n>  help.c | 24 +++++++++++++++++-------\n>  1 file changed, 17 insertions(+), 7 deletions(-)\n> \n> diff --git a/help.c b/help.c\n> index 8794f81db9b..51adc530d7a 100644\n> --- a/help.c\n> +++ b/help.c\n> @@ -169,7 +169,7 @@ void cmdnames_release(struct cmdnames *cmds)\n>  \tint i;\n>  \tfor (i = 0; i < cmds->cnt; ++i)\n>  \t\tfree(cmds->names[i]);\n> -\tfree(cmds->names);\n> +\tFREE_AND_NULL(cmds->names);\n>  \tcmds->cnt = 0;\n>  \tcmds->alloc = 0;\n>  }\n> @@ -619,6 +619,7 @@ const char *help_unknown_cmd(const char *cmd)\n>  \tstruct cmdnames main_cmds = { 0 };\n>  \tstruct cmdnames other_cmds = { 0 };\n>  \tstruct cmdname_help *common_cmds;\n> +\tconst char *assumed = NULL;\n>  \n>  \tread_early_config(the_repository, git_unknown_cmd_config, &cfg);\n>  \n> @@ -630,7 +631,7 @@ const char *help_unknown_cmd(const char *cmd)\n>  \n>  \tif (cfg.autocorrect == AUTOCORRECT_NEVER) {\n>  \t\tfprintf_ln(stderr, _(\"git: '%s' is not a git command. See 'git --help'.\"), cmd);\n> -\t\texit(1);\n> +\t\tgoto out;\n\nWe haven't set a value for `assumed` at this point, so it's NULL, and in the\nnew exit path we `exit(1)` when `assumed` is NULL.  OK.\n\nHowever, I think we don't need this change.  And keeping the `exit(1)` close to\nthe error message seems like a good idea.  Perhaps, in another series, we could\nchange it to `die()`.\n\n>  \t}\n>  \n>  \tload_command_list(\"git-\", &main_cmds, &other_cmds);\n> @@ -695,7 +696,7 @@ const char *help_unknown_cmd(const char *cmd)\n>  \t\t\t; /* still counting */\n>  \t}\n>  \tif (cfg.autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) {\n> -\t\tconst char *assumed = main_cmds.names[0]->name;\n> +\t\tassumed = main_cmds.names[0]->name;\n>  \t\tmain_cmds.names[0] = NULL;\n>  \t\tcmdnames_release(&main_cmds);\n>  \t\tfprintf_ln(stderr,\n> @@ -714,8 +715,10 @@ const char *help_unknown_cmd(const char *cmd)\n>  \t\t\tanswer = git_prompt(msg.buf, PROMPT_ECHO);\n>  \t\t\tstrbuf_release(&msg);\n>  \t\t\tif (!(starts_with(answer, \"y\") ||\n> -\t\t\t      starts_with(answer, \"Y\")))\n> -\t\t\t\texit(1);\n> +\t\t\t      starts_with(answer, \"Y\"))) {\n> +\t\t\t\tassumed = NULL;\n> +\t\t\t\tgoto out;\n> +\t\t\t}\n\nOK.  But, as above, I don't think we need to change this either.\n\n>  \t\t} else {\n>  \t\t\tfprintf_ln(stderr,\n>  \t\t\t\t   _(\"Continuing in %0.1f seconds, \"\n> @@ -723,7 +726,8 @@ const char *help_unknown_cmd(const char *cmd)\n>  \t\t\t\t   (float)cfg.autocorrect/10.0, assumed);\n>  \t\t\tsleep_millisec(cfg.autocorrect * 100);\n>  \t\t}\n> -\t\treturn assumed;\n> +\n> +\t\tgoto out;\n\nOK.\n\n>  \t}\n>  \n>  \tfprintf_ln(stderr, _(\"git: '%s' is not a git command. See 'git --help'.\"), cmd);\n> @@ -738,7 +742,13 @@ const char *help_unknown_cmd(const char *cmd)\n>  \t\t\tfprintf(stderr, \"\\t%s\\n\", main_cmds.names[i]->name);\n>  \t}\n>  \n> -\texit(1);\n> +out:\n> +\tcmdnames_release(&cfg.aliases);\n> +\tcmdnames_release(&main_cmds);\n> +\tcmdnames_release(&other_cmds);\n> +\tif (!assumed)\n> +\t\texit(1);\n> +\treturn assumed;\n\nOK.\n\n>  }\n>  \n>  void get_version_info(struct strbuf *buf, int show_build_options)\n> -- \n> 2.47.0.229.g8f8d6eee53.dirty\n> \n"},{"id":"506948","messageId":"5d18abb7-52a1-41d0-8207-066a012d41e7@gmail.com","threadId":"62459","inReplyTo":"256427084f63c9b2141bd468d633ee4d079fd33f.1730901926.git.ps@pks.im","subject":"Re: [PATCH 18/26] builtin/init-db: fix leaking directory paths","fromName":"Rubén Justo","fromEmail":"rjusto@gmail.com","sentAt":"2024-11-10T21:47:10Z","receivedAt":"2024-11-10T21:47:13Z","isPatch":true,"sender":{"key":"rjusto@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5685487?v=4"},"body":"On Wed, Nov 06, 2024 at 04:11:11PM +0100, Patrick Steinhardt wrote:\n> We've got a couple of leaking directory paths in git-init(1), all of\n> which are marked with `UNLEAK()`. Fixing them is trivial, so let's do\n> that instead so that we can get rid of `UNLEAK()` entirely.\n> \n> Signed-off-by: Patrick Steinhardt <ps@pks.im>\n> ---\n>  builtin/init-db.c | 30 +++++++++++++++++-------------\n>  1 file changed, 17 insertions(+), 13 deletions(-)\n> \n> diff --git a/builtin/init-db.c b/builtin/init-db.c\n> index 7e00d57d654..9e069e27426 100644\n> --- a/builtin/init-db.c\n> +++ b/builtin/init-db.c\n> @@ -75,10 +75,12 @@ int cmd_init_db(int argc,\n>  \t\tconst char *prefix,\n>  \t\tstruct repository *repo UNUSED)\n>  {\n> -\tconst char *git_dir;\n> +\tchar *git_dir;\n>  \tconst char *real_git_dir = NULL;\n> -\tconst char *work_tree;\n> +\tchar *real_git_dir_to_free = NULL;\n> +\tchar *work_tree = NULL;\n>  \tconst char *template_dir = NULL;\n> +\tchar *template_dir_to_free = NULL;\n>  \tunsigned int flags = 0;\n>  \tconst char *object_format = NULL;\n>  \tconst char *ref_format = NULL;\n> @@ -106,6 +108,7 @@ int cmd_init_db(int argc,\n>  \t\t\t   N_(\"specify the reference format to use\")),\n>  \t\tOPT_END()\n>  \t};\n> +\tint ret;\n>  \n>  \targc = parse_options(argc, argv, prefix, init_db_options, init_db_usage, 0);\n>  \n> @@ -113,12 +116,10 @@ int cmd_init_db(int argc,\n>  \t\tdie(_(\"options '%s' and '%s' cannot be used together\"), \"--separate-git-dir\", \"--bare\");\n>  \n>  \tif (real_git_dir && !is_absolute_path(real_git_dir))\n> -\t\treal_git_dir = real_pathdup(real_git_dir, 1);\n> +\t\treal_git_dir = real_git_dir_to_free = real_pathdup(real_git_dir, 1);\n>  \n> -\tif (template_dir && *template_dir && !is_absolute_path(template_dir)) {\n> -\t\ttemplate_dir = absolute_pathdup(template_dir);\n> -\t\tUNLEAK(template_dir);\n> -\t}\n> +\tif (template_dir && *template_dir && !is_absolute_path(template_dir))\n> +\t\ttemplate_dir = template_dir_to_free = absolute_pathdup(template_dir);\n>  \n>  \tif (argc == 1) {\n>  \t\tint mkdir_tried = 0;\n> @@ -192,7 +193,7 @@ int cmd_init_db(int argc,\n>  \t * Set up the default .git directory contents\n>  \t */\n>  \tif (!git_dir)\n> -\t\tgit_dir = DEFAULT_GIT_DIR_ENVIRONMENT;\n> +\t\tgit_dir = xstrdup(DEFAULT_GIT_DIR_ENVIRONMENT);\n>  \n>  \t/*\n>  \t * When --separate-git-dir is used inside a linked worktree, take\n> @@ -213,6 +214,7 @@ int cmd_init_db(int argc,\n>  \t\t\tif (chdir(mainwt.buf) < 0)\n>  \t\t\t\tdie_errno(_(\"cannot chdir to %s\"), mainwt.buf);\n>  \t\t\tstrbuf_release(&mainwt);\n> +\t\t\tfree(git_dir);\n>  \t\t\tgit_dir = strbuf_detach(&sb, NULL);\n>  \t\t}\n>  \t\tstrbuf_release(&sb);\n> @@ -245,12 +247,14 @@ int cmd_init_db(int argc,\n>  \t\t\tset_git_work_tree(work_tree);\n>  \t}\n>  \n> -\tUNLEAK(real_git_dir);\n> -\tUNLEAK(git_dir);\n\nWe were doing this, out of simplicity, even in cases where it wasn't\nnecessary ...\n\n> -\tUNLEAK(work_tree);\n\n... and this line is now the `free()` we are doing below.\n\nOK.  Nice clean up.\n\n> -\n>  \tflags |= INIT_DB_EXIST_OK;\n> -\treturn init_db(git_dir, real_git_dir, template_dir, hash_algo,\n> +\tret =  init_db(git_dir, real_git_dir, template_dir, hash_algo,\n>  \t\t       ref_storage_format, initial_branch,\n>  \t\t       init_shared_repository, flags);\n> +\n> +\tfree(template_dir_to_free);\n> +\tfree(real_git_dir_to_free);\n> +\tfree(work_tree);\n> +\tfree(git_dir);\n> +\treturn ret;\n>  }\n> -- \n> 2.47.0.229.g8f8d6eee53.dirty\n> \n"},{"id":"506949","messageId":"a8f782b6-9e5b-4df2-83b7-8000eaeca8d0@gmail.com","threadId":"62459","inReplyTo":"e0aa2c5bb258589bb2cac19c54fddbb70614a487.1730901926.git.ps@pks.im","subject":"Re: [PATCH 19/26] builtin/branch: fix leaking sorting options","fromName":"Rubén Justo","fromEmail":"rjusto@gmail.com","sentAt":"2024-11-10T21:47:31Z","receivedAt":"2024-11-10T21:47:34Z","isPatch":true,"sender":{"key":"rjusto@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5685487?v=4"},"body":"On Wed, Nov 06, 2024 at 04:11:16PM +0100, Patrick Steinhardt wrote:\n> The sorting options are leaking, but given that they are marked with\n> `UNLEAK()` the leak sanitizer doesn't complain.\n> \n> Fix the leak by creating a common exit path and clearing the vector such\n> that we can get rid of the `UNLEAK()` annotation entirely.\n> \n> Signed-off-by: Patrick Steinhardt <ps@pks.im>\n> ---\n>  builtin/branch.c | 33 ++++++++++++++++++++++-----------\n>  1 file changed, 22 insertions(+), 11 deletions(-)\n> \n> diff --git a/builtin/branch.c b/builtin/branch.c\n> index fd1611ebf55..05ba4cd7a64 100644\n> --- a/builtin/branch.c\n> +++ b/builtin/branch.c\n> @@ -722,6 +722,7 @@ int cmd_branch(int argc,\n>  \tstatic struct ref_sorting *sorting;\n>  \tstruct string_list sorting_options = STRING_LIST_INIT_DUP;\n>  \tstruct ref_format format = REF_FORMAT_INIT;\n> +\tint ret;\n>  \n>  \tstruct option options[] = {\n>  \t\tOPT_GROUP(N_(\"Generic options\")),\n> @@ -851,15 +852,15 @@ int cmd_branch(int argc,\n>  \tif (list)\n>  \t\tsetup_auto_pager(\"branch\", 1);\n>  \n> -\tUNLEAK(sorting_options);\n> -\n>  \tif (delete) {\n>  \t\tif (!argc)\n>  \t\t\tdie(_(\"branch name required\"));\n> -\t\treturn delete_branches(argc, argv, delete > 1, filter.kind, quiet);\n> +\t\tret = delete_branches(argc, argv, delete > 1, filter.kind, quiet);\n> +\t\tgoto out;\n>  \t} else if (show_current) {\n>  \t\tprint_current_branch_name();\n> -\t\treturn 0;\n> +\t\tret = 0;\n> +\t\tgoto out;\n>  \t} else if (list) {\n>  \t\t/*  git branch --list also shows HEAD when it is detached */\n>  \t\tif ((filter.kind & FILTER_REFS_BRANCHES) && filter.detached)\n> @@ -882,12 +883,13 @@ int cmd_branch(int argc,\n>  \t\tref_sorting_release(sorting);\n>  \t\tref_filter_clear(&filter);\n>  \t\tref_format_clear(&format);\n> -\t\treturn 0;\n> +\n> +\t\tret = 0;\n> +\t\tgoto out;\n>  \t} else if (edit_description) {\n>  \t\tconst char *branch_name;\n>  \t\tstruct strbuf branch_ref = STRBUF_INIT;\n>  \t\tstruct strbuf buf = STRBUF_INIT;\n> -\t\tint ret = 1; /* assume failure */\n\nNow we assume failure ...\n\n>  \n>  \t\tif (!argc) {\n>  \t\t\tif (filter.detached)\n> @@ -901,18 +903,22 @@ int cmd_branch(int argc,\n>  \t\t}\n>  \n>  \t\tstrbuf_addf(&branch_ref, \"refs/heads/%s\", branch_name);\n> -\t\tif (!refs_ref_exists(get_main_ref_store(the_repository), branch_ref.buf))\n> +\t\tif (!refs_ref_exists(get_main_ref_store(the_repository), branch_ref.buf)) {\n>  \t\t\terror((!argc || branch_checked_out(branch_ref.buf))\n>  \t\t\t      ? _(\"no commit on branch '%s' yet\")\n>  \t\t\t      : _(\"no branch named '%s'\"),\n>  \t\t\t      branch_name);\n> -\t\telse if (!edit_branch_description(branch_name))\n> +\t\t\tret = 1;\n> +\t\t} else if (!edit_branch_description(branch_name)) {\n>  \t\t\tret = 0; /* happy */\n> +\t\t} else {\n> +\t\t\tret = 1;\n\n... here.  OK.\n\n> +\t\t}\n>  \n>  \t\tstrbuf_release(&branch_ref);\n>  \t\tstrbuf_release(&buf);\n>  \n> -\t\treturn ret;\n> +\t\tgoto out;\n>  \t} else if (copy || rename) {\n>  \t\tif (!argc)\n>  \t\t\tdie(_(\"branch name required\"));\n> @@ -1000,12 +1006,17 @@ int cmd_branch(int argc,\n>  \t\t\tcreate_branches_recursively(the_repository, branch_name,\n>  \t\t\t\t\t\t    start_name, NULL, force,\n>  \t\t\t\t\t\t    reflog, quiet, track, 0);\n> -\t\t\treturn 0;\n> +\t\t\tret = 0;\n> +\t\t\tgoto out;\n>  \t\t}\n>  \t\tcreate_branch(the_repository, branch_name, start_name, force, 0,\n>  \t\t\t      reflog, quiet, track, 0);\n>  \t} else\n>  \t\tusage_with_options(builtin_branch_usage, options);\n>  \n> -\treturn 0;\n> +\tret = 0;\n> +\n> +out:\n> +\tstring_list_clear(&sorting_options, 0);\n> +\treturn ret;\n>  }\n> -- \n> 2.47.0.229.g8f8d6eee53.dirty\n> \n"},{"id":"506950","messageId":"f3c10656-94a1-42b2-94bf-253978c278ab@gmail.com","threadId":"62459","inReplyTo":"2d64a941d511a88a25c1f8258b5c5682089fdae9.1730901926.git.ps@pks.im","subject":"Re: [PATCH 21/26] git-compat-util: drop `UNLEAK()` annotation","fromName":"Rubén Justo","fromEmail":"rjusto@gmail.com","sentAt":"2024-11-10T21:47:58Z","receivedAt":"2024-11-10T21:48:02Z","isPatch":true,"sender":{"key":"rjusto@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5685487?v=4"},"body":"On Wed, Nov 06, 2024 at 04:11:21PM +0100, Patrick Steinhardt wrote:\n> There are two users of `UNLEAK()` left in our codebase:\n> \n>   - In \"builtin/clone.c\", annotating the `repo` variable. That leak has\n>     already been fixed though as you can see in the context, where we do\n>     know to free `repo_to_free`.\n> \n>   - In \"builtin/diff.c\", to unleak entries of the `blob[]` array. That\n>     leak has also been fixed, because the entries we assign to that\n>     array come from `rev.pending.objects`, and we do eventually release\n>     `rev`.\n> \n> This neatly demonstrates one of the issues with `UNLEAK()`: it is quite\n> easy for the annotation to become stale. A second issue is that its\n> whole intent is to paper over leaks. And while that has been a necessary\n> evil in the past, because Git was leaking left and right, it isn't\n> really much of an issue nowadays where our test suite has no known leaks\n> anymore.\n> \n> Remove the last two users\n\nOK.\n\n> and drop the now-unused `UNLEAK()` annotation.\n\nPerhaps it would be convenient to do this as a separate commit.\n\nJust for reference we have this annotation since 0e5bba53af (add\nUNLEAK annotation for reducing leak false positives, 2017-09-08).\n\n> \n> Signed-off-by: Patrick Steinhardt <ps@pks.im>\n> ---\n>  builtin/clone.c   |  1 -\n>  builtin/diff.c    |  1 -\n>  git-compat-util.h | 20 --------------------\n>  usage.c           | 15 ---------------\n>  4 files changed, 37 deletions(-)\n> \n> diff --git a/builtin/clone.c b/builtin/clone.c\n> index 59fcb317a68..e851b1475d7 100644\n> --- a/builtin/clone.c\n> +++ b/builtin/clone.c\n> @@ -1586,7 +1586,6 @@ int cmd_clone(int argc,\n>  \tfree(dir);\n>  \tfree(path);\n>  \tfree(repo_to_free);\n> -\tUNLEAK(repo);\n>  \tjunk_mode = JUNK_LEAVE_ALL;\n>  \n>  \ttransport_ls_refs_options_release(&transport_ls_refs_options);\n> diff --git a/builtin/diff.c b/builtin/diff.c\n> index dca52d4221e..2fe92f373e9 100644\n> --- a/builtin/diff.c\n> +++ b/builtin/diff.c\n> @@ -628,6 +628,5 @@ int cmd_diff(int argc,\n>  \trelease_revisions(&rev);\n>  \tobject_array_clear(&ent);\n>  \tsymdiff_release(&sdiff);\n> -\tUNLEAK(blob);\n>  \treturn result;\n>  }\n> diff --git a/git-compat-util.h b/git-compat-util.h\n> index e4a306dd563..a06d4f3809e 100644\n> --- a/git-compat-util.h\n> +++ b/git-compat-util.h\n> @@ -1527,26 +1527,6 @@ int cmd_main(int, const char **);\n>  int common_exit(const char *file, int line, int code);\n>  #define exit(code) exit(common_exit(__FILE__, __LINE__, (code)))\n>  \n> -/*\n> - * You can mark a stack variable with UNLEAK(var) to avoid it being\n> - * reported as a leak by tools like LSAN or valgrind. The argument\n> - * should generally be the variable itself (not its address and not what\n> - * it points to). It's safe to use this on pointers which may already\n> - * have been freed, or on pointers which may still be in use.\n> - *\n> - * Use this _only_ for a variable that leaks by going out of scope at\n> - * program exit (so only from cmd_* functions or their direct helpers).\n> - * Normal functions, especially those which may be called multiple\n> - * times, should actually free their memory. This is only meant as\n> - * an annotation, and does nothing in non-leak-checking builds.\n> - */\n> -#ifdef SUPPRESS_ANNOTATED_LEAKS\n> -void unleak_memory(const void *ptr, size_t len);\n> -#define UNLEAK(var) unleak_memory(&(var), sizeof(var))\n> -#else\n> -#define UNLEAK(var) do {} while (0)\n> -#endif\n> -\n>  #define z_const\n>  #include <zlib.h>\n>  \n> diff --git a/usage.c b/usage.c\n> index 7a2f7805f57..29a9725784a 100644\n> --- a/usage.c\n> +++ b/usage.c\n> @@ -350,18 +350,3 @@ void bug_fl(const char *file, int line, const char *fmt, ...)\n>  \ttrace2_cmd_error_va(fmt, ap);\n>  \tva_end(ap);\n>  }\n> -\n> -#ifdef SUPPRESS_ANNOTATED_LEAKS\n> -void unleak_memory(const void *ptr, size_t len)\n> -{\n> -\tstatic struct suppressed_leak_root {\n> -\t\tstruct suppressed_leak_root *next;\n> -\t\tchar data[FLEX_ARRAY];\n> -\t} *suppressed_leaks;\n> -\tstruct suppressed_leak_root *root;\n> -\n> -\tFLEX_ALLOC_MEM(root, data, ptr, len);\n> -\troot->next = suppressed_leaks;\n> -\tsuppressed_leaks = root;\n> -}\n> -#endif\n> -- \n> 2.47.0.229.g8f8d6eee53.dirty\n> \n"},{"id":"506951","messageId":"b1cf41c5-ec47-43e2-8a99-3f5faba4d261@gmail.com","threadId":"62459","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"Re: [PATCH 00/26] Memory leak fixes (pt.10, final)","fromName":"Rubén Justo","fromEmail":"rjusto@gmail.com","sentAt":"2024-11-10T21:48:53Z","receivedAt":"2024-11-10T21:48:57Z","isPatch":true,"sender":{"key":"rjusto@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5685487?v=4"},"body":"On Wed, Nov 06, 2024 at 04:10:14PM +0100, Patrick Steinhardt wrote:\n> Hi,\n> \n> this is the last part of my series of memory leak fixes. This series\n> goes a bit further than past series:\n> \n>   - Patches 1 to 16 plug remaining memory leaks exposed by our test\n>     suite.\n> \n>   - Patches 17 to 21 remove the last remaining `UNLEAK()` annotations\n>     and ultimately remove the macro itself.\n> \n>   - Patch 22 works around a bug in the leak sanitizer itself.\n> \n>   - Patches 23 and 24 drop annotations where leak-free tests pass with\n>     the leak sanitizer.\n> \n>   - Patches 25 and 26 unconditionally enable leak checking in all newly\n>     added tests and then drop the `TEST_PASSES_SANITIZE_LEAK`\n>     annotation.\n\nHi Patrick.\n\nThanks for working on this.\n\nIt's been a while since 956d2e4639 (tests: add a test mode for SANITIZE=leak,\nrun it in CI, 2021-09-23).  This series marks certainly another milestone.\n\nI have left a few comments, none of them important.  The series looks\ngood to me.  Just in case you re-roll, while reading the series I\nspotted some nits:\n\ndiff --git a/bisect.c b/bisect.c\nindex 518be70aa3..0e804086cb 100644\n--- a/bisect.c\n+++ b/bisect.c\n@@ -641,7 +641,7 @@ static struct commit_list *skip_away(struct commit_list *list, int count)\n                        else if (previous)\n                                result = previous;\n                        else\n-                               result =  list;\n+                               result = list;\n                        break;\n                }\n                previous = cur;\ndiff --git a/builtin/init-db.c b/builtin/init-db.c\nindex 9e069e2742..096f96b9c4 100644\n--- a/builtin/init-db.c\n+++ b/builtin/init-db.c\n@@ -248,9 +248,9 @@ int cmd_init_db(int argc,\n        }\n \n        flags |= INIT_DB_EXIST_OK;\n-       ret =  init_db(git_dir, real_git_dir, template_dir, hash_algo,\n-                      ref_storage_format, initial_branch,\n-                      init_shared_repository, flags);\n+       ret = init_db(git_dir, real_git_dir, template_dir, hash_algo,\n+                     ref_storage_format, initial_branch,\n+                     init_shared_repository, flags);\n \n        free(template_dir_to_free);\n        free(real_git_dir_to_free);\n\n\n> \n> So once this series lands, the expectation is that any newly added test\n> needs to be leak free by default. We still have an escape hatch in the\n> form of the SANITIZE_LEAK prerequisite, but patch authors are expected\n> to provide good arguments why their test cannot be made leak free.\n> \n> This series is built on top of 8f8d6eee53 (The seventh batch,\n> 2024-11-01) with ps/leakfixes-part-9 at c810549be1\n> (list-objects-filter-options: work around reported leak on error,\n> 2024-11-05) merged into it.\n> \n> The series has some trivial conflicts with the removed test annotations\n> when merging with `seen`. There are two topics in-flight that introduce\n> new memory leaks (ds/path-walk and cc/promisor-remote-capability), both\n> of which are fixed by the below patch. I've sent a message in response\n> to the individual commits that introduce the leaks.\n> \n> Thanks!\n> \n> Patrick\n"},{"id":"506974","messageId":"ZzHJx34wavjbGeqr@pks.im","threadId":"62459","inReplyTo":"41165e8c-eb5d-4fda-8f6b-67b7ec74bcbe@gmail.com","subject":"Re: [PATCH 09/26] strvec: introduce new `strvec_splice()` function","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T09:09:27Z","receivedAt":"2024-11-11T09:09:38Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"On Sun, Nov 10, 2024 at 10:39:08PM +0100, Rubén Justo wrote:\n> On Wed, Nov 06, 2024 at 04:10:44PM +0100, Patrick Steinhardt wrote:\n> > Introduce a new `strvec_splice()` function that can replace a range of\n> > strings in the vector with another array of strings. This function will\n> > be used in subsequent commits.\n> > \n> > Signed-off-by: Patrick Steinhardt <ps@pks.im>\n> > ---\n> >  strvec.c              | 19 +++++++++++++\n> >  strvec.h              |  9 ++++++\n> >  t/unit-tests/strvec.c | 65 +++++++++++++++++++++++++++++++++++++++++++\n> >  3 files changed, 93 insertions(+)\n> > \n> > diff --git a/strvec.c b/strvec.c\n> > index f712070f574..81075c50cca 100644\n> > --- a/strvec.c\n> > +++ b/strvec.c\n> > @@ -56,6 +56,25 @@ void strvec_pushv(struct strvec *array, const char **items)\n> >  \t\tstrvec_push(array, *items);\n> >  }\n> >  \n> > +void strvec_splice(struct strvec *array, size_t pos, size_t len,\n> > +\t\t   const char **replacement, size_t replacement_len)\n> \n> There's nothing wrong with `replacement_len`, but it has caught my\n> attention because in other strvec APIs we use null-terminated arrays.\n\nFair enough, but we do end up using this in a subsequent patch, as you\ndiscovered in the next patch. So I'll leave this as-is.\n\nPatrick\n"},{"id":"506975","messageId":"ZzHJy6XRywOltUx1@pks.im","threadId":"62459","inReplyTo":"c376f2ef-fc43-4815-8e26-f13da3729ed1@gmail.com","subject":"Re: [PATCH 15/26] help: fix leaking `struct cmdnames`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T09:09:31Z","receivedAt":"2024-11-11T09:09:41Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"On Sun, Nov 10, 2024 at 10:46:29PM +0100, Rubén Justo wrote:\n> On Wed, Nov 06, 2024 at 04:11:03PM +0100, Patrick Steinhardt wrote:\n> > @@ -630,7 +631,7 @@ const char *help_unknown_cmd(const char *cmd)\n> >  \n> >  \tif (cfg.autocorrect == AUTOCORRECT_NEVER) {\n> >  \t\tfprintf_ln(stderr, _(\"git: '%s' is not a git command. See 'git --help'.\"), cmd);\n> > -\t\texit(1);\n> > +\t\tgoto out;\n> \n> We haven't set a value for `assumed` at this point, so it's NULL, and in the\n> new exit path we `exit(1)` when `assumed` is NULL.  OK.\n> \n> However, I think we don't need this change.  And keeping the `exit(1)` close to\n> the error message seems like a good idea.  Perhaps, in another series, we could\n> change it to `die()`.\n\nYeah, good point indeed. I'll adapt this.\n\nPatrick\n"},{"id":"506976","messageId":"ZzHJz_E2lEiAHr45@pks.im","threadId":"62459","inReplyTo":"f3c10656-94a1-42b2-94bf-253978c278ab@gmail.com","subject":"Re: [PATCH 21/26] git-compat-util: drop `UNLEAK()` annotation","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T09:09:35Z","receivedAt":"2024-11-11T09:09:45Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"On Sun, Nov 10, 2024 at 10:47:58PM +0100, Rubén Justo wrote:\n> On Wed, Nov 06, 2024 at 04:11:21PM +0100, Patrick Steinhardt wrote:\n> > There are two users of `UNLEAK()` left in our codebase:\n> > \n> >   - In \"builtin/clone.c\", annotating the `repo` variable. That leak has\n> >     already been fixed though as you can see in the context, where we do\n> >     know to free `repo_to_free`.\n> > \n> >   - In \"builtin/diff.c\", to unleak entries of the `blob[]` array. That\n> >     leak has also been fixed, because the entries we assign to that\n> >     array come from `rev.pending.objects`, and we do eventually release\n> >     `rev`.\n> > \n> > This neatly demonstrates one of the issues with `UNLEAK()`: it is quite\n> > easy for the annotation to become stale. A second issue is that its\n> > whole intent is to paper over leaks. And while that has been a necessary\n> > evil in the past, because Git was leaking left and right, it isn't\n> > really much of an issue nowadays where our test suite has no known leaks\n> > anymore.\n> > \n> > Remove the last two users\n> \n> OK.\n> \n> > and drop the now-unused `UNLEAK()` annotation.\n> \n> Perhaps it would be convenient to do this as a separate commit.\n> \n> Just for reference we have this annotation since 0e5bba53af (add\n> UNLEAK annotation for reducing leak false positives, 2017-09-08).\n\nMakes sense, will do.\n\nPatrick\n"},{"id":"506977","messageId":"ZzHJ1IyRhA-YquN0@pks.im","threadId":"62459","inReplyTo":"b1cf41c5-ec47-43e2-8a99-3f5faba4d261@gmail.com","subject":"Re: [PATCH 00/26] Memory leak fixes (pt.10, final)","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T09:09:40Z","receivedAt":"2024-11-11T09:09:50Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"On Sun, Nov 10, 2024 at 10:48:53PM +0100, Rubén Justo wrote:\n> On Wed, Nov 06, 2024 at 04:10:14PM +0100, Patrick Steinhardt wrote:\n> > Hi,\n> > \n> > this is the last part of my series of memory leak fixes. This series\n> > goes a bit further than past series:\n> > \n> >   - Patches 1 to 16 plug remaining memory leaks exposed by our test\n> >     suite.\n> > \n> >   - Patches 17 to 21 remove the last remaining `UNLEAK()` annotations\n> >     and ultimately remove the macro itself.\n> > \n> >   - Patch 22 works around a bug in the leak sanitizer itself.\n> > \n> >   - Patches 23 and 24 drop annotations where leak-free tests pass with\n> >     the leak sanitizer.\n> > \n> >   - Patches 25 and 26 unconditionally enable leak checking in all newly\n> >     added tests and then drop the `TEST_PASSES_SANITIZE_LEAK`\n> >     annotation.\n> \n> Hi Patrick.\n> \n> Thanks for working on this.\n> \n> It's been a while since 956d2e4639 (tests: add a test mode for SANITIZE=leak,\n> run it in CI, 2021-09-23).  This series marks certainly another milestone.\n> \n> I have left a few comments, none of them important.  The series looks\n> good to me.  Just in case you re-roll, while reading the series I\n> spotted some nits:\n\nThanks for your review, I've addressed your comments and will send out\nv2 soonish!\n\npatrick\n"}]}