threads / patch / 62477

v2, 27 partsbuiltin/blame: fix leaking blame entries with `--incremental`

Subject: [PATCH v2 01/27] builtin/blame: fix leaking blame entries with `--incremental`

## tl;dr

45 messages between Nov 11, 2024 and Nov 21, 2024. Diffs are folded; open one to read it.

replies: 44people: 5as markdown or json

Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · lore

[PATCH v2 00/27] Memory leak fixes (pt.10, final)

Hi,

this is the last part of my series of memory leak fixes. This series goes a bit further than past series:

  - Patches 1 to 16 plug remaining memory leaks exposed by our test
    suite.
  - Patches 17 to 22 remove the last remaining `UNLEAK()` annotations
    and ultimately remove the macro itself.
  - Patch 23 works around a bug in the leak sanitizer itself.
  - Patches 24 and 25 drop annotations where leak-free tests pass with
    the leak sanitizer.
  - Patches 26 and 27 unconditionally enable leak checking in all newly
    added tests and then drop the `TEST_PASSES_SANITIZE_LEAK`
    annotation.

So once this series lands, the expectation is that any newly added test needs to be leak free by default. We still have an escape hatch in the form of the SANITIZE_LEAK prerequisite, but patch authors are expected to provide good arguments why their test cannot be made leak free.

Changes in v2:
  - Some fixes to code formatting.
  - Simplify the memory leak fixes in "help.c".
  - Split out the removal of `UNLEAK()` into its own commit.
Link to v1: https://lore.kernel.org/r/cover.1730901926.git.ps@pks.im
Thanks!
Patrick
To: git@vger.kernel.org
Cc: Rubén Justo <rjusto@gmail.com>
Patrick Steinhardt (27):
      builtin/blame: fix leaking blame entries with `--incremental`
      bisect: fix leaking good/bad terms when reading multipe times
      bisect: fix leaking string in `handle_bad_merge_base()`
      bisect: fix leaking `current_bad_oid`
      bisect: fix multiple leaks in `bisect_next_all()`
      bisect: fix leaking commit list items in `check_merge_base()`
      bisect: fix various cases where we leak commit list items
      line-log: fix leak when rewriting commit parents
      strvec: introduce new `strvec_splice()` function
      git: refactor alias handling to use a `struct strvec`
      git: refactor builtin handling to use a `struct strvec`
      split-index: fix memory leak in `move_cache_to_base_index()`
      builtin/sparse-checkout: fix leaking sanitized patterns
      help: refactor to not use globals for reading config
      help: fix leaking `struct cmdnames`
      help: fix leaking return value from `help_unknown_cmd()`
      builtin/help: fix leaks in `check_git_cmd()`
      builtin/init-db: fix leaking directory paths
      builtin/branch: fix leaking sorting options
      t/helper: fix leaking commit graph in "read-graph" subcommand
      global: drop `UNLEAK()` annotation
      git-compat-util: drop now-unused `UNLEAK()` macro
      t5601: work around leak sanitizer issue
      t: mark some tests as leak free
      t: remove unneeded !SANITIZE_LEAK prerequisites
      test-lib: unconditionally enable leak checking
      t: remove TEST_PASSES_SANITIZE_LEAK annotations
 bisect.c                                           |  61 +++++++---
 bisect.h                                           |   2 +-
 blame.c                                            |   1 +
 blame.h                                            |   2 +-
 builtin/blame.c                                    |  12 +-
 builtin/branch.c                                   |  33 ++++--
 builtin/clone.c                                    |   1 -
 builtin/diff.c                                     |   1 -
 builtin/help.c                                     |  13 ++-
 builtin/init-db.c                                  |  34 +++---
 builtin/sparse-checkout.c                          |  61 ++++++----
 ci/lib.sh                                          |   1 -
 git-compat-util.h                                  |  20 ----
 git.c                                              | 124 +++++++++++----------
 help.c                                             |  58 +++++-----
 help.h                                             |   2 +-
 line-log.c                                         |   1 +
 revision.c                                         |   4 +-
 split-index.c                                      |   6 +-
 strvec.c                                           |  19 ++++
 strvec.h                                           |   9 ++
 t/README                                           |  21 ----
 t/helper/test-read-graph.c                         |   3 +-
 t/lib-git-svn.sh                                   |   4 -
 t/t0001-init.sh                                    |   1 -
 t/t0002-gitfile.sh                                 |   1 -
 t/t0003-attributes.sh                              |   1 -
 t/t0004-unwritable.sh                              |   1 -
 t/t0005-signals.sh                                 |   1 -
 t/t0006-date.sh                                    |   1 -
 t/t0007-git-var.sh                                 |   1 -
 t/t0008-ignores.sh                                 |   1 -
 t/t0010-racy-git.sh                                |   1 -
 t/t0012-help.sh                                    |   1 -
 t/t0013-sha1dc.sh                                  |   1 -
 t/t0017-env-helper.sh                              |   1 -
 t/t0018-advice.sh                                  |   1 -
 t/t0019-json-writer.sh                             |   1 -
 t/t0020-crlf.sh                                    |   1 -
 t/t0021-conversion.sh                              |   1 -
 t/t0022-crlf-rename.sh                             |   1 -
 t/t0023-crlf-am.sh                                 |   1 -
 t/t0024-crlf-archive.sh                            |   1 -
 t/t0025-crlf-renormalize.sh                        |   1 -
 t/t0026-eol-config.sh                              |   1 -
 t/t0027-auto-crlf.sh                               |   1 -
 t/t0028-working-tree-encoding.sh                   |   1 -
 t/t0029-core-unsetenvvars.sh                       |   1 -
 t/t0030-stripspace.sh                              |   1 -
 t/t0033-safe-directory.sh                          |   1 -
 t/t0035-safe-bare-repository.sh                    |   1 -
 t/t0040-parse-options.sh                           |   1 -
 t/t0041-usage.sh                                   |   1 -
 t/t0050-filesystem.sh                              |   1 -
 t/t0052-simple-ipc.sh                              |   1 -
 t/t0055-beyond-symlinks.sh                         |   1 -
 t/t0056-git-C.sh                                   |   1 -
 t/t0060-path-utils.sh                              |   1 -
 t/t0061-run-command.sh                             |   1 -
 t/t0062-revision-walking.sh                        |   1 -
 t/t0063-string-list.sh                             |   1 -
 t/t0066-dir-iterator.sh                            |   1 -
 t/t0067-parse_pathspec_file.sh                     |   1 -
 t/t0068-for-each-repo.sh                           |   1 -
 t/t0070-fundamental.sh                             |   1 -
 t/t0071-sort.sh                                    |   1 -
 t/t0080-unit-test-output.sh                        |   1 -
 t/t0081-find-pack.sh                               |   1 -
 t/t0090-cache-tree.sh                              |   1 -
 t/t0091-bugreport.sh                               |   1 -
 t/t0092-diagnose.sh                                |   1 -
 t/t0095-bloom.sh                                   |   3 +-
 t/t0100-previous.sh                                |   1 -
 t/t0101-at-syntax.sh                               |   1 -
 t/t0200-gettext-basic.sh                           |   1 -
 t/t0201-gettext-fallbacks.sh                       |   1 -
 t/t0202-gettext-perl.sh                            |   1 -
 t/t0203-gettext-setlocale-sanity.sh                |   1 -
 t/t0204-gettext-reencode-sanity.sh                 |   1 -
 t/t0210-trace2-normal.sh                           |   1 -
 t/t0211-trace2-perf.sh                             |   1 -
 t/t0212-trace2-event.sh                            |   1 -
 t/t0300-credentials.sh                             |   1 -
 t/t0301-credential-cache.sh                        |   1 -
 t/t0302-credential-store.sh                        |   1 -
 t/t0303-credential-external.sh                     |   1 -
 t/t0410-partial-clone.sh                           |   1 -
 t/t0411-clone-from-partial.sh                      |   1 -
 t/t0450-txt-doc-vs-help.sh                         |   1 -
 t/t0500-progress-display.sh                        |   1 -
 t/t0600-reffiles-backend.sh                        |   1 -
 t/t0601-reffiles-pack-refs.sh                      |   1 -
 t/t0602-reffiles-fsck.sh                           |   1 -
 t/t0610-reftable-basics.sh                         |   1 -
 t/t0611-reftable-httpd.sh                          |   1 -
 t/t0612-reftable-jgit-compatibility.sh             |   1 -
 t/t0613-reftable-write-options.sh                  |   1 -
 t/t1000-read-tree-m-3way.sh                        |   1 -
 t/t1001-read-tree-m-2way.sh                        |   1 -
 t/t1002-read-tree-m-u-2way.sh                      |   1 -
 t/t1003-read-tree-prefix.sh                        |   1 -
 t/t1004-read-tree-m-u-wf.sh                        |   1 -
 t/t1005-read-tree-reset.sh                         |   1 -
 t/t1006-cat-file.sh                                |   1 -
 t/t1007-hash-object.sh                             |   1 -
 t/t1008-read-tree-overlay.sh                       |   1 -
 t/t1009-read-tree-new-index.sh                     |   1 -
 t/t1010-mktree.sh                                  |   1 -
 t/t1011-read-tree-sparse-checkout.sh               |   1 -
 t/t1012-read-tree-df.sh                            |   1 -
 t/t1013-read-tree-submodule.sh                     |   1 -
 t/t1014-read-tree-confusing.sh                     |   1 -
 t/t1015-read-index-unmerged.sh                     |   1 -
 t/t1016-compatObjectFormat.sh                      |   1 -
 t/t1020-subdirectory.sh                            |   1 -
 t/t1021-rerere-in-workdir.sh                       |   1 -
 t/t1022-read-tree-partial-clone.sh                 |   1 -
 t/t1050-large.sh                                   |   1 -
 t/t1051-large-conversion.sh                        |   1 -
 t/t1060-object-corruption.sh                       |   1 -
 t/t1090-sparse-checkout-scope.sh                   |   1 -
 t/t1091-sparse-checkout-builtin.sh                 |   1 -
 t/t1092-sparse-checkout-compatibility.sh           |   1 -
 t/t1100-commit-tree-options.sh                     |   1 -
 t/t1300-config.sh                                  |   1 -
 t/t1301-shared-repo.sh                             |   1 -
 t/t1302-repo-version.sh                            |   1 -
 t/t1303-wacky-config.sh                            |   1 -
 t/t1304-default-acl.sh                             |   1 -
 t/t1305-config-include.sh                          |   1 -
 t/t1306-xdg-files.sh                               |   1 -
 t/t1307-config-blob.sh                             |   1 -
 t/t1308-config-set.sh                              |   1 -
 t/t1309-early-config.sh                            |   1 -
 t/t1310-config-default.sh                          |   1 -
 t/t1350-config-hooks-path.sh                       |   1 -
 t/t1400-update-ref.sh                              |   1 -
 t/t1401-symbolic-ref.sh                            |   1 -
 t/t1402-check-ref-format.sh                        |   1 -
 t/t1403-show-ref.sh                                |   1 -
 t/t1404-update-ref-errors.sh                       |   1 -
 t/t1405-main-ref-store.sh                          |   1 -
 t/t1406-submodule-ref-store.sh                     |   1 -
 t/t1407-worktree-ref-store.sh                      |   1 -
 t/t1408-packed-refs.sh                             |   1 -
 t/t1409-avoid-packing-refs.sh                      |   1 -
 t/t1410-reflog.sh                                  |   1 -
 t/t1411-reflog-show.sh                             |   1 -
 t/t1412-reflog-loop.sh                             |   1 -
 t/t1413-reflog-detach.sh                           |   1 -
 t/t1414-reflog-walk.sh                             |   1 -
 t/t1415-worktree-refs.sh                           |   1 -
 t/t1416-ref-transaction-hooks.sh                   |   1 -
 t/t1417-reflog-updateref.sh                        |   1 -
 t/t1418-reflog-exists.sh                           |   1 -
 t/t1419-exclude-refs.sh                            |   1 -
 t/t1420-lost-found.sh                              |   1 -
 t/t1430-bad-ref-name.sh                            |   1 -
 t/t1450-fsck.sh                                    |   1 -
 t/t1451-fsck-buffer.sh                             |   1 -
 t/t1460-refs-migrate.sh                            |   1 -
 t/t1500-rev-parse.sh                               |   1 -
 t/t1501-work-tree.sh                               |   1 -
 t/t1502-rev-parse-parseopt.sh                      |   1 -
 t/t1503-rev-parse-verify.sh                        |   1 -
 t/t1504-ceiling-dirs.sh                            |   1 -
 t/t1505-rev-parse-last.sh                          |   1 -
 t/t1506-rev-parse-diagnosis.sh                     |   1 -
 t/t1507-rev-parse-upstream.sh                      |   1 -
 t/t1508-at-combinations.sh                         |   1 -
 t/t1510-repo-setup.sh                              |   1 -
 t/t1511-rev-parse-caret.sh                         |   1 -
 t/t1512-rev-parse-disambiguation.sh                |   1 -
 t/t1513-rev-parse-prefix.sh                        |   1 -
 t/t1514-rev-parse-push.sh                          |   1 -
 t/t1515-rev-parse-outside-repo.sh                  |   1 -
 t/t1517-outside-repo.sh                            |   1 -
 t/t1600-index.sh                                   |   1 -
 t/t1601-index-bogus.sh                             |   1 -
 t/t1701-racy-split-index.sh                        |   1 -
 t/t1800-hook.sh                                    |   1 -
 t/t2000-conflict-when-checking-files-out.sh        |   1 -
 t/t2002-checkout-cache-u.sh                        |   1 -
 t/t2003-checkout-cache-mkdir.sh                    |   1 -
 t/t2004-checkout-cache-temp.sh                     |   1 -
 t/t2005-checkout-index-symlinks.sh                 |   1 -
 t/t2006-checkout-index-basic.sh                    |   1 -
 t/t2007-checkout-symlink.sh                        |   1 -
 t/t2008-checkout-subdir.sh                         |   1 -
 t/t2009-checkout-statinfo.sh                       |   1 -
 t/t2010-checkout-ambiguous.sh                      |   1 -
 t/t2011-checkout-invalid-head.sh                   |   1 -
 t/t2012-checkout-last.sh                           |   1 -
 t/t2013-checkout-submodule.sh                      |   1 -
 t/t2014-checkout-switch.sh                         |   1 -
 t/t2015-checkout-unborn.sh                         |   1 -
 t/t2016-checkout-patch.sh                          |   1 -
 t/t2017-checkout-orphan.sh                         |   1 -
 t/t2018-checkout-branch.sh                         |   1 -
 t/t2019-checkout-ambiguous-ref.sh                  |   1 -
 t/t2020-checkout-detach.sh                         |   1 -
 t/t2021-checkout-overwrite.sh                      |   1 -
 t/t2022-checkout-paths.sh                          |   1 -
 t/t2023-checkout-m.sh                              |   1 -
 t/t2024-checkout-dwim.sh                           |   1 -
 t/t2025-checkout-no-overlay.sh                     |   1 -
 t/t2026-checkout-pathspec-file.sh                  |   1 -
 t/t2027-checkout-track.sh                          |   1 -
 t/t2030-unresolve-info.sh                          |   1 -
 t/t2050-git-dir-relative.sh                        |   1 -
 t/t2060-switch.sh                                  |   1 -
 t/t2070-restore.sh                                 |   1 -
 t/t2071-restore-patch.sh                           |   1 -
 t/t2072-restore-pathspec-file.sh                   |   1 -
 t/t2080-parallel-checkout-basics.sh                |   1 -
 t/t2081-parallel-checkout-collisions.sh            |   1 -
 t/t2082-parallel-checkout-attributes.sh            |   1 -
 t/t2100-update-cache-badpath.sh                    |   1 -
 t/t2101-update-index-reupdate.sh                   |   1 -
 t/t2102-update-index-symlinks.sh                   |   1 -
 t/t2103-update-index-ignore-missing.sh             |   1 -
 t/t2104-update-index-skip-worktree.sh              |   1 -
 t/t2105-update-index-gitfile.sh                    |   1 -
 t/t2106-update-index-assume-unchanged.sh           |   1 -
 t/t2107-update-index-basic.sh                      |   1 -
 t/t2108-update-index-refresh-racy.sh               |   1 -
 t/t2200-add-update.sh                              |   1 -
 t/t2201-add-update-typechange.sh                   |   1 -
 t/t2202-add-addremove.sh                           |   1 -
 t/t2203-add-intent.sh                              |   1 -
 t/t2204-add-ignored.sh                             |   1 -
 t/t2205-add-worktree-config.sh                     |   1 -
 t/t2300-cd-to-toplevel.sh                          |   1 -
 t/t2400-worktree-add.sh                            |   1 -
 t/t2401-worktree-prune.sh                          |   1 -
 t/t2402-worktree-list.sh                           |   1 -
 t/t2403-worktree-move.sh                           |   1 -
 t/t2404-worktree-config.sh                         |   1 -
 t/t2405-worktree-submodule.sh                      |   1 -
 t/t2406-worktree-repair.sh                         |   1 -
 t/t2407-worktree-heads.sh                          |  17 ++-
 t/t2408-worktree-relative.sh                       |   1 -
 t/t2500-untracked-overwriting.sh                   |   1 -
 t/t2501-cwd-empty.sh                               |   1 -
 t/t3000-ls-files-others.sh                         |   1 -
 t/t3001-ls-files-others-exclude.sh                 |   1 -
 t/t3002-ls-files-dashpath.sh                       |   1 -
 t/t3003-ls-files-exclude.sh                        |   1 -
 t/t3004-ls-files-basic.sh                          |   1 -
 t/t3005-ls-files-relative.sh                       |   1 -
 t/t3006-ls-files-long.sh                           |   1 -
 t/t3007-ls-files-recurse-submodules.sh             |   1 -
 t/t3008-ls-files-lazy-init-name-hash.sh            |   1 -
 t/t3009-ls-files-others-nonsubmodule.sh            |   1 -
 t/t3010-ls-files-killed-modified.sh                |   1 -
 t/t3011-common-prefixes-and-directory-traversal.sh |   1 -
 t/t3012-ls-files-dedup.sh                          |   1 -
 t/t3013-ls-files-format.sh                         |   1 -
 t/t3020-ls-files-error-unmatch.sh                  |   1 -
 t/t3040-subprojects-basic.sh                       |   1 -
 t/t3050-subprojects-fetch.sh                       |   1 -
 t/t3060-ls-files-with-tree.sh                      |   1 -
 t/t3070-wildmatch.sh                               |   1 -
 t/t3100-ls-tree-restrict.sh                        |   1 -
 t/t3101-ls-tree-dirname.sh                         |   1 -
 t/t3102-ls-tree-wildcards.sh                       |   1 -
 t/t3103-ls-tree-misc.sh                            |   1 -
 t/t3104-ls-tree-format.sh                          |   1 -
 t/t3105-ls-tree-output.sh                          |   1 -
 t/t3200-branch.sh                                  |   1 -
 t/t3201-branch-contains.sh                         |   1 -
 t/t3202-show-branch.sh                             |   1 -
 t/t3203-branch-output.sh                           |   1 -
 t/t3204-branch-name-interpretation.sh              |   1 -
 t/t3205-branch-color.sh                            |   1 -
 t/t3206-range-diff.sh                              |   1 -
 t/t3207-branch-submodule.sh                        |   1 -
 t/t3211-peel-ref.sh                                |   1 -
 t/t3300-funny-names.sh                             |   1 -
 t/t3301-notes.sh                                   |   1 -
 t/t3302-notes-index-expensive.sh                   |   1 -
 t/t3303-notes-subtrees.sh                          |   1 -
 t/t3304-notes-mixed.sh                             |   1 -
 t/t3305-notes-fanout.sh                            |   1 -
 t/t3306-notes-prune.sh                             |   1 -
 t/t3307-notes-man.sh                               |   1 -
 t/t3308-notes-merge.sh                             |   1 -
 t/t3309-notes-merge-auto-resolve.sh                |   1 -
 t/t3310-notes-merge-manual-resolve.sh              |   1 -
 t/t3311-notes-merge-fanout.sh                      |   1 -
 t/t3320-notes-merge-worktrees.sh                   |   1 -
 t/t3321-notes-stripspace.sh                        |   1 -
 t/t3400-rebase.sh                                  |   1 -
 t/t3401-rebase-and-am-rename.sh                    |   1 -
 t/t3402-rebase-merge.sh                            |   1 -
 t/t3403-rebase-skip.sh                             |   1 -
 t/t3404-rebase-interactive.sh                      |   1 -
 t/t3405-rebase-malformed.sh                        |   1 -
 t/t3406-rebase-message.sh                          |   1 -
 t/t3407-rebase-abort.sh                            |   1 -
 t/t3408-rebase-multi-line.sh                       |   1 -
 t/t3409-rebase-environ.sh                          |   1 -
 t/t3412-rebase-root.sh                             |   1 -
 t/t3413-rebase-hook.sh                             |   1 -
 t/t3415-rebase-autosquash.sh                       |   1 -
 t/t3416-rebase-onto-threedots.sh                   |   1 -
 t/t3417-rebase-whitespace-fix.sh                   |   1 -
 t/t3418-rebase-continue.sh                         |   1 -
 t/t3419-rebase-patch-id.sh                         |   1 -
 t/t3420-rebase-autostash.sh                        |   1 -
 t/t3421-rebase-topology-linear.sh                  |   1 -
 t/t3422-rebase-incompatible-options.sh             |   1 -
 t/t3423-rebase-reword.sh                           |   1 -
 t/t3424-rebase-empty.sh                            |   1 -
 t/t3425-rebase-topology-merges.sh                  |   1 -
 t/t3426-rebase-submodule.sh                        |   1 -
 t/t3427-rebase-subtree.sh                          |   1 -
 t/t3428-rebase-signoff.sh                          |   1 -
 t/t3429-rebase-edit-todo.sh                        |   1 -
 t/t3430-rebase-merges.sh                           |   1 -
 t/t3431-rebase-fork-point.sh                       |   1 -
 t/t3432-rebase-fast-forward.sh                     |   1 -
 t/t3433-rebase-across-mode-change.sh               |   1 -
 t/t3434-rebase-i18n.sh                             |   1 -
 t/t3435-rebase-gpg-sign.sh                         |   1 -
 t/t3436-rebase-more-options.sh                     |   1 -
 t/t3437-rebase-fixup-options.sh                    |   1 -
 t/t3438-rebase-broken-files.sh                     |   1 -
 t/t3500-cherry.sh                                  |   1 -
 t/t3501-revert-cherry-pick.sh                      |   1 -
 t/t3502-cherry-pick-merge.sh                       |   1 -
 t/t3503-cherry-pick-root.sh                        |   1 -
 t/t3504-cherry-pick-rerere.sh                      |   1 -
 t/t3505-cherry-pick-empty.sh                       |   1 -
 t/t3506-cherry-pick-ff.sh                          |   1 -
 t/t3507-cherry-pick-conflict.sh                    |   1 -
 t/t3508-cherry-pick-many-commits.sh                |   1 -
 t/t3509-cherry-pick-merge-df.sh                    |   1 -
 t/t3510-cherry-pick-sequence.sh                    |   1 -
 t/t3511-cherry-pick-x.sh                           |   1 -
 t/t3512-cherry-pick-submodule.sh                   |   1 -
 t/t3513-revert-submodule.sh                        |   1 -
 t/t3514-cherry-pick-revert-gpg.sh                  |   1 -
 t/t3600-rm.sh                                      |   1 -
 t/t3601-rm-pathspec-file.sh                        |   1 -
 t/t3602-rm-sparse-checkout.sh                      |   1 -
 t/t3650-replay-basics.sh                           |   1 -
 t/t3700-add.sh                                     |   1 -
 t/t3701-add-interactive.sh                         |   1 -
 t/t3702-add-edit.sh                                |   1 -
 t/t3703-add-magic-pathspec.sh                      |   1 -
 t/t3704-add-pathspec-file.sh                       |   1 -
 t/t3705-add-sparse-checkout.sh                     |   1 -
 t/t3800-mktag.sh                                   |   1 -
 t/t3900-i18n-commit.sh                             |   1 -
 t/t3901-i18n-patch.sh                              |   1 -
 t/t3902-quoted.sh                                  |   1 -
 t/t3903-stash.sh                                   |   1 -
 t/t3904-stash-patch.sh                             |   1 -
 t/t3905-stash-include-untracked.sh                 |   1 -
 t/t3906-stash-submodule.sh                         |   1 -
 t/t3907-stash-show-config.sh                       |   1 -
 t/t3908-stash-in-worktree.sh                       |   1 -
 t/t3909-stash-pathspec-file.sh                     |   1 -
 t/t3920-crlf-messages.sh                           |   1 -
 t/t4000-diff-format.sh                             |   1 -
 t/t4001-diff-rename.sh                             |   1 -
 t/t4002-diff-basic.sh                              |   1 -
 t/t4003-diff-rename-1.sh                           |   1 -
 t/t4004-diff-rename-symlink.sh                     |   1 -
 t/t4005-diff-rename-2.sh                           |   1 -
 t/t4006-diff-mode.sh                               |   1 -
 t/t4007-rename-3.sh                                |   1 -
 t/t4008-diff-break-rewrite.sh                      |   1 -
 t/t4009-diff-rename-4.sh                           |   1 -
 t/t4010-diff-pathspec.sh                           |   1 -
 t/t4011-diff-symlink.sh                            |   1 -
 t/t4012-diff-binary.sh                             |   1 -
 t/t4013-diff-various.sh                            |   1 -
 t/t4014-format-patch.sh                            |   1 -
 t/t4015-diff-whitespace.sh                         |   1 -
 t/t4016-diff-quote.sh                              |   1 -
 t/t4017-diff-retval.sh                             |   1 -
 t/t4018-diff-funcname.sh                           |   1 -
 t/t4019-diff-wserror.sh                            |   1 -
 t/t4020-diff-external.sh                           |   5 +-
 t/t4021-format-patch-numbered.sh                   |   1 -
 t/t4022-diff-rewrite.sh                            |   1 -
 t/t4023-diff-rename-typechange.sh                  |   1 -
 t/t4024-diff-optimize-common.sh                    |   1 -
 t/t4025-hunk-header.sh                             |   1 -
 t/t4026-color.sh                                   |   1 -
 t/t4027-diff-submodule.sh                          |   1 -
 t/t4028-format-patch-mime-headers.sh               |   1 -
 t/t4029-diff-trailing-space.sh                     |   1 -
 t/t4030-diff-textconv.sh                           |   1 -
 t/t4031-diff-rewrite-binary.sh                     |   1 -
 t/t4032-diff-inter-hunk-context.sh                 |   1 -
 t/t4033-diff-patience.sh                           |   1 -
 t/t4034-diff-words.sh                              |   1 -
 t/t4035-diff-quiet.sh                              |   1 -
 t/t4036-format-patch-signer-mime.sh                |   1 -
 t/t4037-diff-r-t-dirs.sh                           |   1 -
 t/t4038-diff-combined.sh                           |   1 -
 t/t4039-diff-assume-unchanged.sh                   |   1 -
 t/t4040-whitespace-status.sh                       |   1 -
 t/t4041-diff-submodule-option.sh                   |   1 -
 t/t4042-diff-textconv-caching.sh                   |   1 -
 t/t4043-diff-rename-binary.sh                      |   1 -
 t/t4044-diff-index-unique-abbrev.sh                |   1 -
 t/t4045-diff-relative.sh                           |   1 -
 t/t4046-diff-unmerged.sh                           |   1 -
 t/t4047-diff-dirstat.sh                            |   1 -
 t/t4048-diff-combined-binary.sh                    |   1 -
 t/t4049-diff-stat-count.sh                         |   1 -
 t/t4050-diff-histogram.sh                          |   1 -
 t/t4051-diff-function-context.sh                   |   1 -
 t/t4052-stat-output.sh                             |   1 -
 t/t4053-diff-no-index.sh                           |   1 -
 t/t4054-diff-bogus-tree.sh                         |   1 -
 t/t4055-diff-context.sh                            |   1 -
 t/t4056-diff-order.sh                              |   1 -
 t/t4057-diff-combined-paths.sh                     |   1 -
 t/t4058-diff-duplicates.sh                         |   1 -
 t/t4059-diff-submodule-not-initialized.sh          |   1 -
 t/t4060-diff-submodule-option-diff-format.sh       |   1 -
 t/t4061-diff-indent.sh                             |   1 -
 t/t4062-diff-pickaxe.sh                            |   1 -
 t/t4063-diff-blobs.sh                              |   1 -
 t/t4064-diff-oidfind.sh                            |   1 -
 t/t4065-diff-anchored.sh                           |   1 -
 t/t4066-diff-emit-delay.sh                         |   1 -
 t/t4067-diff-partial-clone.sh                      |   1 -
 t/t4068-diff-symmetric-merge-base.sh               |   1 -
 t/t4069-remerge-diff.sh                            |   1 -
 t/t4100-apply-stat.sh                              |   1 -
 t/t4101-apply-nonl.sh                              |   1 -
 t/t4102-apply-rename.sh                            |   1 -
 t/t4103-apply-binary.sh                            |   1 -
 t/t4104-apply-boundary.sh                          |   1 -
 t/t4105-apply-fuzz.sh                              |   1 -
 t/t4106-apply-stdin.sh                             |   1 -
 t/t4107-apply-ignore-whitespace.sh                 |   1 -
 t/t4108-apply-threeway.sh                          |   1 -
 t/t4109-apply-multifrag.sh                         |   1 -
 t/t4110-apply-scan.sh                              |   1 -
 t/t4111-apply-subdir.sh                            |   1 -
 t/t4112-apply-renames.sh                           |   1 -
 t/t4113-apply-ending.sh                            |   1 -
 t/t4114-apply-typechange.sh                        |   1 -
 t/t4115-apply-symlink.sh                           |   1 -
 t/t4116-apply-reverse.sh                           |   1 -
 t/t4117-apply-reject.sh                            |   1 -
 t/t4118-apply-empty-context.sh                     |   1 -
 t/t4119-apply-config.sh                            |   1 -
 t/t4120-apply-popt.sh                              |   1 -
 t/t4121-apply-diffs.sh                             |   1 -
 t/t4122-apply-symlink-inside.sh                    |   1 -
 t/t4123-apply-shrink.sh                            |   1 -
 t/t4124-apply-ws-rule.sh                           |   1 -
 t/t4125-apply-ws-fuzz.sh                           |   1 -
 t/t4126-apply-empty.sh                             |   1 -
 t/t4127-apply-same-fn.sh                           |   1 -
 t/t4128-apply-root.sh                              |   1 -
 t/t4129-apply-samemode.sh                          |   1 -
 t/t4130-apply-criss-cross-rename.sh                |   1 -
 t/t4131-apply-fake-ancestor.sh                     |   1 -
 t/t4132-apply-removal.sh                           |   1 -
 t/t4133-apply-filenames.sh                         |   1 -
 t/t4134-apply-submodule.sh                         |   1 -
 t/t4135-apply-weird-filenames.sh                   |   1 -
 t/t4136-apply-check.sh                             |   1 -
 t/t4137-apply-submodule.sh                         |   1 -
 t/t4138-apply-ws-expansion.sh                      |   1 -
 t/t4139-apply-escape.sh                            |   1 -
 t/t4140-apply-ita.sh                               |   1 -
 t/t4141-apply-too-large.sh                         |   1 -
 t/t4150-am.sh                                      |   1 -
 t/t4151-am-abort.sh                                |   1 -
 t/t4152-am-subjects.sh                             |   1 -
 t/t4153-am-resume-override-opts.sh                 |   1 -
 t/t4200-rerere.sh                                  |   1 -
 t/t4201-shortlog.sh                                |   1 -
 t/t4202-log.sh                                     |   1 -
 t/t4203-mailmap.sh                                 |   1 -
 t/t4204-patch-id.sh                                |   1 -
 t/t4205-log-pretty-formats.sh                      |   1 -
 t/t4206-log-follow-harder-copies.sh                |   1 -
 t/t4207-log-decoration-colors.sh                   |   1 -
 t/t4208-log-magic-pathspec.sh                      |   1 -
 t/t4209-log-pickaxe.sh                             |   1 -
 t/t4210-log-i18n.sh                                |   1 -
 t/t4212-log-corrupt.sh                             |   1 -
 t/t4213-log-tabexpand.sh                           |   1 -
 t/t4214-log-graph-octopus.sh                       |   1 -
 t/t4215-log-skewed-merges.sh                       |   1 -
 t/t4216-log-bloom.sh                               |   1 -
 t/t4217-log-limit.sh                               |   1 -
 t/t4252-am-options.sh                              |   1 -
 t/t4253-am-keep-cr-dos.sh                          |   1 -
 t/t4254-am-corrupt.sh                              |   1 -
 t/t4255-am-submodule.sh                            |   1 -
 t/t4256-am-format-flowed.sh                        |   1 -
 t/t4257-am-interactive.sh                          |   1 -
 t/t4258-am-quoted-cr.sh                            |   1 -
 t/t4300-merge-tree.sh                              |   1 -
 t/t4301-merge-tree-write-tree.sh                   |   1 -
 t/t5000-tar-tree.sh                                |   1 -
 t/t5001-archive-attr.sh                            |   1 -
 t/t5002-archive-attr-pattern.sh                    |   1 -
 t/t5003-archive-zip.sh                             |   1 -
 t/t5004-archive-corner-cases.sh                    |   1 -
 t/t5100-mailinfo.sh                                |   1 -
 t/t5150-request-pull.sh                            |   1 -
 t/t5200-update-server-info.sh                      |   1 -
 t/t5300-pack-object.sh                             |   1 -
 t/t5301-sliding-window.sh                          |   1 -
 t/t5302-pack-index.sh                              |   1 -
 t/t5303-pack-corruption-resilience.sh              |   1 -
 t/t5304-prune.sh                                   |   1 -
 t/t5305-include-tag.sh                             |   1 -
 t/t5306-pack-nobase.sh                             |   1 -
 t/t5307-pack-missing-commit.sh                     |   1 -
 t/t5308-pack-detect-duplicates.sh                  |   1 -
 t/t5309-pack-delta-cycles.sh                       |   1 -
 t/t5310-pack-bitmaps.sh                            |   1 -
 t/t5311-pack-bitmaps-shallow.sh                    |   1 -
 t/t5312-prune-corruption.sh                        |   1 -
 t/t5313-pack-bounds-checks.sh                      |   1 -
 t/t5314-pack-cycle-detection.sh                    |   1 -
 t/t5315-pack-objects-compression.sh                |   1 -
 t/t5316-pack-delta-depth.sh                        |   1 -
 t/t5317-pack-objects-filter-objects.sh             |   1 -
 t/t5318-commit-graph.sh                            |   1 -
 t/t5319-multi-pack-index.sh                        |   1 -
 t/t5320-delta-islands.sh                           |   1 -
 t/t5321-pack-large-objects.sh                      |   1 -
 t/t5322-pack-objects-sparse.sh                     |   1 -
 t/t5323-pack-redundant.sh                          |   1 -
 t/t5324-split-commit-graph.sh                      |   1 -
 t/t5325-reverse-index.sh                           |   1 -
 t/t5326-multi-pack-bitmaps.sh                      |   1 -
 t/t5327-multi-pack-bitmaps-rev.sh                  |   1 -
 t/t5328-commit-graph-64bit-time.sh                 |   1 -
 t/t5329-pack-objects-cruft.sh                      |   1 -
 t/t5330-no-lazy-fetch-with-commit-graph.sh         |   1 -
 t/t5331-pack-objects-stdin.sh                      |   1 -
 t/t5332-multi-pack-reuse.sh                        |   1 -
 t/t5333-pseudo-merge-bitmaps.sh                    |   1 -
 t/t5334-incremental-multi-pack-index.sh            |   1 -
 t/t5351-unpack-large-objects.sh                    |   1 -
 t/t5400-send-pack.sh                               |   1 -
 t/t5401-update-hooks.sh                            |   1 -
 t/t5402-post-merge-hook.sh                         |   1 -
 t/t5403-post-checkout-hook.sh                      |   1 -
 t/t5404-tracking-branches.sh                       |   1 -
 t/t5405-send-pack-rewind.sh                        |   1 -
 t/t5406-remote-rejects.sh                          |   1 -
 t/t5407-post-rewrite-hook.sh                       |   1 -
 t/t5408-send-pack-stdin.sh                         |   1 -
 t/t5409-colorize-remote-messages.sh                |   1 -
 t/t5410-receive-pack-alternates.sh                 |   1 -
 t/t5411-proc-receive-hook.sh                       |   1 -
 t/t5500-fetch-pack.sh                              |   1 -
 t/t5501-fetch-push-alternates.sh                   |   1 -
 t/t5502-quickfetch.sh                              |   1 -
 t/t5503-tagfollow.sh                               |   1 -
 t/t5504-fetch-receive-strict.sh                    |   1 -
 t/t5505-remote.sh                                  |   1 -
 t/t5506-remote-groups.sh                           |   1 -
 t/t5507-remote-environment.sh                      |   1 -
 t/t5509-fetch-push-namespaces.sh                   |   1 -
 t/t5510-fetch.sh                                   |   1 -
 t/t5511-refspec.sh                                 |   1 -
 t/t5512-ls-remote.sh                               |   1 -
 t/t5513-fetch-track.sh                             |   1 -
 t/t5514-fetch-multiple.sh                          |   1 -
 t/t5515-fetch-merge-logic.sh                       |   1 -
 t/t5516-fetch-push.sh                              |   1 -
 t/t5517-push-mirror.sh                             |   1 -
 t/t5518-fetch-exit-status.sh                       |   1 -
 t/t5519-push-alternates.sh                         |   1 -
 t/t5520-pull.sh                                    |   1 -
 t/t5521-pull-options.sh                            |   1 -
 t/t5522-pull-symlink.sh                            |   1 -
 t/t5523-push-upstream.sh                           |   1 -
 t/t5524-pull-msg.sh                                |   1 -
 t/t5525-fetch-tagopt.sh                            |   1 -
 t/t5526-fetch-submodules.sh                        |   1 -
 t/t5527-fetch-odd-refs.sh                          |   1 -
 t/t5528-push-default.sh                            |   1 -
 t/t5529-push-errors.sh                             |   1 -
 t/t5530-upload-pack-error.sh                       |   1 -
 t/t5531-deep-submodule-push.sh                     |   1 -
 t/t5532-fetch-proxy.sh                             |   1 -
 t/t5533-push-cas.sh                                |   1 -
 t/t5534-push-signed.sh                             |   1 -
 t/t5535-fetch-push-symref.sh                       |   1 -
 t/t5536-fetch-conflicts.sh                         |   1 -
 t/t5537-fetch-shallow.sh                           |   1 -
 t/t5538-push-shallow.sh                            |   1 -
 t/t5539-fetch-http-shallow.sh                      |   1 -
 t/t5540-http-push-webdav.sh                        |   1 -
 t/t5541-http-push-smart.sh                         |   1 -
 t/t5542-push-http-shallow.sh                       |   1 -
 t/t5543-atomic-push.sh                             |   1 -
 t/t5544-pack-objects-hook.sh                       |   1 -
 t/t5545-push-options.sh                            |   1 -
 t/t5546-receive-limits.sh                          |   1 -
 t/t5547-push-quarantine.sh                         |   1 -
 t/t5548-push-porcelain.sh                          |   1 -
 t/t5549-fetch-push-http.sh                         |   1 -
 t/t5550-http-fetch-dumb.sh                         |   1 -
 t/t5551-http-fetch-smart.sh                        |   1 -
 t/t5552-skipping-fetch-negotiator.sh               |   1 -
 t/t5553-set-upstream.sh                            |   1 -
 t/t5554-noop-fetch-negotiator.sh                   |   1 -
 t/t5555-http-smart-common.sh                       |   1 -
 t/t5557-http-get.sh                                |   1 -
 t/t5560-http-backend-noserver.sh                   |   1 -
 t/t5561-http-backend.sh                            |   1 -
 t/t5562-http-backend-content-length.sh             |   1 -
 t/t5563-simple-http-auth.sh                        |   1 -
 t/t5564-http-proxy.sh                              |   1 -
 t/t5570-git-daemon.sh                              |   1 -
 t/t5571-pre-push-hook.sh                           |   1 -
 t/t5572-pull-submodule.sh                          |   1 -
 t/t5573-pull-verify-signatures.sh                  |   1 -
 t/t5574-fetch-output.sh                            |   1 -
 t/t5580-unc-paths.sh                               |   1 -
 t/t5581-http-curl-verbose.sh                       |   1 -
 t/t5582-fetch-negative-refspec.sh                  |   1 -
 t/t5583-push-branches.sh                           |   1 -
 t/t5600-clone-fail-cleanup.sh                      |   1 -
 t/t5601-clone.sh                                   |  26 +++--
 t/t5602-clone-remote-exec.sh                       |   1 -
 t/t5603-clone-dirname.sh                           |   1 -
 t/t5604-clone-reference.sh                         |   1 -
 t/t5605-clone-local.sh                             |   1 -
 t/t5606-clone-options.sh                           |   1 -
 t/t5607-clone-bundle.sh                            |   1 -
 t/t5609-clone-branch.sh                            |   1 -
 t/t5610-clone-detached.sh                          |   1 -
 t/t5611-clone-config.sh                            |   1 -
 t/t5612-clone-refspec.sh                           |   1 -
 t/t5613-info-alternate.sh                          |   1 -
 t/t5614-clone-submodules-shallow.sh                |   1 -
 t/t5615-alternate-env.sh                           |   1 -
 t/t5616-partial-clone.sh                           |   1 -
 t/t5617-clone-submodules-remote.sh                 |   1 -
 t/t5618-alternate-refs.sh                          |   1 -
 t/t5619-clone-local-ambiguous-transport.sh         |   1 -
 t/t5700-protocol-v1.sh                             |   1 -
 t/t5701-git-serve.sh                               |   1 -
 t/t5702-protocol-v2.sh                             |   1 -
 t/t5703-upload-pack-ref-in-want.sh                 |   1 -
 t/t5704-protocol-violations.sh                     |   1 -
 t/t5705-session-id-in-capabilities.sh              |   1 -
 t/t5730-protocol-v2-bundle-uri-file.sh             |   1 -
 t/t5731-protocol-v2-bundle-uri-git.sh              |   1 -
 t/t5732-protocol-v2-bundle-uri-http.sh             |   1 -
 t/t5750-bundle-uri-parse.sh                        |   1 -
 t/t5801-remote-helpers.sh                          |   1 -
 t/t5802-connect-helper.sh                          |   1 -
 t/t5810-proto-disable-local.sh                     |   1 -
 t/t5811-proto-disable-git.sh                       |   1 -
 t/t5812-proto-disable-http.sh                      |   1 -
 t/t5813-proto-disable-ssh.sh                       |   1 -
 t/t5814-proto-disable-ext.sh                       |   1 -
 t/t5815-submodule-protos.sh                        |   1 -
 t/t5900-repo-selection.sh                          |   1 -
 t/t6000-rev-list-misc.sh                           |   1 -
 t/t6001-rev-list-graft.sh                          |   1 -
 t/t6002-rev-list-bisect.sh                         |   1 -
 t/t6003-rev-list-topo-order.sh                     |   1 -
 t/t6004-rev-list-path-optim.sh                     |   1 -
 t/t6005-rev-list-count.sh                          |   1 -
 t/t6006-rev-list-format.sh                         |   1 -
 t/t6007-rev-list-cherry-pick-file.sh               |   1 -
 t/t6008-rev-list-submodule.sh                      |   1 -
 t/t6009-rev-list-parent.sh                         |   1 -
 t/t6010-merge-base.sh                              |   1 -
 t/t6011-rev-list-with-bad-commit.sh                |   1 -
 t/t6012-rev-list-simplify.sh                       |   1 -
 t/t6013-rev-list-reverse-parents.sh                |   1 -
 t/t6014-rev-list-all.sh                            |   1 -
 t/t6016-rev-list-graph-simplify-history.sh         |   1 -
 t/t6017-rev-list-stdin.sh                          |   1 -
 t/t6018-rev-list-glob.sh                           |   1 -
 t/t6019-rev-list-ancestry-path.sh                  |   1 -
 t/t6020-bundle-misc.sh                             |   1 -
 t/t6021-rev-list-exclude-hidden.sh                 |   1 -
 t/t6022-rev-list-missing.sh                        |   1 -
 t/t6040-tracking-info.sh                           |   1 -
 t/t6041-bisect-submodule.sh                        |   1 -
 t/t6050-replace.sh                                 |   1 -
 t/t6060-merge-index.sh                             |   1 -
 t/t6100-rev-list-in-order.sh                       |   1 -
 t/t6101-rev-parse-parents.sh                       |   1 -
 t/t6102-rev-list-unexpected-objects.sh             |   1 -
 t/t6110-rev-list-sparse.sh                         |   1 -
 t/t6111-rev-list-treesame.sh                       |   1 -
 t/t6112-rev-list-filters-objects.sh                |   1 -
 t/t6113-rev-list-bitmap-filters.sh                 |   1 -
 t/t6114-keep-packs.sh                              |   1 -
 t/t6115-rev-list-du.sh                             |   1 -
 t/t6120-describe.sh                                |   1 -
 t/t6130-pathspec-noglob.sh                         |   1 -
 t/t6131-pathspec-icase.sh                          |   1 -
 t/t6132-pathspec-exclude.sh                        |   1 -
 t/t6133-pathspec-rev-dwim.sh                       |   1 -
 t/t6134-pathspec-in-submodule.sh                   |   1 -
 t/t6135-pathspec-with-attrs.sh                     |   1 -
 t/t6136-pathspec-in-bare.sh                        |   1 -
 t/t6200-fmt-merge-msg.sh                           |   1 -
 t/t6300-for-each-ref.sh                            |   1 -
 t/t6301-for-each-ref-errors.sh                     |   1 -
 t/t6302-for-each-ref-filter.sh                     |   1 -
 t/t6400-merge-df.sh                                |   1 -
 t/t6401-merge-criss-cross.sh                       |   1 -
 t/t6402-merge-rename.sh                            |   1 -
 t/t6403-merge-file.sh                              |   1 -
 t/t6404-recursive-merge.sh                         |   1 -
 t/t6405-merge-symlinks.sh                          |   1 -
 t/t6406-merge-attr.sh                              |   1 -
 t/t6407-merge-binary.sh                            |   1 -
 t/t6408-merge-up-to-date.sh                        |   1 -
 t/t6409-merge-subtree.sh                           |   1 -
 t/t6411-merge-filemode.sh                          |   1 -
 t/t6412-merge-large-rename.sh                      |   1 -
 t/t6413-merge-crlf.sh                              |   1 -
 t/t6414-merge-rename-nocruft.sh                    |   1 -
 t/t6415-merge-dir-to-symlink.sh                    |   1 -
 t/t6416-recursive-corner-cases.sh                  |   1 -
 t/t6417-merge-ours-theirs.sh                       |   1 -
 t/t6418-merge-text-auto.sh                         |   1 -
 t/t6421-merge-partial-clone.sh                     |   1 -
 t/t6422-merge-rename-corner-cases.sh               |   1 -
 t/t6423-merge-rename-directories.sh                |   1 -
 t/t6424-merge-unrelated-index-changes.sh           |   1 -
 t/t6425-merge-rename-delete.sh                     |   1 -
 t/t6426-merge-skip-unneeded-updates.sh             |   1 -
 t/t6427-diff3-conflict-markers.sh                  |   1 -
 t/t6428-merge-conflicts-sparse.sh                  |   1 -
 t/t6429-merge-sequence-rename-caching.sh           |   1 -
 t/t6430-merge-recursive.sh                         |   1 -
 t/t6431-merge-criscross.sh                         |   1 -
 t/t6432-merge-recursive-space-options.sh           |   1 -
 t/t6433-merge-toplevel.sh                          |   1 -
 t/t6434-merge-recursive-rename-options.sh          |   1 -
 t/t6435-merge-sparse.sh                            |   1 -
 t/t6436-merge-overwrite.sh                         |   1 -
 t/t6437-submodule-merge.sh                         |   1 -
 t/t6438-submodule-directory-file-conflicts.sh      |   1 -
 t/t6439-merge-co-error-msgs.sh                     |   1 -
 t/t6500-gc.sh                                      |   1 -
 t/t6501-freshen-objects.sh                         |   1 -
 t/t6600-test-reach.sh                              |   1 -
 t/t6700-tree-depth.sh                              |   1 -
 t/t7001-mv.sh                                      |   1 -
 t/t7002-mv-sparse-checkout.sh                      |   1 -
 t/t7003-filter-branch.sh                           |   1 -
 t/t7004-tag.sh                                     |   1 -
 t/t7005-editor.sh                                  |   1 -
 t/t7006-pager.sh                                   |   1 -
 t/t7007-show.sh                                    |   1 -
 t/t7008-filter-branch-null-sha1.sh                 |   1 -
 t/t7010-setup.sh                                   |   1 -
 t/t7011-skip-worktree-reading.sh                   |   1 -
 t/t7012-skip-worktree-writing.sh                   |   1 -
 t/t7030-verify-tag.sh                              |   1 -
 t/t7031-verify-tag-signed-ssh.sh                   |   1 -
 t/t7060-wtstatus.sh                                |   1 -
 t/t7061-wtstatus-ignore.sh                         |   1 -
 t/t7062-wtstatus-ignorecase.sh                     |   1 -
 t/t7063-status-untracked-cache.sh                  |   1 -
 t/t7064-wtstatus-pv2.sh                            |   1 -
 t/t7101-reset-empty-subdirs.sh                     |   1 -
 t/t7102-reset.sh                                   |   1 -
 t/t7103-reset-bare.sh                              |   1 -
 t/t7104-reset-hard.sh                              |   1 -
 t/t7105-reset-patch.sh                             |   1 -
 t/t7106-reset-unborn-branch.sh                     |   1 -
 t/t7107-reset-pathspec-file.sh                     |   1 -
 t/t7110-reset-merge.sh                             |   1 -
 t/t7111-reset-table.sh                             |   1 -
 t/t7112-reset-submodule.sh                         |   1 -
 t/t7113-post-index-change-hook.sh                  |   1 -
 t/t7201-co.sh                                      |   1 -
 t/t7300-clean.sh                                   |   1 -
 t/t7301-clean-interactive.sh                       |   1 -
 t/t7400-submodule-basic.sh                         |   1 -
 t/t7401-submodule-summary.sh                       |   1 -
 t/t7402-submodule-rebase.sh                        |   1 -
 t/t7403-submodule-sync.sh                          |   1 -
 t/t7406-submodule-update.sh                        |   1 -
 t/t7407-submodule-foreach.sh                       |   1 -
 t/t7408-submodule-reference.sh                     |   1 -
 t/t7409-submodule-detached-work-tree.sh            |   1 -
 t/t7411-submodule-config.sh                        |   1 -
 t/t7412-submodule-absorbgitdirs.sh                 |   1 -
 t/t7413-submodule-is-active.sh                     |   1 -
 t/t7414-submodule-mistakes.sh                      |   1 -
 t/t7416-submodule-dash-url.sh                      |   1 -
 t/t7417-submodule-path-url.sh                      |   1 -
 t/t7418-submodule-sparse-gitmodules.sh             |   1 -
 t/t7419-submodule-set-branch.sh                    |   1 -
 t/t7420-submodule-set-url.sh                       |   1 -
 t/t7421-submodule-summary-add.sh                   |   1 -
 t/t7422-submodule-output.sh                        |   1 -
 t/t7423-submodule-symlinks.sh                      |   1 -
 t/t7424-submodule-mixed-ref-formats.sh             |   1 -
 t/t7450-bad-git-dotfiles.sh                        |   1 -
 t/t7500-commit-template-squash-signoff.sh          |   1 -
 t/t7501-commit-basic-functionality.sh              |   1 -
 t/t7502-commit-porcelain.sh                        |   1 -
 t/t7503-pre-commit-and-pre-merge-commit-hooks.sh   |   1 -
 t/t7504-commit-msg-hook.sh                         |   1 -
 t/t7505-prepare-commit-msg-hook.sh                 |   1 -
 t/t7506-status-submodule.sh                        |   1 -
 t/t7507-commit-verbose.sh                          |   1 -
 t/t7508-status.sh                                  |   1 -
 t/t7509-commit-authorship.sh                       |   1 -
 t/t7510-signed-commit.sh                           |   1 -
 t/t7511-status-index.sh                            |   1 -
 t/t7512-status-help.sh                             |   1 -
 t/t7513-interpret-trailers.sh                      |   1 -
 t/t7514-commit-patch.sh                            |   1 -
 t/t7515-status-symlinks.sh                         |   1 -
 t/t7516-commit-races.sh                            |   1 -
 t/t7517-per-repo-email.sh                          |   1 -
 t/t7518-ident-corner-cases.sh                      |   1 -
 t/t7519-status-fsmonitor.sh                        |   1 -
 t/t7520-ignored-hook-warning.sh                    |   1 -
 t/t7521-ignored-mode.sh                            |   1 -
 t/t7524-commit-summary.sh                          |   1 -
 t/t7525-status-rename.sh                           |   1 -
 t/t7526-commit-pathspec-file.sh                    |   1 -
 t/t7528-signed-commit-ssh.sh                       |   1 -
 t/t7600-merge.sh                                   |   1 -
 t/t7601-merge-pull-config.sh                       |   1 -
 t/t7602-merge-octopus-many.sh                      |   1 -
 t/t7603-merge-reduce-heads.sh                      |   1 -
 t/t7604-merge-custom-message.sh                    |   1 -
 t/t7605-merge-resolve.sh                           |   1 -
 t/t7606-merge-custom.sh                            |   1 -
 t/t7607-merge-state.sh                             |   1 -
 t/t7608-merge-messages.sh                          |   1 -
 t/t7609-mergetool--lib.sh                          |   1 -
 t/t7610-mergetool.sh                               |   1 -
 t/t7611-merge-abort.sh                             |   1 -
 t/t7612-merge-verify-signatures.sh                 |   1 -
 t/t7614-merge-signoff.sh                           |   1 -
 t/t7615-diff-algo-with-mergy-operations.sh         |   1 -
 t/t7700-repack.sh                                  |   1 -
 t/t7701-repack-unpack-unreachable.sh               |   1 -
 t/t7702-repack-cyclic-alternate.sh                 |   1 -
 t/t7703-repack-geometric.sh                        |   1 -
 t/t7704-repack-cruft.sh                            |   1 -
 t/t7800-difftool.sh                                |   1 -
 t/t7810-grep.sh                                    |   1 -
 t/t7811-grep-open.sh                               |   1 -
 t/t7812-grep-icase-non-ascii.sh                    |   1 -
 t/t7813-grep-icase-iso.sh                          |   1 -
 t/t7814-grep-recurse-submodules.sh                 |   1 -
 t/t7815-grep-binary.sh                             |   1 -
 t/t7816-grep-binary-pattern.sh                     |   1 -
 t/t7817-grep-sparse-checkout.sh                    |   1 -
 t/t7900-maintenance.sh                             |   1 -
 t/t8001-annotate.sh                                |   1 -
 t/t8002-blame.sh                                   |   1 -
 t/t8003-blame-corner-cases.sh                      |   1 -
 t/t8004-blame-with-conflicts.sh                    |   1 -
 t/t8005-blame-i18n.sh                              |   1 +
 t/t8006-blame-textconv.sh                          |   1 -
 t/t8007-cat-file-textconv.sh                       |   1 -
 t/t8008-blame-formats.sh                           |   1 -
 t/t8009-blame-vs-topicbranches.sh                  |   1 -
 t/t8010-cat-file-filters.sh                        |   1 -
 t/t8011-blame-split-file.sh                        |   1 -
 t/t8012-blame-colors.sh                            |   1 -
 t/t8013-blame-ignore-revs.sh                       |   1 -
 t/t8014-blame-ignore-fuzzy.sh                      |   1 -
 t/t9001-send-email.sh                              |   1 -
 t/t9002-column.sh                                  |   1 -
 t/t9003-help-autocorrect.sh                        |   1 -
 t/t9200-git-cvsexportcommit.sh                     |   1 -
 t/t9210-scalar.sh                                  |   1 -
 t/t9211-scalar-clone.sh                            |   1 -
 t/t9300-fast-import.sh                             |   1 -
 t/t9301-fast-import-notes.sh                       |   1 -
 t/t9302-fast-import-unpack-limit.sh                |   1 -
 t/t9303-fast-import-compression.sh                 |   1 -
 t/t9304-fast-import-marks.sh                       |   1 -
 t/t9350-fast-export.sh                             |   1 -
 t/t9351-fast-export-anonymize.sh                   |   1 -
 t/t9400-git-cvsserver-server.sh                    |   1 -
 t/t9401-git-cvsserver-crlf.sh                      |   1 -
 t/t9402-git-cvsserver-refs.sh                      |   1 -
 t/t9500-gitweb-standalone-no-errors.sh             |   1 -
 t/t9501-gitweb-standalone-http-status.sh           |   1 -
 t/t9502-gitweb-standalone-parse-output.sh          |   1 -
 t/t9600-cvsimport.sh                               |   1 -
 t/t9601-cvsimport-vendor-branch.sh                 |   1 -
 t/t9602-cvsimport-branches-tags.sh                 |   1 -
 t/t9603-cvsimport-patchsets.sh                     |   1 -
 t/t9604-cvsimport-timestamps.sh                    |   1 -
 t/t9700-perl-git.sh                                |   1 -
 t/t9800-git-p4-basic.sh                            |   1 -
 t/t9801-git-p4-branch.sh                           |   1 -
 t/t9802-git-p4-filetype.sh                         |   1 -
 t/t9803-git-p4-shell-metachars.sh                  |   1 -
 t/t9804-git-p4-label.sh                            |   1 -
 t/t9805-git-p4-skip-submit-edit.sh                 |   1 -
 t/t9806-git-p4-options.sh                          |   1 -
 t/t9808-git-p4-chdir.sh                            |   1 -
 t/t9809-git-p4-client-view.sh                      |   1 -
 t/t9810-git-p4-rcs.sh                              |   1 -
 t/t9811-git-p4-label-import.sh                     |   1 -
 t/t9812-git-p4-wildcards.sh                        |   1 -
 t/t9813-git-p4-preserve-users.sh                   |   1 -
 t/t9814-git-p4-rename.sh                           |   1 -
 t/t9815-git-p4-submit-fail.sh                      |   1 -
 t/t9816-git-p4-locked.sh                           |   1 -
 t/t9817-git-p4-exclude.sh                          |   1 -
 t/t9818-git-p4-block.sh                            |   1 -
 t/t9819-git-p4-case-folding.sh                     |   1 -
 t/t9820-git-p4-editor-handling.sh                  |   1 -
 t/t9821-git-p4-path-variations.sh                  |   1 -
 t/t9822-git-p4-path-encoding.sh                    |   1 -
 t/t9823-git-p4-mock-lfs.sh                         |   1 -
 t/t9825-git-p4-handle-utf16-without-bom.sh         |   1 -
 t/t9826-git-p4-keep-empty-commits.sh               |   1 -
 t/t9827-git-p4-change-filetype.sh                  |   1 -
 t/t9828-git-p4-map-user.sh                         |   1 -
 t/t9829-git-p4-jobs.sh                             |   1 -
 t/t9830-git-p4-symlink-dir.sh                      |   1 -
 t/t9831-git-p4-triggers.sh                         |   1 -
 t/t9832-unshelve.sh                                |   1 -
 t/t9833-errors.sh                                  |   1 -
 t/t9834-git-p4-file-dir-bug.sh                     |   1 -
 t/t9835-git-p4-metadata-encoding-python2.sh        |   1 -
 t/t9836-git-p4-metadata-encoding-python3.sh        |   1 -
 t/t9850-shell.sh                                   |   1 -
 t/t9901-git-web--browse.sh                         |   1 -
 t/t9902-completion.sh                              |   1 -
 t/t9903-bash-prompt.sh                             |   1 -
 t/test-lib.sh                                      |  72 +-----------
 t/unit-tests/strvec.c                              |  65 +++++++++++
 usage.c                                            |  15 ---
 950 files changed, 366 insertions(+), 1249 deletions(-)
Range-diff versus v1:
 1:  09dbc39ffb =  1:  76daa9584b builtin/blame: fix leaking blame entries with `--incremental`
 2:  15bbe539ea =  2:  6659f0d59b bisect: fix leaking good/bad terms when reading multipe times
 3:  739e28c864 =  3:  5a9011e1ef bisect: fix leaking string in `handle_bad_merge_base()`
 4:  fa91eb9dc6 =  4:  3afc0a7bfe bisect: fix leaking `current_bad_oid`
 5:  4ca01afd9e =  5:  15577aaae6 bisect: fix multiple leaks in `bisect_next_all()`
 6:  805b91ce20 =  6:  13ddfed4fc bisect: fix leaking commit list items in `check_merge_base()`
 7:  0f183fb264 !  7:  0bc49ed3bb bisect: fix various cases where we leak commit list items
    @@ bisect.c: static struct commit_list *skip_away(struct commit_list *list, int cou
     +			else if (previous)
     +				result = previous;
     +			else
    -+				result =  list;
    ++				result = list;
     +			break;
      		}
      		previous = cur;
 8:  163c36c78e =  8:  addba1afce line-log: fix leak when rewriting commit parents
 9:  c0bcfbd98b =  9:  6e501effad strvec: introduce new `strvec_splice()` function
10:  cf0ac084c5 = 10:  2271761621 git: refactor alias handling to use a `struct strvec`
11:  c4989aab86 = 11:  7bff5d167f git: refactor builtin handling to use a `struct strvec`
12:  483d2951cc = 12:  e93d461504 split-index: fix memory leak in `move_cache_to_base_index()`
13:  70b12d6347 = 13:  a0643da6f5 builtin/sparse-checkout: fix leaking sanitized patterns
14:  f57d967cd5 = 14:  881feffeb1 help: refactor to not use globals for reading config
15:  45aacddc8a <  -:  ---------- help: fix leaking `struct cmdnames`
 -:  ---------- > 15:  f1bbb676f2 help: fix leaking `struct cmdnames`
16:  b61cc4da84 ! 16:  51c7ad993f help: fix leaking return value from `help_unknown_cmd()`
    @@ help.c: static const char bad_interpreter_advice[] =
      {
      	struct help_unknown_cmd_config cfg = { 0 };
      	int i, n, best_similarity = 0;
    - 	struct cmdnames main_cmds = { 0 };
    - 	struct cmdnames other_cmds = { 0 };
    - 	struct cmdname_help *common_cmds;
    --	const char *assumed = NULL;
    -+	char *assumed = NULL;
    - 
    - 	read_early_config(the_repository, git_unknown_cmd_config, &cfg);
    - 
     @@ help.c: const char *help_unknown_cmd(const char *cmd)
      			; /* still counting */
      	}
      	if (cfg.autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) {
    --		assumed = main_cmds.names[0]->name;
    +-		const char *assumed = main_cmds.names[0]->name;
     -		main_cmds.names[0] = NULL;
     -		cmdnames_release(&main_cmds);
    -+		assumed = xstrdup(main_cmds.names[0]->name);
    ++		char *assumed = xstrdup(main_cmds.names[0]->name);
     +
      		fprintf_ln(stderr,
      			   _("WARNING: You called a Git command named '%s', "
      			     "which does not exist."),
    -@@ help.c: const char *help_unknown_cmd(const char *cmd)
    - 			strbuf_release(&msg);
    - 			if (!(starts_with(answer, "y") ||
    - 			      starts_with(answer, "Y"))) {
    --				assumed = NULL;
    -+				FREE_AND_NULL(assumed);
    - 				goto out;
    - 			}
    - 		} else {
     
      ## help.h ##
     @@ help.h: void list_all_other_cmds(struct string_list *list);
17:  b38a39ef04 = 17:  38a25da315 builtin/help: fix leaks in `check_git_cmd()`
18:  cd5cde9acb ! 18:  462c9fc110 builtin/init-db: fix leaking directory paths
    @@ builtin/init-db.c: int cmd_init_db(int argc,
     -
      	flags |= INIT_DB_EXIST_OK;
     -	return init_db(git_dir, real_git_dir, template_dir, hash_algo,
    -+	ret =  init_db(git_dir, real_git_dir, template_dir, hash_algo,
    - 		       ref_storage_format, initial_branch,
    - 		       init_shared_repository, flags);
    +-		       ref_storage_format, initial_branch,
    +-		       init_shared_repository, flags);
    ++	ret = init_db(git_dir, real_git_dir, template_dir, hash_algo,
    ++		      ref_storage_format, initial_branch,
    ++		      init_shared_repository, flags);
     +
     +	free(template_dir_to_free);
     +	free(real_git_dir_to_free);
19:  2c7b50461b = 19:  6eabeed343 builtin/branch: fix leaking sorting options
20:  6865dda344 = 20:  2a44bbfba3 t/helper: fix leaking commit graph in "read-graph" subcommand
 -:  ---------- > 21:  fc8a96bac3 global: drop `UNLEAK()` annotation
21:  d7d8ece289 ! 22:  10e44976c2 git-compat-util: drop `UNLEAK()` annotation
    @@ Metadata
     Author: Patrick Steinhardt <ps@pks.im>
     
      ## Commit message ##
    -    git-compat-util: drop `UNLEAK()` annotation
    +    git-compat-util: drop now-unused `UNLEAK()` macro
     
    -    There are two users of `UNLEAK()` left in our codebase:
    -
    -      - In "builtin/clone.c", annotating the `repo` variable. That leak has
    -        already been fixed though as you can see in the context, where we do
    -        know to free `repo_to_free`.
    -
    -      - In "builtin/diff.c", to unleak entries of the `blob[]` array. That
    -        leak has also been fixed, because the entries we assign to that
    -        array come from `rev.pending.objects`, and we do eventually release
    -        `rev`.
    -
    -    This neatly demonstrates one of the issues with `UNLEAK()`: it is quite
    -    easy for the annotation to become stale. A second issue is that its
    -    whole intent is to paper over leaks. And while that has been a necessary
    -    evil in the past, because Git was leaking left and right, it isn't
    -    really much of an issue nowadays where our test suite has no known leaks
    +    The `UNLEAK()` macro has been introduced with 0e5bba53af (add UNLEAK
    +    annotation for reducing leak false positives, 2017-09-08) to help us
    +    reduce the amount of reported memory leaks in cases we don't care about,
    +    e.g. when exiting immediately afterwards. We have since removed all of
    +    its users in favor of freeing the memory and thus don't need the macro
         anymore.
     
    -    Remove the last two users and drop the now-unused `UNLEAK()` annotation.
    +    Remove it.
     
         Signed-off-by: Patrick Steinhardt <ps@pks.im>
     
    - ## builtin/clone.c ##
    -@@ builtin/clone.c: int cmd_clone(int argc,
    - 	free(dir);
    - 	free(path);
    - 	free(repo_to_free);
    --	UNLEAK(repo);
    - 	junk_mode = JUNK_LEAVE_ALL;
    - 
    - 	transport_ls_refs_options_release(&transport_ls_refs_options);
    -
    - ## builtin/diff.c ##
    -@@ builtin/diff.c: int cmd_diff(int argc,
    - 	release_revisions(&rev);
    - 	object_array_clear(&ent);
    - 	symdiff_release(&sdiff);
    --	UNLEAK(blob);
    - 	return result;
    - }
    -
      ## git-compat-util.h ##
     @@ git-compat-util.h: int cmd_main(int, const char **);
      int common_exit(const char *file, int line, int code);
22:  d52ca35b05 = 23:  218132b7d5 t5601: work around leak sanitizer issue
23:  44b48929fb = 24:  832c87a045 t: mark some tests as leak free
24:  b1fdbe04be = 25:  5fc1319241 t: remove unneeded !SANITIZE_LEAK prerequisites
25:  2b752b71c6 = 26:  06a1e8b27c test-lib: unconditionally enable leak checking
26:  53bc5f7d75 = 27:  19428158c8 t: remove TEST_PASSES_SANITIZE_LEAK annotations

--- base-commit: b0c643d6a710e2b092902a3941655176b358bfd0 change-id: 20241111-b4-pks-leak-fixes-pt10-a6fa657f4fac

Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

When passing `--incremental` to git-blame(1) we exit early by jumping to the `cleanup` label. But some of the cleanups we perform are handled between the `goto` and its label, and thus we leak the data.

Move the cleanups after the `cleanup` label. While at it, move the logic to free the scoreboard's `final_buf` into `cleanup_scoreboard()` and drop its `const` declaration.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 blame.c               |  1 +
 blame.h               |  2 +-
 builtin/blame.c       | 12 ++++++------
 t/t8005-blame-i18n.sh |  2 ++
 4 files changed, 10 insertions(+), 7 deletions(-)
Show changes to 4 files +10 −7

blame.c, blame.h, builtin/blame.c, t/t8005-blame-i18n.sh

diff --git a/blame.c b/blame.c
index 90633380cd583b689693e6cfe65c26a79448b00d..bf69768a7de6d2b989b85339a06af0a4763db4ad 100644
--- a/blame.c
+++ b/blame.c
@@ -2931,6 +2931,7 @@ void setup_blame_bloom_data(struct blame_scoreboard *sb)
 void cleanup_scoreboard(struct blame_scoreboard *sb)
 {
 	free(sb->lineno);
+	free(sb->final_buf);
 	clear_prio_queue(&sb->commits);
 	oidset_clear(&sb->ignore_list);
 
diff --git a/blame.h b/blame.h
index 5b4e47d44c613e31fc4788c12ee9d8dc2a49d571..3b34be0e5c6932666bf5f738eb645da25adc0997 100644
--- a/blame.h
+++ b/blame.h
@@ -116,7 +116,7 @@ struct blame_scoreboard {
 	 * Used by many functions to obtain contents of the nth line,
 	 * indexed with scoreboard.lineno[blame_entry.lno].
 	 */
-	const char *final_buf;
+	char *final_buf;
 	unsigned long final_buf_size;
 
 	/* linked list of blames */
diff --git a/builtin/blame.c b/builtin/blame.c
index e407a22da3bacf6bd26a6738e0ab0292ffadc216..6a7bb3b07248fbdfeb5ac3a05fed20fff4989a48 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -1216,12 +1216,6 @@ int cmd_blame(int argc,
 		output_option &= ~(OUTPUT_COLOR_LINE | OUTPUT_SHOW_AGE_WITH_COLOR);
 
 	output(&sb, output_option);
-	free((void *)sb.final_buf);
-	for (ent = sb.ent; ent; ) {
-		struct blame_entry *e = ent->next;
-		free(ent);
-		ent = e;
-	}
 
 	if (show_stats) {
 		printf("num read blob: %d\n", sb.num_read_blob);
@@ -1230,6 +1224,12 @@ int cmd_blame(int argc,
 	}
 
 cleanup:
+	for (ent = sb.ent; ent; ) {
+		struct blame_entry *e = ent->next;
+		free(ent);
+		ent = e;
+	}
+
 	free(path);
 	cleanup_scoreboard(&sb);
 	release_revisions(&revs);
diff --git a/t/t8005-blame-i18n.sh b/t/t8005-blame-i18n.sh
index 7a1f581c240c71106c709a830d3897d84fd8b32d..fa765aff99aa7fbfc4737cc91aab2a6a1bce30bb 100755
--- a/t/t8005-blame-i18n.sh
+++ b/t/t8005-blame-i18n.sh
@@ -1,6 +1,8 @@
 #!/bin/sh
 
 test_description='git blame encoding conversion'
+
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 if ! test_have_prereq ICONV
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 02/27] bisect: fix leaking good/bad terms when reading multipe times

Even though `read_bisect_terms()` is declared as assigning string constants, it in fact assigns allocated strings to the `read_bad` and `read_good` out parameters. The only callers of this function assign the result to global variables and thus don't have to free them in order to be leak-free. But that changes when executing the function multiple times because we'd then overwrite the previous value and thus make it unreachable.

Fix the function signature and free the previous values. This leak is exposed by t0630, but plugging it does not make the whole test suite pass.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 bisect.c   | 14 +++++++++-----
 bisect.h   |  2 +-
 revision.c |  4 ++--
 3 files changed, 12 insertions(+), 8 deletions(-)
Show changes to 3 files +12 −8

bisect.c, bisect.h, revision.c

diff --git a/bisect.c b/bisect.c
index 4713226fad4e16ebbda4ba2e8d13c6eaf7d4bfb2..9c52241050c14ecbf3f7950a0c5e7b962fcaa541 100644
--- a/bisect.c
+++ b/bisect.c
@@ -28,8 +28,8 @@ static struct oid_array skipped_revs;
 
 static struct object_id *current_bad_oid;
 
-static const char *term_bad;
-static const char *term_good;
+static char *term_bad;
+static char *term_good;
 
 /* Remember to update object flag allocation in object.h */
 #define COUNTED		(1u<<16)
@@ -985,7 +985,7 @@ static void show_commit(struct commit *commit)
  * We read them and store them to adapt the messages accordingly.
  * Default is bad/good.
  */
-void read_bisect_terms(const char **read_bad, const char **read_good)
+void read_bisect_terms(char **read_bad, char **read_good)
 {
 	struct strbuf str = STRBUF_INIT;
 	const char *filename = git_path_bisect_terms();
@@ -993,16 +993,20 @@ void read_bisect_terms(const char **read_bad, const char **read_good)
 
 	if (!fp) {
 		if (errno == ENOENT) {
-			*read_bad = "bad";
-			*read_good = "good";
+			free(*read_bad);
+			*read_bad = xstrdup("bad");
+			free(*read_good);
+			*read_good = xstrdup("good");
 			return;
 		} else {
 			die_errno(_("could not read file '%s'"), filename);
 		}
 	} else {
 		strbuf_getline_lf(&str, fp);
+		free(*read_bad);
 		*read_bad = strbuf_detach(&str, NULL);
 		strbuf_getline_lf(&str, fp);
+		free(*read_good);
 		*read_good = strbuf_detach(&str, NULL);
 	}
 	strbuf_release(&str);
diff --git a/bisect.h b/bisect.h
index ee3fd65f3bdb89611d7575239ee79e8c50bcd703..944439bfac729cf092d6c5962c9edff2321002e4 100644
--- a/bisect.h
+++ b/bisect.h
@@ -75,7 +75,7 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix);
 
 int estimate_bisect_steps(int all);
 
-void read_bisect_terms(const char **bad, const char **good);
+void read_bisect_terms(char **bad, char **good);
 
 int bisect_clean_state(void);
 
diff --git a/revision.c b/revision.c
index 8df75b82249b36e7e3ee9a4a151f085c189acc45..347dabf7f9a1a87765150ec998deae9b6709b5f6 100644
--- a/revision.c
+++ b/revision.c
@@ -51,8 +51,8 @@
 
 volatile show_early_output_fn_t show_early_output;
 
-static const char *term_bad;
-static const char *term_good;
+static char *term_bad;
+static char *term_good;
 
 implement_shared_commit_slab(revision_sources, char *);
 
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 03/27] bisect: fix leaking string in `handle_bad_merge_base()`

When handling a bad merge base we print an error, which includes the set of good revisions joined by spaces. This string is allocated, but never freed.

Fix this memory leak. Note that the local `bad_hex` varible also looks like a string that we should free. But in fact, `oid_to_hex()` returns an address to a static variable even though it is declared to return a non-constant string. The function signature is thus quite misleading and really should be fixed, but doing so is outside of the scope of this patch series.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 bisect.c | 2 ++
 1 file changed, 2 insertions(+)
Show changes to bisect.c +2 −0
diff --git a/bisect.c b/bisect.c
index 9c52241050c14ecbf3f7950a0c5e7b962fcaa541..e9e603877eba059c878ff92bc11dd84553d0649e 100644
--- a/bisect.c
+++ b/bisect.c
@@ -801,6 +801,8 @@ static enum bisect_error handle_bad_merge_base(void)
 				"between %s and [%s].\n"),
 				bad_hex, term_bad, term_good, bad_hex, good_hex);
 		}
+
+		free(good_hex);
 		return BISECT_MERGE_BASE_CHECK;
 	}
 
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 04/27] bisect: fix leaking `current_bad_oid`

When reading bisect refs we read the reference mapping to the "bad" term into the global `current_bad_oid` variable. This is an allocated string, but because it is global we never have to free it. This changes though when `register_ref()` is being called multiple times, at which point we'll overwrite the previous pointer and thus make it unreachable.

Fix this issue by freeing the previous value. This leak is exposed by t6030, but plugging it does not make the whole test suite pass.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 bisect.c | 1 +
 1 file changed, 1 insertion(+)
Show changes to bisect.c +1 −0
diff --git a/bisect.c b/bisect.c
index e9e603877eba059c878ff92bc11dd84553d0649e..6dbc22f84fce11743f0e79eb4f8100c7ec07238f 100644
--- a/bisect.c
+++ b/bisect.c
@@ -456,6 +456,7 @@ static int register_ref(const char *refname, const char *referent UNUSED, const
 	strbuf_addstr(&good_prefix, "-");
 
 	if (!strcmp(refname, term_bad)) {
+		free(current_bad_oid);
 		current_bad_oid = xmalloc(sizeof(*current_bad_oid));
 		oidcpy(current_bad_oid, oid);
 	} else if (starts_with(refname, good_prefix.buf)) {
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 05/27] bisect: fix multiple leaks in `bisect_next_all()`

There are multiple leaks in `bisect_next_all()`. For one we don't free the `tried` commit list. Second, one of the branches uses a direct return instead of jumping to the cleanup code.

Fix these by freeing the commit list and converting the return to a goto.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 bisect.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
Show changes to bisect.c +3 −2
diff --git a/bisect.c b/bisect.c
index 6dbc22f84fce11743f0e79eb4f8100c7ec07238f..04e9a63f11c7fa1a9dd11d3f193c500a4cb937c6 100644
--- a/bisect.c
+++ b/bisect.c
@@ -1031,7 +1031,7 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix)
 {
 	struct strvec rev_argv = STRVEC_INIT;
 	struct rev_info revs = REV_INFO_INIT;
-	struct commit_list *tried;
+	struct commit_list *tried = NULL;
 	int reaches = 0, all = 0, nr, steps;
 	enum bisect_error res = BISECT_OK;
 	struct object_id *bisect_rev;
@@ -1098,7 +1098,7 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix)
 	if (oideq(bisect_rev, current_bad_oid)) {
 		res = error_if_skipped_commits(tried, current_bad_oid);
 		if (res)
-			return res;
+			goto cleanup;
 		printf("%s is the first %s commit\n", oid_to_hex(bisect_rev),
 			term_bad);
 
@@ -1132,6 +1132,7 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix)
 
 	res = bisect_checkout(bisect_rev, no_checkout);
 cleanup:
+	free_commit_list(tried);
 	release_revisions(&revs);
 	strvec_clear(&rev_argv);
 	return res;
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 06/27] bisect: fix leaking commit list items in `check_merge_base()`

While we free the result commit list at the end of `check_merge_base()`, we forget to free any items that we have already iterated over. Fix this by using a separate variable to iterate through them.

This leak is exposed by t6030, but plugging it does not make the whole test suite pass.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 bisect.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
Show changes to bisect.c +2 −2
diff --git a/bisect.c b/bisect.c
index 04e9a63f11c7fa1a9dd11d3f193c500a4cb937c6..12efcff2e3c1836ab6e63d36e4d42269fbcaeaab 100644
--- a/bisect.c
+++ b/bisect.c
@@ -851,8 +851,8 @@ static enum bisect_error check_merge_bases(int rev_nr, struct commit **rev, int
 				      rev + 1, &result) < 0)
 		exit(128);
 
-	for (; result; result = result->next) {
-		const struct object_id *mb = &result->item->object.oid;
+	for (struct commit_list *l = result; l; l = l->next) {
+		const struct object_id *mb = &l->item->object.oid;
 		if (oideq(mb, current_bad_oid)) {
 			res = handle_bad_merge_base();
 			break;
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 07/27] bisect: fix various cases where we leak commit list items

There are various cases where we leak commit list items because we evict items from the list, but don't free them. Plug those.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 bisect.c                    | 35 +++++++++++++++++++++++++++--------
 t/t6030-bisect-porcelain.sh |  1 +
 2 files changed, 28 insertions(+), 8 deletions(-)
Show changes to 2 files +28 −8

bisect.c, t/t6030-bisect-porcelain.sh

diff --git a/bisect.c b/bisect.c
index 12efcff2e3c1836ab6e63d36e4d42269fbcaeaab..0e804086cbf6a02d42bda98b62fb86daf099b82d 100644
--- a/bisect.c
+++ b/bisect.c
@@ -440,11 +440,19 @@ void find_bisection(struct commit_list **commit_list, int *reaches,
 			free_commit_list(list->next);
 			best = list;
 			best->next = NULL;
+		} else {
+			for (p = list; p != best; p = next) {
+				next = p->next;
+				free(p);
+			}
 		}
 		*reaches = weight(best);
+	} else {
+		free_commit_list(*commit_list);
 	}
-	free(weights);
 	*commit_list = best;
+
+	free(weights);
 	clear_commit_weight(&commit_weight);
 }
 
@@ -557,8 +565,11 @@ struct commit_list *filter_skipped(struct commit_list *list,
 			tried = &list->next;
 		} else {
 			if (!show_all) {
-				if (!skipped_first || !*skipped_first)
+				if (!skipped_first || !*skipped_first) {
+					free_commit_list(next);
+					free_commit_list(filtered);
 					return list;
+				}
 			} else if (skipped_first && !*skipped_first) {
 				/* This means we know it's not skipped */
 				*skipped_first = -1;
@@ -614,7 +625,7 @@ static int sqrti(int val)
 
 static struct commit_list *skip_away(struct commit_list *list, int count)
 {
-	struct commit_list *cur, *previous;
+	struct commit_list *cur, *previous, *result = list;
 	int prn, index, i;
 
 	prn = get_prn(count);
@@ -626,15 +637,23 @@ static struct commit_list *skip_away(struct commit_list *list, int count)
 	for (i = 0; cur; cur = cur->next, i++) {
 		if (i == index) {
 			if (!oideq(&cur->item->object.oid, current_bad_oid))
-				return cur;
-			if (previous)
-				return previous;
-			return list;
+				result = cur;
+			else if (previous)
+				result = previous;
+			else
+				result = list;
+			break;
 		}
 		previous = cur;
 	}
 
-	return list;
+	for (cur = list; cur != result; ) {
+		struct commit_list *next = cur->next;
+		free(cur);
+		cur = next;
+	}
+
+	return result;
 }
 
 static struct commit_list *managed_skipped(struct commit_list *list,
diff --git a/t/t6030-bisect-porcelain.sh b/t/t6030-bisect-porcelain.sh
index cdc02706404b34b17b29692d72d97fab7eba58b1..310affadebed321fcc93ee5bd785abf4ca013cc1 100755
--- a/t/t6030-bisect-porcelain.sh
+++ b/t/t6030-bisect-porcelain.sh
@@ -9,6 +9,7 @@ exec </dev/null
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 add_line_into_file()
-- 
2.47.0.229.g8f8d6eee53.dirty
Toon Claes· Nov 20, 2024, 10:32 UTC · re: Patrick Steinhardt · lore

Re: [PATCH v2 07/27] bisect: fix various cases where we leak commit list items

Patrick Steinhardt <ps@pks.im> writes:
Show 22 quoted lines
> There are various cases where we leak commit list items because we
> evict items from the list, but don't free them. Plug those.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
>  bisect.c                    | 35 +++++++++++++++++++++++++++--------
>  t/t6030-bisect-porcelain.sh |  1 +
>  2 files changed, 28 insertions(+), 8 deletions(-)
>
> diff --git a/bisect.c b/bisect.c
> index 12efcff2e3c1836ab6e63d36e4d42269fbcaeaab..0e804086cbf6a02d42bda98b62fb86daf099b82d 100644
> --- a/bisect.c
> +++ b/bisect.c
> @@ -440,11 +440,19 @@ void find_bisection(struct commit_list **commit_list, int *reaches,
>  			free_commit_list(list->next);
>  			best = list;
>  			best->next = NULL;
> +		} else {
> +			for (p = list; p != best; p = next) {
> +				next = p->next;
> +				free(p);
> +			}
This makes the code do:
    if (!something) {
        // ...
    } else {
        // ...
    }

I find it odd reading code like that. Would you mind swapping them around? Or is there a reason we type it like this, because I see this also being done like this around line 393?

More on the functional side of this code, I'd like to understand better what's happening here. It's clear to me when `best` is NULL we want to free the whole commit_list. And when `best` is set with FIND_BISECTION_ALL flag set, we want to free the commit_list up to `best`. But when the FIND_BISECTION_ALL flag is not set, we want to do the opposite, free from `best->next` till the end? But what has this to do with FIND_BISECTION_ALL?

-- Toon

Patrick Steinhardt· Nov 20, 2024, 12:41 UTC · re: Toon Claes · lore

Re: [PATCH v2 07/27] bisect: fix various cases where we leak commit list items

On Wed, Nov 20, 2024 at 11:32:31AM +0100, Toon Claes wrote:
Show 36 quoted lines
> Patrick Steinhardt <ps@pks.im> writes:
> 
> > There are various cases where we leak commit list items because we
> > evict items from the list, but don't free them. Plug those.
> >
> > Signed-off-by: Patrick Steinhardt <ps@pks.im>
> > ---
> >  bisect.c                    | 35 +++++++++++++++++++++++++++--------
> >  t/t6030-bisect-porcelain.sh |  1 +
> >  2 files changed, 28 insertions(+), 8 deletions(-)
> >
> > diff --git a/bisect.c b/bisect.c
> > index 12efcff2e3c1836ab6e63d36e4d42269fbcaeaab..0e804086cbf6a02d42bda98b62fb86daf099b82d 100644
> > --- a/bisect.c
> > +++ b/bisect.c
> > @@ -440,11 +440,19 @@ void find_bisection(struct commit_list **commit_list, int *reaches,
> >  			free_commit_list(list->next);
> >  			best = list;
> >  			best->next = NULL;
> > +		} else {
> > +			for (p = list; p != best; p = next) {
> > +				next = p->next;
> > +				free(p);
> > +			}
> 
> This makes the code do:
> 
>     if (!something) {
>         // ...
>     } else {
>         // ...
>     }
> 
> I find it odd reading code like that. Would you mind swapping them
> around? Or is there a reason we type it like this, because I see this
> also being done like this around line 393?
I mostly did it this way round to minimize the diff.
Show 8 quoted lines
> More on the functional side of this code, I'd like to understand better
> what's happening here.
> It's clear to me when `best` is NULL we want to free the whole
> commit_list. And when `best` is set with FIND_BISECTION_ALL flag set, we
> want to free the commit_list up to `best`. But when the
> FIND_BISECTION_ALL flag is not set, we want to do the opposite, free
> from `best->next` till the end? But what has this to do with
> FIND_BISECTION_ALL? 
Good question.

Typically, `find_bisection()` will only return a single commit, which is the next bisection point in the range of bisected commit. This is done by approximation, where we want to find a commit that is roughly half way between the current good and bad commits. So the result should be a single commit, only, and thus we free all other commit items except for the commit that we have determined to be the bisection point.

When `FIND_BISECTION_ALL` is set this changes: instead of returning a single commit, we return all commits in the bisected range of commits, but tag them with the distance to the included and excluded commits. So the result is a list of commits, but that list may have been filtered down from the list of commits passed into `do_find_bisection()`.

So when do we filter items? This happens in `best_bisection_sorted()`, where we skip over commits which are treesame. But for all I can see we never end up skipping over the head of the list, we may only exclude times from its tail, and we do know to release the tail alright.

Which means... that the added code is effectively a no-op because `best` will always be pointing to `list`. Removing the code and re-running with the leak checker enabled confirms that there are no new leaks. I'll drop it, no idea what I saw here.

Patrick
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 08/27] line-log: fix leak when rewriting commit parents

In `process_ranges_merge_commit()` we try to figure out which of the parents can be blamed for the given line changes. When we figure out that none of the files in the line-log have changed we assign the complete blame to that commit and rewrite the parents of the current commit to only use that single parent.

This is done via `commit_list_append()`, which is misleadingly _not_ appending to the list of parents. Instead, we overwrite the parents with the blamed parent. This makes us lose track of the old pointers, creating a memory leak.

Fix this issue by freeing the parents before we overwrite them.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 line-log.c          | 1 +
 t/t4211-line-log.sh | 1 +
 2 files changed, 2 insertions(+)
Show changes to 2 files +2 −0

line-log.c, t/t4211-line-log.sh

diff --git a/line-log.c b/line-log.c
index bca9bd804073df9b77b2859063ac5ad4d3b24e0f..bc67b75d10d34edc726c00c887d57016e40f3a00 100644
--- a/line-log.c
+++ b/line-log.c
@@ -1237,6 +1237,7 @@ static int process_ranges_merge_commit(struct rev_info *rev, struct commit *comm
 			 * don't follow any other path in history
 			 */
 			add_line_range(rev, parents[i], cand[i]);
+			free_commit_list(commit->parents);
 			commit_list_append(parents[i], &commit->parents);
 
 			ret = 0;
diff --git a/t/t4211-line-log.sh b/t/t4211-line-log.sh
index 950451cf6a66e6c099aa5303ce19230c34cd1fc4..1d6dd982a2a858e9ca03635eb83b1463c9c9caed 100755
--- a/t/t4211-line-log.sh
+++ b/t/t4211-line-log.sh
@@ -4,6 +4,7 @@ test_description='test log -L'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup (import history)' '
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 09/27] strvec: introduce new `strvec_splice()` function

Introduce a new `strvec_splice()` function that can replace a range of strings in the vector with another array of strings. This function will be used in subsequent commits.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 strvec.c              | 19 +++++++++++++++
 strvec.h              |  9 +++++++
 t/unit-tests/strvec.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 93 insertions(+)
Show changes to 3 files +93 −0

strvec.c, strvec.h, t/unit-tests/strvec.c

diff --git a/strvec.c b/strvec.c
index f712070f5745d5f998d0846ac4009441dddfa500..81075c50cca4fe44608775541d876294a79d9e4e 100644
--- a/strvec.c
+++ b/strvec.c
@@ -56,6 +56,25 @@ void strvec_pushv(struct strvec *array, const char **items)
 		strvec_push(array, *items);
 }
 
+void strvec_splice(struct strvec *array, size_t pos, size_t len,
+		   const char **replacement, size_t replacement_len)
+{
+	if (pos + len > array->alloc)
+		BUG("range outside of array boundary");
+	if (replacement_len > len)
+		ALLOC_GROW(array->v, array->nr + (replacement_len - len) + 1,
+			   array->alloc);
+	for (size_t i = 0; i < len; i++)
+		free((char *)array->v[pos + i]);
+	if (replacement_len != len) {
+		memmove(array->v + pos + replacement_len, array->v + pos + len,
+			(array->nr - pos - len + 1) * sizeof(char *));
+		array->nr += (replacement_len - len);
+	}
+	for (size_t i = 0; i < replacement_len; i++)
+		array->v[pos + i] = xstrdup(replacement[i]);
+}
+
 const char *strvec_replace(struct strvec *array, size_t idx, const char *replacement)
 {
 	char *to_free;
diff --git a/strvec.h b/strvec.h
index 4b73c1f092e9b016ce3299035477713c6267cdae..4e61cc9336938a95318974903f9b35dcdc4da1cd 100644
--- a/strvec.h
+++ b/strvec.h
@@ -67,6 +67,15 @@ void strvec_pushl(struct strvec *, ...);
 /* Push a null-terminated array of strings onto the end of the array. */
 void strvec_pushv(struct strvec *, const char **);
 
+/*
+ * Replace `len` values starting at `pos` with the provided replacement
+ * strings. If `len` is zero this is effectively an insert at the given `pos`.
+ * If `replacement_len` is zero this is effectively a delete of `len` items
+ * starting at `pos`.
+ */
+void strvec_splice(struct strvec *array, size_t pos, size_t len,
+		   const char **replacement, size_t replacement_len);
+
 /**
  * Replace the value at the given index with a new value. The index must be
  * valid. Returns a pointer to the inserted value.
diff --git a/t/unit-tests/strvec.c b/t/unit-tests/strvec.c
index bf4c0cb172e1f01c452b8744084cc45bf3aa86fa..855b602337169f6fffcadf91e0734db44ceccb16 100644
--- a/t/unit-tests/strvec.c
+++ b/t/unit-tests/strvec.c
@@ -88,6 +88,71 @@ void test_strvec__pushv(void)
 	strvec_clear(&vec);
 }
 
+void test_strvec__splice_with_same_size_replacement(void)
+{
+	struct strvec vec = STRVEC_INIT;
+	const char *replacement[] = { "1" };
+
+	strvec_pushl(&vec, "foo", "bar", "baz", NULL);
+	strvec_splice(&vec, 1, 1, replacement, ARRAY_SIZE(replacement));
+	check_strvec(&vec, "foo", "1", "baz", NULL);
+	strvec_clear(&vec);
+}
+
+void test_strvec__splice_with_smaller_replacement(void)
+{
+	struct strvec vec = STRVEC_INIT;
+	const char *replacement[] = { "1" };
+
+	strvec_pushl(&vec, "foo", "bar", "baz", NULL);
+	strvec_splice(&vec, 1, 2, replacement, ARRAY_SIZE(replacement));
+	check_strvec(&vec, "foo", "1", NULL);
+	strvec_clear(&vec);
+}
+
+void test_strvec__splice_with_bigger_replacement(void)
+{
+	struct strvec vec = STRVEC_INIT;
+	const char *replacement[] = { "1", "2", "3" };
+
+	strvec_pushl(&vec, "foo", "bar", "baz", NULL);
+	strvec_splice(&vec, 0, 2, replacement, ARRAY_SIZE(replacement));
+	check_strvec(&vec, "1", "2", "3", "baz", NULL);
+	strvec_clear(&vec);
+}
+
+void test_strvec__splice_with_empty_replacement(void)
+{
+	struct strvec vec = STRVEC_INIT;
+
+	strvec_pushl(&vec, "foo", "bar", "baz", NULL);
+	strvec_splice(&vec, 0, 2, NULL, 0);
+	check_strvec(&vec, "baz", NULL);
+	strvec_clear(&vec);
+}
+
+void test_strvec__splice_with_empty_original(void)
+{
+	struct strvec vec = STRVEC_INIT;
+	const char *replacement[] = { "1", "2" };
+
+	strvec_pushl(&vec, "foo", "bar", "baz", NULL);
+	strvec_splice(&vec, 1, 0, replacement, ARRAY_SIZE(replacement));
+	check_strvec(&vec, "foo", "1", "2", "bar", "baz", NULL);
+	strvec_clear(&vec);
+}
+
+void test_strvec__splice_at_tail(void)
+{
+	struct strvec vec = STRVEC_INIT;
+	const char *replacement[] = { "1", "2" };
+
+	strvec_pushl(&vec, "foo", "bar", NULL);
+	strvec_splice(&vec, 2, 0, replacement, ARRAY_SIZE(replacement));
+	check_strvec(&vec, "foo", "bar", "1", "2", NULL);
+	strvec_clear(&vec);
+}
+
 void test_strvec__replace_at_head(void)
 {
 	struct strvec vec = STRVEC_INIT;
-- 
2.47.0.229.g8f8d6eee53.dirty
Toon Claes· Nov 20, 2024, 08:37 UTC · re: Patrick Steinhardt · lore

Re: [PATCH v2 09/27] strvec: introduce new `strvec_splice()` function

Patrick Steinhardt <ps@pks.im> writes:
Show 24 quoted lines
> Introduce a new `strvec_splice()` function that can replace a range of
> strings in the vector with another array of strings. This function will
> be used in subsequent commits.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
>  strvec.c              | 19 +++++++++++++++
>  strvec.h              |  9 +++++++
>  t/unit-tests/strvec.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 93 insertions(+)
>
> diff --git a/strvec.c b/strvec.c
> index f712070f5745d5f998d0846ac4009441dddfa500..81075c50cca4fe44608775541d876294a79d9e4e 100644
> --- a/strvec.c
> +++ b/strvec.c
> @@ -56,6 +56,25 @@ void strvec_pushv(struct strvec *array, const char **items)
>  		strvec_push(array, *items);
>  }
>  
> +void strvec_splice(struct strvec *array, size_t pos, size_t len,
> +		   const char **replacement, size_t replacement_len)
> +{
> +	if (pos + len > array->alloc)
> +		BUG("range outside of array boundary");

Why aren't you checking against array->nr? I was trying a test case for this, and this seems to be unexpected behavior:

	void test_strvec__splice_insert_after_nr(void)
	{
		struct strvec vec = STRVEC_INIT;
		const char *replacement[] = { "1" };
		strvec_pushl(&vec, "foo", "bar", "baz", "buzz", "fuzz", NULL);
		strvec_pop(&vec);
		check_strvec(&vec, "foo", "bar", "baz", "buzz", NULL);
		strvec_pop(&vec);
		check_strvec(&vec, "foo", "bar", "baz", NULL);
		strvec_pop(&vec);
		strvec_splice(&vec, 4, 1, replacement, ARRAY_SIZE(replacement));
		check_strvec(&vec, "foo", "bar", "baz", NULL, "1", NULL);
		strvec_clear(&vec);
	}
Show 26 quoted lines
> +	if (replacement_len > len)
> +		ALLOC_GROW(array->v, array->nr + (replacement_len - len) + 1,
> +			   array->alloc);
> +	for (size_t i = 0; i < len; i++)
> +		free((char *)array->v[pos + i]);
> +	if (replacement_len != len) {
> +		memmove(array->v + pos + replacement_len, array->v + pos + len,
> +			(array->nr - pos - len + 1) * sizeof(char *));
> +		array->nr += (replacement_len - len);
> +	}
> +	for (size_t i = 0; i < replacement_len; i++)
> +		array->v[pos + i] = xstrdup(replacement[i]);
> +}
> +
>  const char *strvec_replace(struct strvec *array, size_t idx, const char *replacement)
>  {
>  	char *to_free;
> diff --git a/strvec.h b/strvec.h
> index 4b73c1f092e9b016ce3299035477713c6267cdae..4e61cc9336938a95318974903f9b35dcdc4da1cd 100644
> --- a/strvec.h
> +++ b/strvec.h
> @@ -67,6 +67,15 @@ void strvec_pushl(struct strvec *, ...);
>  /* Push a null-terminated array of strings onto the end of the array. */
>  void strvec_pushv(struct strvec *, const char **);
>  
> +/*

Tiniest nit: I see the majority of the function comments in this file start with a double asterisk, should we do the same here?

Show 6 quoted lines
> + * Replace `len` values starting at `pos` with the provided replacement
> + * strings. If `len` is zero this is effectively an insert at the given `pos`.
> + * If `replacement_len` is zero this is effectively a delete of `len` items
> + * starting at `pos`.
> + */
> +void strvec_splice(struct strvec *array, size_t pos, size_t len,
In this file we seem to commonly use `idx` instead of `pos`.
-- 
Toon
Patrick Steinhardt· Nov 20, 2024, 12:41 UTC · re: Toon Claes · lore

Re: [PATCH v2 09/27] strvec: introduce new `strvec_splice()` function

On Wed, Nov 20, 2024 at 09:37:40AM +0100, Toon Claes wrote:
Show 29 quoted lines
> Patrick Steinhardt <ps@pks.im> writes:
> 
> > Introduce a new `strvec_splice()` function that can replace a range of
> > strings in the vector with another array of strings. This function will
> > be used in subsequent commits.
> >
> > Signed-off-by: Patrick Steinhardt <ps@pks.im>
> > ---
> >  strvec.c              | 19 +++++++++++++++
> >  strvec.h              |  9 +++++++
> >  t/unit-tests/strvec.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 93 insertions(+)
> >
> > diff --git a/strvec.c b/strvec.c
> > index f712070f5745d5f998d0846ac4009441dddfa500..81075c50cca4fe44608775541d876294a79d9e4e 100644
> > --- a/strvec.c
> > +++ b/strvec.c
> > @@ -56,6 +56,25 @@ void strvec_pushv(struct strvec *array, const char **items)
> >  		strvec_push(array, *items);
> >  }
> >  
> > +void strvec_splice(struct strvec *array, size_t pos, size_t len,
> > +		   const char **replacement, size_t replacement_len)
> > +{
> > +	if (pos + len > array->alloc)
> > +		BUG("range outside of array boundary");
> 
> Why aren't you checking against array->nr? I was trying a test case for
> this, and this seems to be unexpected behavior:
Oh, good catch!
Show 15 quoted lines
> 	void test_strvec__splice_insert_after_nr(void)
> 	{
> 		struct strvec vec = STRVEC_INIT;
> 		const char *replacement[] = { "1" };
> 
> 		strvec_pushl(&vec, "foo", "bar", "baz", "buzz", "fuzz", NULL);
> 		strvec_pop(&vec);
> 		check_strvec(&vec, "foo", "bar", "baz", "buzz", NULL);
> 		strvec_pop(&vec);
> 		check_strvec(&vec, "foo", "bar", "baz", NULL);
> 		strvec_pop(&vec);
> 		strvec_splice(&vec, 4, 1, replacement, ARRAY_SIZE(replacement));
> 		check_strvec(&vec, "foo", "bar", "baz", NULL, "1", NULL);
> 		strvec_clear(&vec);
> 	}

I'd love to add such a test and verify that it fails as expected. But the problem is that the API we have just `BUG()`s and thus causes the program to die. We could adapt the new function to not die but instead bubble up error codes, but I'd rather do that in a separate patch series that goes over the whole interface.

Show 12 quoted lines
> > diff --git a/strvec.h b/strvec.h
> > index 4b73c1f092e9b016ce3299035477713c6267cdae..4e61cc9336938a95318974903f9b35dcdc4da1cd 100644
> > --- a/strvec.h
> > +++ b/strvec.h
> > @@ -67,6 +67,15 @@ void strvec_pushl(struct strvec *, ...);
> >  /* Push a null-terminated array of strings onto the end of the array. */
> >  void strvec_pushv(struct strvec *, const char **);
> >  
> > +/*
> 
> Tiniest nit: I see the majority of the function comments in this file
> start with a double asterisk, should we do the same here?

Double asterisks are typically used in contexts where comments should be extracted via tools like Doxygen. We don't do that in Git, so I don't see a reason to have the double asterisk. Our CodingGuidelines don't mention double asterisks, either.

Show 8 quoted lines
> > + * Replace `len` values starting at `pos` with the provided replacement
> > + * strings. If `len` is zero this is effectively an insert at the given `pos`.
> > + * If `replacement_len` is zero this is effectively a delete of `len` items
> > + * starting at `pos`.
> > + */
> > +void strvec_splice(struct strvec *array, size_t pos, size_t len,
> 
> In this file we seem to commonly use `idx` instead of `pos`.
Fair, will adapt.
Patrick
Junio C Hamano· Nov 20, 2024, 23:13 UTC · re: Patrick Steinhardt · lore

Re: [PATCH v2 09/27] strvec: introduce new `strvec_splice()` function

Patrick Steinhardt <ps@pks.im> writes:
> Double asterisks are typically used in contexts where comments should be
> extracted via tools like Doxygen. We don't do that in Git, so I don't
> see a reason to have the double asterisk. Our CodingGuidelines don't
> mention double asterisks, either.

Should we add an explicit mention that we frown upon double-asterisks, even though many have already slipped into our codebase already?

I personally do not particularly mind people _preparing_ for that someday when somebody starts extracting document snippets out with these double-asterisks as clues, but unless/until we decide to (or not to) enable doxygen processing on our codebase, let's not insist on adding/deleting double-asterisks in new code during the review, and let's not churn existing code with a patch that only adds more double-asterisks or removes existing ones.

Thanks.
Jeff King· Nov 21, 2024, 08:11 UTC · re: Junio C Hamano · lore

Re: [PATCH v2 09/27] strvec: introduce new `strvec_splice()` function

On Thu, Nov 21, 2024 at 08:13:49AM +0900, Junio C Hamano wrote:
Show 9 quoted lines
> Patrick Steinhardt <ps@pks.im> writes:
> 
> > Double asterisks are typically used in contexts where comments should be
> > extracted via tools like Doxygen. We don't do that in Git, so I don't
> > see a reason to have the double asterisk. Our CodingGuidelines don't
> > mention double asterisks, either.
> 
> Should we add an explicit mention that we frown upon double-asterisks,
> even though many have already slipped into our codebase already?
A bit of history:

I'm not sure if "slipped in" is accurate here. IIRC, when I proposed moving the contents of Documentation/technical/api-* into header files, there was some push-back that people preferred to be able to extract them to read as stand-alone, even if we did not support a full tool like doxygen. But AFAIK nobody ever wrote that tool (or at least if they did they did not share it with the list). So I started with "/**" as a mechanism to allow extraction, but it has probably bit-rotted

Looking back in the archive, though, I think "people" was Jonathan Nieder and "push-back" is probably over-stating his position. This is the closest thread I found:

  https://lore.kernel.org/git/20141209222337.GA16345@google.com/

I dunno what any of that means for now, though. I am OK officially declaring the "/**" thing something we we do not care about, if nobody is using them. I've added Jonathan to the cc in case he has comments.

Show 7 quoted lines
> I personally do not particularly mind people _preparing_ for that
> someday when somebody starts extracting document snippets out with
> these double-asterisks as clues, but unless/until we decide to (or
> not to) enable doxygen processing on our codebase, let's not insist
> on adding/deleting double-asterisks in new code during the review,
> and let's not churn existing code with a patch that only adds more
> double-asterisks or removes existing ones.

Like you, I would be happy not to see patches adding or removing them in existing code. To me the point of an official declaration is just to tell people not to do so. :)

-Peff
Jeff King· Nov 21, 2024, 08:22 UTC · re: Jeff King · lore

Re: [PATCH v2 09/27] strvec: introduce new `strvec_splice()` function

On Thu, Nov 21, 2024 at 03:11:46AM -0500, Jeff King wrote:
Show 9 quoted lines
> Looking back in the archive, though, I think "people" was Jonathan
> Nieder and "push-back" is probably over-stating his position. This is
> the closest thread I found:
> 
>   https://lore.kernel.org/git/20141209222337.GA16345@google.com/
> 
> I dunno what any of that means for now, though. I am OK officially
> declaring the "/**" thing something we we do not care about, if nobody
> is using them. I've added Jonathan to the cc in case he has comments.
Also, déjà vu:
  https://lore.kernel.org/git/20180927182528.GB2468@sigill.intra.peff.net/

That thread has more back-and-forth on the subject, but unless you have an abundance of spare time, I do not think it is worth reading in detail.

-Peff
Toon Claes· Nov 21, 2024, 10:23 UTC · re: Jeff King · lore

Doxygen-styled comments [was: Re: [PATCH v2 09/27] strvec: introduce new `strvec_splice()` function]

Jeff King <peff@peff.net> writes:
> On Thu, Nov 21, 2024 at 08:13:49AM +0900, Junio C Hamano wrote:
>
>> let's not insist
>> on adding/deleting double-asterisks in new code during the review,
Okay, understood.
Show 5 quoted lines
>> and let's not churn existing code with a patch that only adds more
>> double-asterisks or removes existing ones.
>
> Like you, I would be happy not to see patches adding or removing them in
> existing code.
Oh yeah, I agree at this point it doesn't make sense.
> To me the point of an official declaration is just to
> tell people not to do so. :)

What do you mean? Do you want to formalize in the contribution docs we will not accept patches only changing the formatting of code comments?

-- Toon

Jeff King· Nov 21, 2024, 10:32 UTC · re: Toon Claes · lore

Re: Doxygen-styled comments [was: Re: [PATCH v2 09/27] strvec: introduce new `strvec_splice()` function]

On Thu, Nov 21, 2024 at 11:23:47AM +0100, Toon Claes wrote:
Show 5 quoted lines
> > To me the point of an official declaration is just to
> > tell people not to do so. :)
> 
> What do you mean? Do you want to formalize in the contribution docs we
> will not accept patches only changing the formatting of code comments?

I just meant that by clarifying our position we would not have people sending patches adding or removing, or arguing about whether they should exist during review.

-Peff
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 10/27] git: refactor alias handling to use a `struct strvec`

In `handle_alias()` we use both `argcp` and `argv` as in-out parameters. Callers mostly pass through the static array from `main()`, but once we handle an alias we replace it with an allocated array that may contain some allocated strings. Callers do not handle this scenario at all and thus leak memory.

We could in theory handle the lifetime of `argv` in a hacky fashion by letting callers free it in case they see that an alias was handled. But while that would likely work, we still wouldn't be able to easily handle the lifetime of strings referenced by `argv`.

Refactor the code to instead use a `struct strvec`, which effectively removes the need for us to manually track lifetimes.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 git.c            | 58 +++++++++++++++++++++++++++++++-------------------------
 t/t0014-alias.sh |  1 +
 2 files changed, 33 insertions(+), 26 deletions(-)
Show changes to 2 files +33 −26

git.c, t/t0014-alias.sh

diff --git a/git.c b/git.c
index c2c1b8e22c2d91824ad6d631ea9374424ab53435..88356afe5fb568ccc147f055e3ab253c53a1befa 100644
--- a/git.c
+++ b/git.c
@@ -362,7 +362,7 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
 	return (*argv) - orig_argv;
 }
 
-static int handle_alias(int *argcp, const char ***argv)
+static int handle_alias(struct strvec *args)
 {
 	int envchanged = 0, ret = 0, saved_errno = errno;
 	int count, option_count;
@@ -370,10 +370,10 @@ static int handle_alias(int *argcp, const char ***argv)
 	const char *alias_command;
 	char *alias_string;
 
-	alias_command = (*argv)[0];
+	alias_command = args->v[0];
 	alias_string = alias_lookup(alias_command);
 	if (alias_string) {
-		if (*argcp > 1 && !strcmp((*argv)[1], "-h"))
+		if (args->nr > 1 && !strcmp(args->v[1], "-h"))
 			fprintf_ln(stderr, _("'%s' is aliased to '%s'"),
 				   alias_command, alias_string);
 		if (alias_string[0] == '!') {
@@ -390,7 +390,7 @@ static int handle_alias(int *argcp, const char ***argv)
 			child.wait_after_clean = 1;
 			child.trace2_child_class = "shell_alias";
 			strvec_push(&child.args, alias_string + 1);
-			strvec_pushv(&child.args, (*argv) + 1);
+			strvec_pushv(&child.args, args->v + 1);
 
 			trace2_cmd_alias(alias_command, child.args.v);
 			trace2_cmd_name("_run_shell_alias_");
@@ -423,15 +423,13 @@ static int handle_alias(int *argcp, const char ***argv)
 		trace_argv_printf(new_argv,
 				  "trace: alias expansion: %s =>",
 				  alias_command);
-
-		REALLOC_ARRAY(new_argv, count + *argcp);
-		/* insert after command name */
-		COPY_ARRAY(new_argv + count, *argv + 1, *argcp);
-
 		trace2_cmd_alias(alias_command, new_argv);
 
-		*argv = new_argv;
-		*argcp += count - 1;
+		/* Replace the alias with the new arguments. */
+		strvec_splice(args, 0, 1, new_argv, count);
+
+		free(alias_string);
+		free(new_argv);
 
 		ret = 1;
 	}
@@ -800,10 +798,10 @@ static void execv_dashed_external(const char **argv)
 		exit(128);
 }
 
-static int run_argv(int *argcp, const char ***argv)
+static int run_argv(struct strvec *args)
 {
 	int done_alias = 0;
-	struct string_list cmd_list = STRING_LIST_INIT_NODUP;
+	struct string_list cmd_list = STRING_LIST_INIT_DUP;
 	struct string_list_item *seen;
 
 	while (1) {
@@ -817,8 +815,8 @@ static int run_argv(int *argcp, const char ***argv)
 		 * process.
 		 */
 		if (!done_alias)
-			handle_builtin(*argcp, *argv);
-		else if (get_builtin(**argv)) {
+			handle_builtin(args->nr, args->v);
+		else if (get_builtin(args->v[0])) {
 			struct child_process cmd = CHILD_PROCESS_INIT;
 			int i;
 
@@ -834,8 +832,8 @@ static int run_argv(int *argcp, const char ***argv)
 			commit_pager_choice();
 
 			strvec_push(&cmd.args, "git");
-			for (i = 0; i < *argcp; i++)
-				strvec_push(&cmd.args, (*argv)[i]);
+			for (i = 0; i < args->nr; i++)
+				strvec_push(&cmd.args, args->v[i]);
 
 			trace_argv_printf(cmd.args.v, "trace: exec:");
 
@@ -850,13 +848,13 @@ static int run_argv(int *argcp, const char ***argv)
 			i = run_command(&cmd);
 			if (i >= 0 || errno != ENOENT)
 				exit(i);
-			die("could not execute builtin %s", **argv);
+			die("could not execute builtin %s", args->v[0]);
 		}
 
 		/* .. then try the external ones */
-		execv_dashed_external(*argv);
+		execv_dashed_external(args->v);
 
-		seen = unsorted_string_list_lookup(&cmd_list, *argv[0]);
+		seen = unsorted_string_list_lookup(&cmd_list, args->v[0]);
 		if (seen) {
 			int i;
 			struct strbuf sb = STRBUF_INIT;
@@ -873,14 +871,14 @@ static int run_argv(int *argcp, const char ***argv)
 			      " not terminate:%s"), cmd_list.items[0].string, sb.buf);
 		}
 
-		string_list_append(&cmd_list, *argv[0]);
+		string_list_append(&cmd_list, args->v[0]);
 
 		/*
 		 * It could be an alias -- this works around the insanity
 		 * of overriding "git log" with "git show" by having
 		 * alias.log = show
 		 */
-		if (!handle_alias(argcp, argv))
+		if (!handle_alias(args))
 			break;
 		done_alias = 1;
 	}
@@ -892,6 +890,7 @@ static int run_argv(int *argcp, const char ***argv)
 
 int cmd_main(int argc, const char **argv)
 {
+	struct strvec args = STRVEC_INIT;
 	const char *cmd;
 	int done_help = 0;
 
@@ -951,25 +950,32 @@ int cmd_main(int argc, const char **argv)
 	 */
 	setup_path();
 
+	for (size_t i = 0; i < argc; i++)
+		strvec_push(&args, argv[i]);
+
 	while (1) {
-		int was_alias = run_argv(&argc, &argv);
+		int was_alias = run_argv(&args);
 		if (errno != ENOENT)
 			break;
 		if (was_alias) {
 			fprintf(stderr, _("expansion of alias '%s' failed; "
 					  "'%s' is not a git command\n"),
-				cmd, argv[0]);
+				cmd, args.v[0]);
+			strvec_clear(&args);
 			exit(1);
 		}
 		if (!done_help) {
-			cmd = argv[0] = help_unknown_cmd(cmd);
+			strvec_replace(&args, 0, help_unknown_cmd(cmd));
+			cmd = args.v[0];
 			done_help = 1;
-		} else
+		} else {
 			break;
+		}
 	}
 
 	fprintf(stderr, _("failed to run command '%s': %s\n"),
 		cmd, strerror(errno));
+	strvec_clear(&args);
 
 	return 1;
 }
diff --git a/t/t0014-alias.sh b/t/t0014-alias.sh
index 854d59ec58c25ab2cfb58113bf5ea8d670829fe0..2a6f39ad9c81958d5152139995feab57c4371363 100755
--- a/t/t0014-alias.sh
+++ b/t/t0014-alias.sh
@@ -2,6 +2,7 @@
 
 test_description='git command aliasing'
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'nested aliases - internal execution' '
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 11/27] git: refactor builtin handling to use a `struct strvec`

Similar as with the preceding commit, `handle_builtin()` does not properly track lifetimes of the `argv` array and its strings. As it may end up modifying the array this can lead to memory leaks in case it contains allocated strings.

Refactor the function to use a `struct strvec` instead.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 git.c                  | 66 ++++++++++++++++++++++++--------------------------
 t/t0211-trace2-perf.sh |  2 +-
 2 files changed, 32 insertions(+), 36 deletions(-)
Show changes to 2 files +32 −36

git.c, t/t0211-trace2-perf.sh

diff --git a/git.c b/git.c
index 88356afe5fb568ccc147f055e3ab253c53a1befa..159dd45b08204c4a89d1dc4ab6990978e2454eb6 100644
--- a/git.c
+++ b/git.c
@@ -696,63 +696,57 @@ void load_builtin_commands(const char *prefix, struct cmdnames *cmds)
 }
 
 #ifdef STRIP_EXTENSION
-static void strip_extension(const char **argv)
+static void strip_extension(struct strvec *args)
 {
 	size_t len;
 
-	if (strip_suffix(argv[0], STRIP_EXTENSION, &len))
-		argv[0] = xmemdupz(argv[0], len);
+	if (strip_suffix(args->v[0], STRIP_EXTENSION, &len)) {
+		char *stripped = xmemdupz(args->v[0], len);
+		strvec_replace(args, 0, stripped);
+		free(stripped);
+	}
 }
 #else
 #define strip_extension(cmd)
 #endif
 
-static void handle_builtin(int argc, const char **argv)
+static void handle_builtin(struct strvec *args)
 {
-	struct strvec args = STRVEC_INIT;
-	const char **argv_copy = NULL;
 	const char *cmd;
 	struct cmd_struct *builtin;
 
-	strip_extension(argv);
-	cmd = argv[0];
+	strip_extension(args);
+	cmd = args->v[0];
 
 	/* Turn "git cmd --help" into "git help --exclude-guides cmd" */
-	if (argc > 1 && !strcmp(argv[1], "--help")) {
-		int i;
-
-		argv[1] = argv[0];
-		argv[0] = cmd = "help";
-
-		for (i = 0; i < argc; i++) {
-			strvec_push(&args, argv[i]);
-			if (!i)
-				strvec_push(&args, "--exclude-guides");
-		}
+	if (args->nr > 1 && !strcmp(args->v[1], "--help")) {
+		const char *exclude_guides_arg[] = { "--exclude-guides" };
+
+		strvec_replace(args, 1, args->v[0]);
+		strvec_replace(args, 0, "help");
+		cmd = "help";
+		strvec_splice(args, 2, 0, exclude_guides_arg,
+			      ARRAY_SIZE(exclude_guides_arg));
+	}
 
-		argc++;
+	builtin = get_builtin(cmd);
+	if (builtin) {
+		const char **argv_copy = NULL;
+		int ret;
 
 		/*
 		 * `run_builtin()` will modify the argv array, so we need to
 		 * create a shallow copy such that we can free all of its
 		 * strings.
 		 */
-		CALLOC_ARRAY(argv_copy, argc + 1);
-		COPY_ARRAY(argv_copy, args.v, argc);
+		if (args->nr)
+			DUP_ARRAY(argv_copy, args->v, args->nr + 1);
 
-		argv = argv_copy;
-	}
-
-	builtin = get_builtin(cmd);
-	if (builtin) {
-		int ret = run_builtin(builtin, argc, argv, the_repository);
-		strvec_clear(&args);
+		ret = run_builtin(builtin, args->nr, argv_copy, the_repository);
+		strvec_clear(args);
 		free(argv_copy);
 		exit(ret);
 	}
-
-	strvec_clear(&args);
-	free(argv_copy);
 }
 
 static void execv_dashed_external(const char **argv)
@@ -815,7 +809,7 @@ static int run_argv(struct strvec *args)
 		 * process.
 		 */
 		if (!done_alias)
-			handle_builtin(args->nr, args->v);
+			handle_builtin(args);
 		else if (get_builtin(args->v[0])) {
 			struct child_process cmd = CHILD_PROCESS_INIT;
 			int i;
@@ -916,8 +910,10 @@ int cmd_main(int argc, const char **argv)
 	 * that one cannot handle it.
 	 */
 	if (skip_prefix(cmd, "git-", &cmd)) {
-		argv[0] = cmd;
-		handle_builtin(argc, argv);
+		strvec_push(&args, cmd);
+		strvec_pushv(&args, argv + 1);
+		handle_builtin(&args);
+		strvec_clear(&args);
 		die(_("cannot handle %s as a builtin"), cmd);
 	}
 
diff --git a/t/t0211-trace2-perf.sh b/t/t0211-trace2-perf.sh
index dddc130560ba6150fc5f5eac36c65ff76a2d31a1..91260ce97e5bdb39550a9e1e4abbc4d5fea48a21 100755
--- a/t/t0211-trace2-perf.sh
+++ b/t/t0211-trace2-perf.sh
@@ -2,7 +2,7 @@
 
 test_description='test trace2 facility (perf target)'
 
-TEST_PASSES_SANITIZE_LEAK=false
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # Turn off any inherited trace2 settings for this test.
-- 
2.47.0.229.g8f8d6eee53.dirty
Toon Claes· Nov 20, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

Re: [PATCH v2 11/27] git: refactor builtin handling to use a `struct strvec`

Patrick Steinhardt <ps@pks.im> writes:
Show 105 quoted lines
> Similar as with the preceding commit, `handle_builtin()` does not
> properly track lifetimes of the `argv` array and its strings. As it may
> end up modifying the array this can lead to memory leaks in case it
> contains allocated strings.
>
> Refactor the function to use a `struct strvec` instead.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
>  git.c                  | 66 ++++++++++++++++++++++++--------------------------
>  t/t0211-trace2-perf.sh |  2 +-
>  2 files changed, 32 insertions(+), 36 deletions(-)
>
> diff --git a/git.c b/git.c
> index 88356afe5fb568ccc147f055e3ab253c53a1befa..159dd45b08204c4a89d1dc4ab6990978e2454eb6 100644
> --- a/git.c
> +++ b/git.c
> @@ -696,63 +696,57 @@ void load_builtin_commands(const char *prefix, struct cmdnames *cmds)
>  }
>  
>  #ifdef STRIP_EXTENSION
> -static void strip_extension(const char **argv)
> +static void strip_extension(struct strvec *args)
>  {
>  	size_t len;
>  
> -	if (strip_suffix(argv[0], STRIP_EXTENSION, &len))
> -		argv[0] = xmemdupz(argv[0], len);
> +	if (strip_suffix(args->v[0], STRIP_EXTENSION, &len)) {
> +		char *stripped = xmemdupz(args->v[0], len);
> +		strvec_replace(args, 0, stripped);
> +		free(stripped);
> +	}
>  }
>  #else
>  #define strip_extension(cmd)
>  #endif
>  
> -static void handle_builtin(int argc, const char **argv)
> +static void handle_builtin(struct strvec *args)
>  {
> -	struct strvec args = STRVEC_INIT;
> -	const char **argv_copy = NULL;
>  	const char *cmd;
>  	struct cmd_struct *builtin;
>  
> -	strip_extension(argv);
> -	cmd = argv[0];
> +	strip_extension(args);
> +	cmd = args->v[0];
>  
>  	/* Turn "git cmd --help" into "git help --exclude-guides cmd" */
> -	if (argc > 1 && !strcmp(argv[1], "--help")) {
> -		int i;
> -
> -		argv[1] = argv[0];
> -		argv[0] = cmd = "help";
> -
> -		for (i = 0; i < argc; i++) {
> -			strvec_push(&args, argv[i]);
> -			if (!i)
> -				strvec_push(&args, "--exclude-guides");
> -		}
> +	if (args->nr > 1 && !strcmp(args->v[1], "--help")) {
> +		const char *exclude_guides_arg[] = { "--exclude-guides" };
> +
> +		strvec_replace(args, 1, args->v[0]);
> +		strvec_replace(args, 0, "help");
> +		cmd = "help";
> +		strvec_splice(args, 2, 0, exclude_guides_arg,
> +			      ARRAY_SIZE(exclude_guides_arg));
> +	}
>  
> -		argc++;
> +	builtin = get_builtin(cmd);
> +	if (builtin) {
> +		const char **argv_copy = NULL;
> +		int ret;
>  
>  		/*
>  		 * `run_builtin()` will modify the argv array, so we need to
>  		 * create a shallow copy such that we can free all of its
>  		 * strings.
>  		 */
> -		CALLOC_ARRAY(argv_copy, argc + 1);
> -		COPY_ARRAY(argv_copy, args.v, argc);
> +		if (args->nr)
> +			DUP_ARRAY(argv_copy, args->v, args->nr + 1);
>  
> -		argv = argv_copy;
> -	}
> -
> -	builtin = get_builtin(cmd);
> -	if (builtin) {
> -		int ret = run_builtin(builtin, argc, argv, the_repository);
> -		strvec_clear(&args);
> +		ret = run_builtin(builtin, args->nr, argv_copy, the_repository);
> +		strvec_clear(args);
>  		free(argv_copy);
>  		exit(ret);
>  	}
> -
> -	strvec_clear(&args);
> -	free(argv_copy);
>  }

Just want to give you a little shout out how you've reorganized the code and it now makes a lot more sense how `argv_copy` is used by putting it inside the `if (builtin)` code block.

-- 
Toon
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 12/27] split-index: fix memory leak in `move_cache_to_base_index()`

In `move_cache_to_base_index()` we move the index cache of the main index into the split index, which is used when writing a shared index. But we don't release the old split index base in case we already had a split index before this operation, which can thus leak memory.

Plug the leak by releasing the previous base.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 split-index.c          | 6 +++++-
 t/t1700-split-index.sh | 1 +
 2 files changed, 6 insertions(+), 1 deletion(-)
Show changes to 2 files +6 −1

split-index.c, t/t1700-split-index.sh

diff --git a/split-index.c b/split-index.c
index 120c8190b187bc8c6c73630f06f5dd4dc994df30..cfbc773e6cd3b11ea5f47ab92310a56c30f6971c 100644
--- a/split-index.c
+++ b/split-index.c
@@ -97,7 +97,11 @@ void move_cache_to_base_index(struct index_state *istate)
 		mem_pool_combine(istate->ce_mem_pool, istate->split_index->base->ce_mem_pool);
 	}
 
-	ALLOC_ARRAY(si->base, 1);
+	if (si->base)
+		release_index(si->base);
+	else
+		ALLOC_ARRAY(si->base, 1);
+
 	index_state_init(si->base, istate->repo);
 	si->base->version = istate->version;
 	/* zero timestamp disables racy test in ce_write_index() */
diff --git a/t/t1700-split-index.sh b/t/t1700-split-index.sh
index ac4a5b2734c0784c2cb8878112a5ead9593860de..2625ac44889a5c9219e9575a9bbc5265d3c419d5 100755
--- a/t/t1700-split-index.sh
+++ b/t/t1700-split-index.sh
@@ -5,6 +5,7 @@ test_description='split index mode tests'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # We need total control of index splitting here
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 13/27] builtin/sparse-checkout: fix leaking sanitized patterns

Both `git sparse-checkout add` and `git sparse-checkout set` accept a list of additional directories or patterns. These get massaged via calls to `sanitize_paths()`, which may end up modifying the passed-in array by updating its pointers to be prefixed paths. This allocates memory that we never free.

Refactor the code to instead use a `struct strvec`, which makes it way easier for us to track the lifetime correctly. The couple of extra memory allocations likely do not matter as we only ever populate it with command line arguments.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 builtin/sparse-checkout.c | 61 ++++++++++++++++++++++++++++++-----------------
 1 file changed, 39 insertions(+), 22 deletions(-)
Show changes to builtin/sparse-checkout.c +39 −22
diff --git a/builtin/sparse-checkout.c b/builtin/sparse-checkout.c
index 49aedc1de81a17b8b491cded7fa71b384e0e8be9..698d93a9ec5ed6d51d4a1db212f776b2db06cfc3 100644
--- a/builtin/sparse-checkout.c
+++ b/builtin/sparse-checkout.c
@@ -669,7 +669,7 @@ static void add_patterns_literal(int argc, const char **argv,
 	add_patterns_from_input(pl, argc, argv, use_stdin ? stdin : NULL);
 }
 
-static int modify_pattern_list(int argc, const char **argv, int use_stdin,
+static int modify_pattern_list(struct strvec *args, int use_stdin,
 			       enum modify_type m)
 {
 	int result;
@@ -679,13 +679,13 @@ static int modify_pattern_list(int argc, const char **argv, int use_stdin,
 	switch (m) {
 	case ADD:
 		if (core_sparse_checkout_cone)
-			add_patterns_cone_mode(argc, argv, pl, use_stdin);
+			add_patterns_cone_mode(args->nr, args->v, pl, use_stdin);
 		else
-			add_patterns_literal(argc, argv, pl, use_stdin);
+			add_patterns_literal(args->nr, args->v, pl, use_stdin);
 		break;
 
 	case REPLACE:
-		add_patterns_from_input(pl, argc, argv,
+		add_patterns_from_input(pl, args->nr, args->v,
 					use_stdin ? stdin : NULL);
 		break;
 	}
@@ -706,12 +706,12 @@ static int modify_pattern_list(int argc, const char **argv, int use_stdin,
 	return result;
 }
 
-static void sanitize_paths(int argc, const char **argv,
+static void sanitize_paths(struct strvec *args,
 			   const char *prefix, int skip_checks)
 {
 	int i;
 
-	if (!argc)
+	if (!args->nr)
 		return;
 
 	if (prefix && *prefix && core_sparse_checkout_cone) {
@@ -721,8 +721,11 @@ static void sanitize_paths(int argc, const char **argv,
 		 */
 		int prefix_len = strlen(prefix);
 
-		for (i = 0; i < argc; i++)
-			argv[i] = prefix_path(prefix, prefix_len, argv[i]);
+		for (i = 0; i < args->nr; i++) {
+			char *prefixed_path = prefix_path(prefix, prefix_len, args->v[i]);
+			strvec_replace(args, i, prefixed_path);
+			free(prefixed_path);
+		}
 	}
 
 	if (skip_checks)
@@ -732,20 +735,20 @@ static void sanitize_paths(int argc, const char **argv,
 		die(_("please run from the toplevel directory in non-cone mode"));
 
 	if (core_sparse_checkout_cone) {
-		for (i = 0; i < argc; i++) {
-			if (argv[i][0] == '/')
+		for (i = 0; i < args->nr; i++) {
+			if (args->v[i][0] == '/')
 				die(_("specify directories rather than patterns (no leading slash)"));
-			if (argv[i][0] == '!')
+			if (args->v[i][0] == '!')
 				die(_("specify directories rather than patterns.  If your directory starts with a '!', pass --skip-checks"));
-			if (strpbrk(argv[i], "*?[]"))
+			if (strpbrk(args->v[i], "*?[]"))
 				die(_("specify directories rather than patterns.  If your directory really has any of '*?[]\\' in it, pass --skip-checks"));
 		}
 	}
 
-	for (i = 0; i < argc; i++) {
+	for (i = 0; i < args->nr; i++) {
 		struct cache_entry *ce;
 		struct index_state *index = the_repository->index;
-		int pos = index_name_pos(index, argv[i], strlen(argv[i]));
+		int pos = index_name_pos(index, args->v[i], strlen(args->v[i]));
 
 		if (pos < 0)
 			continue;
@@ -754,9 +757,9 @@ static void sanitize_paths(int argc, const char **argv,
 			continue;
 
 		if (core_sparse_checkout_cone)
-			die(_("'%s' is not a directory; to treat it as a directory anyway, rerun with --skip-checks"), argv[i]);
+			die(_("'%s' is not a directory; to treat it as a directory anyway, rerun with --skip-checks"), args->v[i]);
 		else
-			warning(_("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]);
+			warning(_("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]);
 	}
 }
 
@@ -780,6 +783,8 @@ static int sparse_checkout_add(int argc, const char **argv, const char *prefix)
 			 N_("read patterns from standard in")),
 		OPT_END(),
 	};
+	struct strvec patterns = STRVEC_INIT;
+	int ret;
 
 	setup_work_tree();
 	if (!core_apply_sparse_checkout)
@@ -791,9 +796,14 @@ static int sparse_checkout_add(int argc, const char **argv, const char *prefix)
 			     builtin_sparse_checkout_add_options,
 			     builtin_sparse_checkout_add_usage, 0);
 
-	sanitize_paths(argc, argv, prefix, add_opts.skip_checks);
+	for (int i = 0; i < argc; i++)
+		strvec_push(&patterns, argv[i]);
+	sanitize_paths(&patterns, prefix, add_opts.skip_checks);
 
-	return modify_pattern_list(argc, argv, add_opts.use_stdin, ADD);
+	ret = modify_pattern_list(&patterns, add_opts.use_stdin, ADD);
+
+	strvec_clear(&patterns);
+	return ret;
 }
 
 static char const * const builtin_sparse_checkout_set_usage[] = {
@@ -826,6 +836,8 @@ static int sparse_checkout_set(int argc, const char **argv, const char *prefix)
 			   PARSE_OPT_NONEG),
 		OPT_END(),
 	};
+	struct strvec patterns = STRVEC_INIT;
+	int ret;
 
 	setup_work_tree();
 	repo_read_index(the_repository);
@@ -846,13 +858,18 @@ static int sparse_checkout_set(int argc, const char **argv, const char *prefix)
 	 * top-level directory (much as 'init' would do).
 	 */
 	if (!core_sparse_checkout_cone && !set_opts.use_stdin && argc == 0) {
-		argv = default_patterns;
-		argc = default_patterns_nr;
+		for (int i = 0; i < default_patterns_nr; i++)
+			strvec_push(&patterns, default_patterns[i]);
 	} else {
-		sanitize_paths(argc, argv, prefix, set_opts.skip_checks);
+		for (int i = 0; i < argc; i++)
+			strvec_push(&patterns, argv[i]);
+		sanitize_paths(&patterns, prefix, set_opts.skip_checks);
 	}
 
-	return modify_pattern_list(argc, argv, set_opts.use_stdin, REPLACE);
+	ret = modify_pattern_list(&patterns, set_opts.use_stdin, REPLACE);
+
+	strvec_clear(&patterns);
+	return ret;
 }
 
 static char const * const builtin_sparse_checkout_reapply_usage[] = {
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 14/27] help: refactor to not use globals for reading config

We're reading the "help.autocorrect" and "alias.*" configuration into global variables, which makes it hard to manage their lifetime correctly. Refactor the code to use a struct instead.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 help.c | 47 ++++++++++++++++++++++++-----------------------
 1 file changed, 24 insertions(+), 23 deletions(-)
Show changes to help.c +24 −23
diff --git a/help.c b/help.c
index 4ad4ebdd2cfddb3191bb4f6d593a55d3c5d3ed14..8794f81db9bbf457b7cabca59222299922f3cc7f 100644
--- a/help.c
+++ b/help.c
@@ -546,8 +546,10 @@ int is_in_cmdlist(struct cmdnames *c, const char *s)
 	return 0;
 }
 
-static int autocorrect;
-static struct cmdnames aliases;
+struct help_unknown_cmd_config {
+	int autocorrect;
+	struct cmdnames aliases;
+};
 
 #define AUTOCORRECT_PROMPT (-3)
 #define AUTOCORRECT_NEVER (-2)
@@ -555,28 +557,29 @@ static struct cmdnames aliases;
 
 static int git_unknown_cmd_config(const char *var, const char *value,
 				  const struct config_context *ctx,
-				  void *cb UNUSED)
+				  void *cb)
 {
+	struct help_unknown_cmd_config *cfg = cb;
 	const char *p;
 
 	if (!strcmp(var, "help.autocorrect")) {
 		if (!value)
 			return config_error_nonbool(var);
 		if (!strcmp(value, "never")) {
-			autocorrect = AUTOCORRECT_NEVER;
+			cfg->autocorrect = AUTOCORRECT_NEVER;
 		} else if (!strcmp(value, "immediate")) {
-			autocorrect = AUTOCORRECT_IMMEDIATELY;
+			cfg->autocorrect = AUTOCORRECT_IMMEDIATELY;
 		} else if (!strcmp(value, "prompt")) {
-			autocorrect = AUTOCORRECT_PROMPT;
+			cfg->autocorrect = AUTOCORRECT_PROMPT;
 		} else {
 			int v = git_config_int(var, value, ctx->kvi);
-			autocorrect = (v < 0)
+			cfg->autocorrect = (v < 0)
 				? AUTOCORRECT_IMMEDIATELY : v;
 		}
 	}
 	/* Also use aliases for command lookup */
 	if (skip_prefix(var, "alias.", &p))
-		add_cmdname(&aliases, p, strlen(p));
+		add_cmdname(&cfg->aliases, p, strlen(p));
 
 	return 0;
 }
@@ -611,30 +614,28 @@ static const char bad_interpreter_advice[] =
 
 const char *help_unknown_cmd(const char *cmd)
 {
+	struct help_unknown_cmd_config cfg = { 0 };
 	int i, n, best_similarity = 0;
-	struct cmdnames main_cmds, other_cmds;
+	struct cmdnames main_cmds = { 0 };
+	struct cmdnames other_cmds = { 0 };
 	struct cmdname_help *common_cmds;
 
-	memset(&main_cmds, 0, sizeof(main_cmds));
-	memset(&other_cmds, 0, sizeof(other_cmds));
-	memset(&aliases, 0, sizeof(aliases));
-
-	read_early_config(the_repository, git_unknown_cmd_config, NULL);
+	read_early_config(the_repository, git_unknown_cmd_config, &cfg);
 
 	/*
 	 * Disable autocorrection prompt in a non-interactive session
 	 */
-	if ((autocorrect == AUTOCORRECT_PROMPT) && (!isatty(0) || !isatty(2)))
-		autocorrect = AUTOCORRECT_NEVER;
+	if ((cfg.autocorrect == AUTOCORRECT_PROMPT) && (!isatty(0) || !isatty(2)))
+		cfg.autocorrect = AUTOCORRECT_NEVER;
 
-	if (autocorrect == AUTOCORRECT_NEVER) {
+	if (cfg.autocorrect == AUTOCORRECT_NEVER) {
 		fprintf_ln(stderr, _("git: '%s' is not a git command. See 'git --help'."), cmd);
 		exit(1);
 	}
 
 	load_command_list("git-", &main_cmds, &other_cmds);
 
-	add_cmd_list(&main_cmds, &aliases);
+	add_cmd_list(&main_cmds, &cfg.aliases);
 	add_cmd_list(&main_cmds, &other_cmds);
 	QSORT(main_cmds.names, main_cmds.cnt, cmdname_compare);
 	uniq(&main_cmds);
@@ -693,7 +694,7 @@ const char *help_unknown_cmd(const char *cmd)
 		     n++)
 			; /* still counting */
 	}
-	if (autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) {
+	if (cfg.autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) {
 		const char *assumed = main_cmds.names[0]->name;
 		main_cmds.names[0] = NULL;
 		cmdnames_release(&main_cmds);
@@ -701,12 +702,12 @@ const char *help_unknown_cmd(const char *cmd)
 			   _("WARNING: You called a Git command named '%s', "
 			     "which does not exist."),
 			   cmd);
-		if (autocorrect == AUTOCORRECT_IMMEDIATELY)
+		if (cfg.autocorrect == AUTOCORRECT_IMMEDIATELY)
 			fprintf_ln(stderr,
 				   _("Continuing under the assumption that "
 				     "you meant '%s'."),
 				   assumed);
-		else if (autocorrect == AUTOCORRECT_PROMPT) {
+		else if (cfg.autocorrect == AUTOCORRECT_PROMPT) {
 			char *answer;
 			struct strbuf msg = STRBUF_INIT;
 			strbuf_addf(&msg, _("Run '%s' instead [y/N]? "), assumed);
@@ -719,8 +720,8 @@ const char *help_unknown_cmd(const char *cmd)
 			fprintf_ln(stderr,
 				   _("Continuing in %0.1f seconds, "
 				     "assuming that you meant '%s'."),
-				   (float)autocorrect/10.0, assumed);
-			sleep_millisec(autocorrect * 100);
+				   (float)cfg.autocorrect/10.0, assumed);
+			sleep_millisec(cfg.autocorrect * 100);
 		}
 		return assumed;
 	}
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 15/27] help: fix leaking `struct cmdnames`

We're populating multiple `struct cmdnames`, but don't ever free them. Plug this memory leak.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 help.c | 4 ++++
 1 file changed, 4 insertions(+)
Show changes to help.c +4 −0
diff --git a/help.c b/help.c
index 8794f81db9bbf457b7cabca59222299922f3cc7f..8b56cd6e25ba5f2be2cbf2a7a9ed48136e12a0c7 100644
--- a/help.c
+++ b/help.c
@@ -723,6 +723,10 @@ const char *help_unknown_cmd(const char *cmd)
 				   (float)cfg.autocorrect/10.0, assumed);
 			sleep_millisec(cfg.autocorrect * 100);
 		}
+
+		cmdnames_release(&cfg.aliases);
+		cmdnames_release(&main_cmds);
+		cmdnames_release(&other_cmds);
 		return assumed;
 	}
 
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 16/27] help: fix leaking return value from `help_unknown_cmd()`

While `help_unknown_cmd()` would usually die on an unknown command, it instead returns an autocorrected command when "help.autocorrect" is set. But while the function is declared to return a string constant, it actually returns an allocated string in that case. Callers thus aren't aware that they have to free the string, leading to a memory leak.

Fix the function return type to be non-constant and free the returned value at its only callsite.

Note that we cannot simply take ownership of `main_cmds.names[0]->name` and then eventually free it. This is because the `struct cmdname` is using a flex array to allocate the name, so the name pointer points into the middle of the structure and thus cannot be freed.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 git.c  | 4 +++-
 help.c | 7 +++----
 help.h | 2 +-
 3 files changed, 7 insertions(+), 6 deletions(-)
Show changes to 3 files +7 −6

git.c, help.c, help.h

diff --git a/git.c b/git.c
index 159dd45b08204c4a89d1dc4ab6990978e2454eb6..46b3c740c5d665388917c6eee3052cc3ef8368f2 100644
--- a/git.c
+++ b/git.c
@@ -961,7 +961,9 @@ int cmd_main(int argc, const char **argv)
 			exit(1);
 		}
 		if (!done_help) {
-			strvec_replace(&args, 0, help_unknown_cmd(cmd));
+			char *assumed = help_unknown_cmd(cmd);
+			strvec_replace(&args, 0, assumed);
+			free(assumed);
 			cmd = args.v[0];
 			done_help = 1;
 		} else {
diff --git a/help.c b/help.c
index 8b56cd6e25ba5f2be2cbf2a7a9ed48136e12a0c7..8a830ba35c6fd1377213e2ed40846f3d46dba363 100644
--- a/help.c
+++ b/help.c
@@ -612,7 +612,7 @@ static const char bad_interpreter_advice[] =
 	N_("'%s' appears to be a git command, but we were not\n"
 	"able to execute it. Maybe git-%s is broken?");
 
-const char *help_unknown_cmd(const char *cmd)
+char *help_unknown_cmd(const char *cmd)
 {
 	struct help_unknown_cmd_config cfg = { 0 };
 	int i, n, best_similarity = 0;
@@ -695,9 +695,8 @@ const char *help_unknown_cmd(const char *cmd)
 			; /* still counting */
 	}
 	if (cfg.autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) {
-		const char *assumed = main_cmds.names[0]->name;
-		main_cmds.names[0] = NULL;
-		cmdnames_release(&main_cmds);
+		char *assumed = xstrdup(main_cmds.names[0]->name);
+
 		fprintf_ln(stderr,
 			   _("WARNING: You called a Git command named '%s', "
 			     "which does not exist."),
diff --git a/help.h b/help.h
index e716ee27ea174c4dfc3b941619bf361972894212..67207b3073ce48fa25f67f9a4922abc4e2ce7926 100644
--- a/help.h
+++ b/help.h
@@ -32,7 +32,7 @@ void list_all_other_cmds(struct string_list *list);
 void list_cmds_by_category(struct string_list *list,
 			   const char *category);
 void list_cmds_by_config(struct string_list *list);
-const char *help_unknown_cmd(const char *cmd);
+char *help_unknown_cmd(const char *cmd);
 void load_command_list(const char *prefix,
 		       struct cmdnames *main_cmds,
 		       struct cmdnames *other_cmds);
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 17/27] builtin/help: fix leaks in `check_git_cmd()`

The `check_git_cmd()` function is declared to return a string constant. And while it sometimes does return a constant, it may also return an allocated string in two cases:

  - When handling aliases. This case is already marked with `UNLEAK()`
    to work around the leak.
  - When handling unknown commands in case "help.autocorrect" is
    enabled. This one is not marked with `UNLEAK()`.

The function only has a single caller, so let's fix its return type to be non-constant, consistently return an allocated string and free it at its callsite to plug the leak.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 builtin/help.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)
Show changes to builtin/help.c +7 −6
diff --git a/builtin/help.c b/builtin/help.c
index 4a5a0790704b402e6f989118a0f90b52eb49dae1..6a72d991a84d9f14ecb8a711a012ed544450ca1c 100644
--- a/builtin/help.c
+++ b/builtin/help.c
@@ -551,12 +551,12 @@ static void show_html_page(const char *page)
 	open_html(page_path.buf);
 }
 
-static const char *check_git_cmd(const char* cmd)
+static char *check_git_cmd(const char *cmd)
 {
 	char *alias;
 
 	if (is_git_command(cmd))
-		return cmd;
+		return xstrdup(cmd);
 
 	alias = alias_lookup(cmd);
 	if (alias) {
@@ -589,14 +589,13 @@ static const char *check_git_cmd(const char* cmd)
 			die(_("bad alias.%s string: %s"), cmd,
 			    split_cmdline_strerror(count));
 		free(argv);
-		UNLEAK(alias);
 		return alias;
 	}
 
 	if (exclude_guides)
 		return help_unknown_cmd(cmd);
 
-	return cmd;
+	return xstrdup(cmd);
 }
 
 static void no_help_format(const char *opt_mode, enum help_format fmt)
@@ -642,6 +641,7 @@ int cmd_help(int argc,
 {
 	int nongit;
 	enum help_format parsed_help_format;
+	char *command = NULL;
 	const char *page;
 
 	argc = parse_options(argc, argv, prefix, builtin_help_options,
@@ -713,9 +713,9 @@ int cmd_help(int argc,
 	if (help_format == HELP_FORMAT_NONE)
 		help_format = parse_help_format(DEFAULT_HELP_FORMAT);
 
-	argv[0] = check_git_cmd(argv[0]);
+	command = check_git_cmd(argv[0]);
 
-	page = cmd_to_page(argv[0]);
+	page = cmd_to_page(command);
 	switch (help_format) {
 	case HELP_FORMAT_NONE:
 	case HELP_FORMAT_MAN:
@@ -729,5 +729,6 @@ int cmd_help(int argc,
 		break;
 	}
 
+	free(command);
 	return 0;
 }
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 18/27] builtin/init-db: fix leaking directory paths

We've got a couple of leaking directory paths in git-init(1), all of which are marked with `UNLEAK()`. Fixing them is trivial, so let's do that instead so that we can get rid of `UNLEAK()` entirely.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 builtin/init-db.c | 34 +++++++++++++++++++---------------
 1 file changed, 19 insertions(+), 15 deletions(-)
Show changes to builtin/init-db.c +19 −15
diff --git a/builtin/init-db.c b/builtin/init-db.c
index 7e00d57d654e6820c7ad2418cafc3a9aca815816..096f96b9c4a2035b8d1edd0ac90de0dd73d7d508 100644
--- a/builtin/init-db.c
+++ b/builtin/init-db.c
@@ -75,10 +75,12 @@ int cmd_init_db(int argc,
 		const char *prefix,
 		struct repository *repo UNUSED)
 {
-	const char *git_dir;
+	char *git_dir;
 	const char *real_git_dir = NULL;
-	const char *work_tree;
+	char *real_git_dir_to_free = NULL;
+	char *work_tree = NULL;
 	const char *template_dir = NULL;
+	char *template_dir_to_free = NULL;
 	unsigned int flags = 0;
 	const char *object_format = NULL;
 	const char *ref_format = NULL;
@@ -106,6 +108,7 @@ int cmd_init_db(int argc,
 			   N_("specify the reference format to use")),
 		OPT_END()
 	};
+	int ret;
 
 	argc = parse_options(argc, argv, prefix, init_db_options, init_db_usage, 0);
 
@@ -113,12 +116,10 @@ int cmd_init_db(int argc,
 		die(_("options '%s' and '%s' cannot be used together"), "--separate-git-dir", "--bare");
 
 	if (real_git_dir && !is_absolute_path(real_git_dir))
-		real_git_dir = real_pathdup(real_git_dir, 1);
+		real_git_dir = real_git_dir_to_free = real_pathdup(real_git_dir, 1);
 
-	if (template_dir && *template_dir && !is_absolute_path(template_dir)) {
-		template_dir = absolute_pathdup(template_dir);
-		UNLEAK(template_dir);
-	}
+	if (template_dir && *template_dir && !is_absolute_path(template_dir))
+		template_dir = template_dir_to_free = absolute_pathdup(template_dir);
 
 	if (argc == 1) {
 		int mkdir_tried = 0;
@@ -192,7 +193,7 @@ int cmd_init_db(int argc,
 	 * Set up the default .git directory contents
 	 */
 	if (!git_dir)
-		git_dir = DEFAULT_GIT_DIR_ENVIRONMENT;
+		git_dir = xstrdup(DEFAULT_GIT_DIR_ENVIRONMENT);
 
 	/*
 	 * When --separate-git-dir is used inside a linked worktree, take
@@ -213,6 +214,7 @@ int cmd_init_db(int argc,
 			if (chdir(mainwt.buf) < 0)
 				die_errno(_("cannot chdir to %s"), mainwt.buf);
 			strbuf_release(&mainwt);
+			free(git_dir);
 			git_dir = strbuf_detach(&sb, NULL);
 		}
 		strbuf_release(&sb);
@@ -245,12 +247,14 @@ int cmd_init_db(int argc,
 			set_git_work_tree(work_tree);
 	}
 
-	UNLEAK(real_git_dir);
-	UNLEAK(git_dir);
-	UNLEAK(work_tree);
-
 	flags |= INIT_DB_EXIST_OK;
-	return init_db(git_dir, real_git_dir, template_dir, hash_algo,
-		       ref_storage_format, initial_branch,
-		       init_shared_repository, flags);
+	ret = init_db(git_dir, real_git_dir, template_dir, hash_algo,
+		      ref_storage_format, initial_branch,
+		      init_shared_repository, flags);
+
+	free(template_dir_to_free);
+	free(real_git_dir_to_free);
+	free(work_tree);
+	free(git_dir);
+	return ret;
 }
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 19/27] builtin/branch: fix leaking sorting options

The sorting options are leaking, but given that they are marked with `UNLEAK()` the leak sanitizer doesn't complain.

Fix the leak by creating a common exit path and clearing the vector such that we can get rid of the `UNLEAK()` annotation entirely.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 builtin/branch.c | 33 ++++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 11 deletions(-)
Show changes to builtin/branch.c +22 −11
diff --git a/builtin/branch.c b/builtin/branch.c
index fd1611ebf559f7665114c41ee379db24fdb357fd..05ba4cd7a6454d8753d983082807a06dd989cb48 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -722,6 +722,7 @@ int cmd_branch(int argc,
 	static struct ref_sorting *sorting;
 	struct string_list sorting_options = STRING_LIST_INIT_DUP;
 	struct ref_format format = REF_FORMAT_INIT;
+	int ret;
 
 	struct option options[] = {
 		OPT_GROUP(N_("Generic options")),
@@ -851,15 +852,15 @@ int cmd_branch(int argc,
 	if (list)
 		setup_auto_pager("branch", 1);
 
-	UNLEAK(sorting_options);
-
 	if (delete) {
 		if (!argc)
 			die(_("branch name required"));
-		return delete_branches(argc, argv, delete > 1, filter.kind, quiet);
+		ret = delete_branches(argc, argv, delete > 1, filter.kind, quiet);
+		goto out;
 	} else if (show_current) {
 		print_current_branch_name();
-		return 0;
+		ret = 0;
+		goto out;
 	} else if (list) {
 		/*  git branch --list also shows HEAD when it is detached */
 		if ((filter.kind & FILTER_REFS_BRANCHES) && filter.detached)
@@ -882,12 +883,13 @@ int cmd_branch(int argc,
 		ref_sorting_release(sorting);
 		ref_filter_clear(&filter);
 		ref_format_clear(&format);
-		return 0;
+
+		ret = 0;
+		goto out;
 	} else if (edit_description) {
 		const char *branch_name;
 		struct strbuf branch_ref = STRBUF_INIT;
 		struct strbuf buf = STRBUF_INIT;
-		int ret = 1; /* assume failure */
 
 		if (!argc) {
 			if (filter.detached)
@@ -901,18 +903,22 @@ int cmd_branch(int argc,
 		}
 
 		strbuf_addf(&branch_ref, "refs/heads/%s", branch_name);
-		if (!refs_ref_exists(get_main_ref_store(the_repository), branch_ref.buf))
+		if (!refs_ref_exists(get_main_ref_store(the_repository), branch_ref.buf)) {
 			error((!argc || branch_checked_out(branch_ref.buf))
 			      ? _("no commit on branch '%s' yet")
 			      : _("no branch named '%s'"),
 			      branch_name);
-		else if (!edit_branch_description(branch_name))
+			ret = 1;
+		} else if (!edit_branch_description(branch_name)) {
 			ret = 0; /* happy */
+		} else {
+			ret = 1;
+		}
 
 		strbuf_release(&branch_ref);
 		strbuf_release(&buf);
 
-		return ret;
+		goto out;
 	} else if (copy || rename) {
 		if (!argc)
 			die(_("branch name required"));
@@ -1000,12 +1006,17 @@ int cmd_branch(int argc,
 			create_branches_recursively(the_repository, branch_name,
 						    start_name, NULL, force,
 						    reflog, quiet, track, 0);
-			return 0;
+			ret = 0;
+			goto out;
 		}
 		create_branch(the_repository, branch_name, start_name, force, 0,
 			      reflog, quiet, track, 0);
 	} else
 		usage_with_options(builtin_branch_usage, options);
 
-	return 0;
+	ret = 0;
+
+out:
+	string_list_clear(&sorting_options, 0);
+	return ret;
 }
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 20/27] t/helper: fix leaking commit graph in "read-graph" subcommand

We're leaking the commit-graph in the "test-helper read-graph" subcommand, but as the leak is annotated with `UNLEAK()` the leak sanitizer doesn't complain.

Fix the leak by calling `free_commit_graph()`. Besides getting rid of the `UNLEAK()` annotation, it also increases code coverage because we properly release resources as Git would do it, as well.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 t/helper/test-read-graph.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
Show changes to t/helper/test-read-graph.c +1 −2
diff --git a/t/helper/test-read-graph.c b/t/helper/test-read-graph.c
index 9018c9f54122833eaf9dde52ced06e354e1919ef..811dde1cb3c8809352f79428a589c2158fc62545 100644
--- a/t/helper/test-read-graph.c
+++ b/t/helper/test-read-graph.c
@@ -97,7 +97,6 @@ int cmd__read_graph(int argc, const char **argv)
 	}
 
 done:
-	UNLEAK(graph);
-
+	free_commit_graph(graph);
 	return ret;
 }
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 21/27] global: drop `UNLEAK()` annotation

There are two users of `UNLEAK()` left in our codebase:
  - In "builtin/clone.c", annotating the `repo` variable. That leak has
    already been fixed though as you can see in the context, where we do
    know to free `repo_to_free`.
  - In "builtin/diff.c", to unleak entries of the `blob[]` array. That
    leak has also been fixed, because the entries we assign to that
    array come from `rev.pending.objects`, and we do eventually release
    `rev`.

This neatly demonstrates one of the issues with `UNLEAK()`: it is quite easy for the annotation to become stale. A second issue is that its whole intent is to paper over leaks. And while that has been a necessary evil in the past, because Git was leaking left and right, it isn't really much of an issue nowadays where our test suite has no known leaks anymore.

Remove the last two users of this macro.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 builtin/clone.c | 1 -
 builtin/diff.c  | 1 -
 2 files changed, 2 deletions(-)
Show changes to 2 files +0 −2

builtin/clone.c, builtin/diff.c

diff --git a/builtin/clone.c b/builtin/clone.c
index 59fcb317a68a77eee3ca96a60720c556e044c369..e851b1475d7be8f0af78c27d4ef15467a2769a74 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -1586,7 +1586,6 @@ int cmd_clone(int argc,
 	free(dir);
 	free(path);
 	free(repo_to_free);
-	UNLEAK(repo);
 	junk_mode = JUNK_LEAVE_ALL;
 
 	transport_ls_refs_options_release(&transport_ls_refs_options);
diff --git a/builtin/diff.c b/builtin/diff.c
index dca52d4221ed19d27950bee9022ae7efb1d2f17a..2fe92f373e9991489fcaeeba381bbfe017a5316a 100644
--- a/builtin/diff.c
+++ b/builtin/diff.c
@@ -628,6 +628,5 @@ int cmd_diff(int argc,
 	release_revisions(&rev);
 	object_array_clear(&ent);
 	symdiff_release(&sdiff);
-	UNLEAK(blob);
 	return result;
 }
-- 
2.47.0.229.g8f8d6eee53.dirty
Jeff King· Nov 12, 2024, 08:26 UTC · re: Patrick Steinhardt · lore

Re: [PATCH v2 21/27] global: drop `UNLEAK()` annotation

On Mon, Nov 11, 2024 at 11:38:50AM +0100, Patrick Steinhardt wrote:
Show 10 quoted lines
> There are two users of `UNLEAK()` left in our codebase:
> 
>   - In "builtin/clone.c", annotating the `repo` variable. That leak has
>     already been fixed though as you can see in the context, where we do
>     know to free `repo_to_free`.
> 
>   - In "builtin/diff.c", to unleak entries of the `blob[]` array. That
>     leak has also been fixed, because the entries we assign to that
>     array come from `rev.pending.objects`, and we do eventually release
>     `rev`.
Yay, as the author of UNLEAK() I'm in favor of getting rid of it.
Show 6 quoted lines
> This neatly demonstrates one of the issues with `UNLEAK()`: it is quite
> easy for the annotation to become stale. A second issue is that its
> whole intent is to paper over leaks. And while that has been a necessary
> evil in the past, because Git was leaking left and right, it isn't
> really much of an issue nowadays where our test suite has no known leaks
> anymore.

I do agree that stale annotations are a weakness (they do not hurt the leak-checker if they exist, but they are an eye-sore).

I'm not sure I would agree that the intent was to paper over leaks. The point was to avoid noise from the leak-checker about memory that was intentionally held until program exit and released by returning from main(). I think the main thing that made it obsolete is that we decided it was worth it to spend the cycles freeing that memory rather than ignoring it.

But it's possible I'm just splitting hairs. :)

At any rate, for whatever reason people did not seem to use it as intended, and _did_ end up annotating real leaks (papering over them). I guess I could have done a better job of explaining it.

-Peff
Patrick Steinhardt· Nov 12, 2024, 08:53 UTC · re: Jeff King · lore

Re: [PATCH v2 21/27] global: drop `UNLEAK()` annotation

On Tue, Nov 12, 2024 at 03:26:09AM -0500, Jeff King wrote:
Show 19 quoted lines
> On Mon, Nov 11, 2024 at 11:38:50AM +0100, Patrick Steinhardt wrote:
> > This neatly demonstrates one of the issues with `UNLEAK()`: it is quite
> > easy for the annotation to become stale. A second issue is that its
> > whole intent is to paper over leaks. And while that has been a necessary
> > evil in the past, because Git was leaking left and right, it isn't
> > really much of an issue nowadays where our test suite has no known leaks
> > anymore.
> 
> I do agree that stale annotations are a weakness (they do not hurt the
> leak-checker if they exist, but they are an eye-sore).
> 
> I'm not sure I would agree that the intent was to paper over leaks. The
> point was to avoid noise from the leak-checker about memory that was
> intentionally held until program exit and released by returning from
> main(). I think the main thing that made it obsolete is that we decided
> it was worth it to spend the cycles freeing that memory rather than
> ignoring it.
> 
> But it's possible I'm just splitting hairs. :)

Yeah, I know that this was also used to mark memory that intentionally leaks because we're about to exit anyway. I basically consider that as some form of "papering over" it, but I get your comment that this may be a bit too strongly worded.

Do you want me to reformulate this, or do we just go with the current description?

Patrick
Jeff King· Nov 12, 2024, 09:03 UTC · re: Patrick Steinhardt · lore

Re: [PATCH v2 21/27] global: drop `UNLEAK()` annotation

On Tue, Nov 12, 2024 at 09:53:28AM +0100, Patrick Steinhardt wrote:
Show 28 quoted lines
> On Tue, Nov 12, 2024 at 03:26:09AM -0500, Jeff King wrote:
> > On Mon, Nov 11, 2024 at 11:38:50AM +0100, Patrick Steinhardt wrote:
> > > This neatly demonstrates one of the issues with `UNLEAK()`: it is quite
> > > easy for the annotation to become stale. A second issue is that its
> > > whole intent is to paper over leaks. And while that has been a necessary
> > > evil in the past, because Git was leaking left and right, it isn't
> > > really much of an issue nowadays where our test suite has no known leaks
> > > anymore.
> > 
> > I do agree that stale annotations are a weakness (they do not hurt the
> > leak-checker if they exist, but they are an eye-sore).
> > 
> > I'm not sure I would agree that the intent was to paper over leaks. The
> > point was to avoid noise from the leak-checker about memory that was
> > intentionally held until program exit and released by returning from
> > main(). I think the main thing that made it obsolete is that we decided
> > it was worth it to spend the cycles freeing that memory rather than
> > ignoring it.
> > 
> > But it's possible I'm just splitting hairs. :)
> 
> Yeah, I know that this was also used to mark memory that intentionally
> leaks because we're about to exit anyway. I basically consider that as
> some form of "papering over" it, but I get your comment that this may be
> a bit too strongly worded.
> 
> Do you want me to reformulate this, or do we just go with the current
> description?

Nah, I think it is OK to leave it as-is. The important thing is that it is gone. :)

(Thanks for all your work on this, btw. I was so happy to see the commit dropping all of the PASSING_SANITIZE_LEAK infrastructure).

-Peff
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 22/27] git-compat-util: drop now-unused `UNLEAK()` macro

The `UNLEAK()` macro has been introduced with 0e5bba53af (add UNLEAK annotation for reducing leak false positives, 2017-09-08) to help us reduce the amount of reported memory leaks in cases we don't care about, e.g. when exiting immediately afterwards. We have since removed all of its users in favor of freeing the memory and thus don't need the macro anymore.

Remove it.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 git-compat-util.h | 20 --------------------
 usage.c           | 15 ---------------
 2 files changed, 35 deletions(-)
Show changes to 2 files +0 −35

git-compat-util.h, usage.c

diff --git a/git-compat-util.h b/git-compat-util.h
index e4a306dd5639b58a4ec4d2a6269fb649348fb4e7..a06d4f3809e5664863d4d0f312c88b3e1364ee74 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -1527,26 +1527,6 @@ int cmd_main(int, const char **);
 int common_exit(const char *file, int line, int code);
 #define exit(code) exit(common_exit(__FILE__, __LINE__, (code)))
 
-/*
- * You can mark a stack variable with UNLEAK(var) to avoid it being
- * reported as a leak by tools like LSAN or valgrind. The argument
- * should generally be the variable itself (not its address and not what
- * it points to). It's safe to use this on pointers which may already
- * have been freed, or on pointers which may still be in use.
- *
- * Use this _only_ for a variable that leaks by going out of scope at
- * program exit (so only from cmd_* functions or their direct helpers).
- * Normal functions, especially those which may be called multiple
- * times, should actually free their memory. This is only meant as
- * an annotation, and does nothing in non-leak-checking builds.
- */
-#ifdef SUPPRESS_ANNOTATED_LEAKS
-void unleak_memory(const void *ptr, size_t len);
-#define UNLEAK(var) unleak_memory(&(var), sizeof(var))
-#else
-#define UNLEAK(var) do {} while (0)
-#endif
-
 #define z_const
 #include <zlib.h>
 
diff --git a/usage.c b/usage.c
index 7a2f7805f57737fa3d9e653ff6c9345719dc79b8..29a9725784a42ed11363b4c41c7a105c0b13f64a 100644
--- a/usage.c
+++ b/usage.c
@@ -350,18 +350,3 @@ void bug_fl(const char *file, int line, const char *fmt, ...)
 	trace2_cmd_error_va(fmt, ap);
 	va_end(ap);
 }
-
-#ifdef SUPPRESS_ANNOTATED_LEAKS
-void unleak_memory(const void *ptr, size_t len)
-{
-	static struct suppressed_leak_root {
-		struct suppressed_leak_root *next;
-		char data[FLEX_ARRAY];
-	} *suppressed_leaks;
-	struct suppressed_leak_root *root;
-
-	FLEX_ALLOC_MEM(root, data, ptr, len);
-	root->next = suppressed_leaks;
-	suppressed_leaks = root;
-}
-#endif
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 23/27] t5601: work around leak sanitizer issue

When running t5601 with the leak checker enabled we can see a hang in our CI systems. This hang seems to be system-specific, as I cannot reproduce it on my own machine.

As it turns out, the issue is in those testcases that exercise cloning of `~repo`-style paths. All of the testcases that hang eventually end up interpreting "repo" as the username and will call getpwnam(3p) with that username. That should of course be fine, and getpwnam(3p) should just return an error. But instead, the leak sanitizer seems to be recursing while handling a call to `free()` in the NSS modules:

    #0  0x00007ffff7fd98d5 in _dl_update_slotinfo (req_modid=1, new_gen=2) at ../elf/dl-tls.c:720
    #1  0x00007ffff7fd9ac4 in update_get_addr (ti=0x7ffff7a91d80, gen=<optimized out>) at ../elf/dl-tls.c:916
    #2  0x00007ffff7fdc85c in __tls_get_addr () at ../sysdeps/x86_64/tls_get_addr.S:55
    #3  0x00007ffff7a27e04 in __lsan::GetAllocatorCache () at ../../../../src/libsanitizer/lsan/lsan_linux.cpp:27
    #4  0x00007ffff7a2b33a in __lsan::Deallocate (p=0x0) at ../../../../src/libsanitizer/lsan/lsan_allocator.cpp:127
    #5  __lsan::lsan_free (p=0x0) at ../../../../src/libsanitizer/lsan/lsan_allocator.cpp:220
    ...
    #261505 0x00007ffff7fd99f2 in free (ptr=<optimized out>) at ../include/rtld-malloc.h:50
    #261506 _dl_update_slotinfo (req_modid=1, new_gen=2) at ../elf/dl-tls.c:822
    #261507 0x00007ffff7fd9ac4 in update_get_addr (ti=0x7ffff7a91d80, gen=<optimized out>) at ../elf/dl-tls.c:916
    #261508 0x00007ffff7fdc85c in __tls_get_addr () at ../sysdeps/x86_64/tls_get_addr.S:55
    #261509 0x00007ffff7a27e04 in __lsan::GetAllocatorCache () at ../../../../src/libsanitizer/lsan/lsan_linux.cpp:27
    #261510 0x00007ffff7a2b33a in __lsan::Deallocate (p=0x5020000001e0) at ../../../../src/libsanitizer/lsan/lsan_allocator.cpp:127
    #261511 __lsan::lsan_free (p=0x5020000001e0) at ../../../../src/libsanitizer/lsan/lsan_allocator.cpp:220
    #261512 0x00007ffff793da25 in module_load (module=0x515000000280) at ./nss/nss_module.c:188
    #261513 0x00007ffff793dee5 in __nss_module_load (module=0x515000000280) at ./nss/nss_module.c:302
    #261514 __nss_module_get_function (module=0x515000000280, name=name@entry=0x7ffff79b9128 "getpwnam_r") at ./nss/nss_module.c:328
    #261515 0x00007ffff793e741 in __GI___nss_lookup_function (fct_name=<optimized out>, ni=<optimized out>) at ./nss/nsswitch.c:137
    #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,
        status=status@entry=0, all_values=all_values@entry=0) at ./nss/nsswitch.c:120
    #261517 0x00007ffff794c6a7 in __getpwnam_r (name=name@entry=0x501000000060 "repo", resbuf=resbuf@entry=0x7ffff79fb320 <resbuf>, buffer=<optimized out>,
        buflen=buflen@entry=1024, result=result@entry=0x7fffffffa4b0) at ../nss/getXXbyYY_r.c:343
    #261518 0x00007ffff794c4d8 in getpwnam (name=0x501000000060 "repo") at ../nss/getXXbyYY.c:140
    #261519 0x00005555557e37ff in getpw_str (username=0x5020000001a1 "repo", len=4) at path.c:613
    #261520 0x00005555557e3937 in interpolate_path (path=0x5020000001a0 "~repo", real_home=0) at path.c:654
    #261521 0x00005555557e3aea in enter_repo (path=0x501000000040 "~repo", strict=0) at path.c:718
    #261522 0x000055555568f0ba in cmd_upload_pack (argc=1, argv=0x502000000100, prefix=0x0, repo=0x0) at builtin/upload-pack.c:57
    #261523 0x0000555555575ba8 in run_builtin (p=0x555555a20c98 <commands+3192>, argc=2, argv=0x502000000100, repo=0x555555a53b20 <the_repo>) at git.c:481
    #261524 0x0000555555576067 in handle_builtin (args=0x7fffffffaab0) at git.c:742
    #261525 0x000055555557678d in cmd_main (argc=2, argv=0x7fffffffac58) at git.c:912
    #261526 0x00005555556963cd in main (argc=2, argv=0x7fffffffac58) at common-main.c:64

Note that this stack is more than 260000 function calls deep. Run under the debugger this will eventually segfault, but in our CI systems it seems like this just hangs forever.

I assume that this is a bug either in the leak sanitizer or in glibc, as I cannot reproduce it on my machine. In any case, let's work around the bug for now by marking those tests with the "!SANITIZE_LEAK" prereq.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 t/t5601-clone.sh | 26 +++++++++++++++-----------
 1 file changed, 15 insertions(+), 11 deletions(-)
Show changes to t/t5601-clone.sh +15 −11
diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh
index 9fe665eadfb685f2cc9937a1dd5ec005a0d50fb7..d0c18660e33113e64a293c695239a1c1a7975add 100755
--- a/t/t5601-clone.sh
+++ b/t/t5601-clone.sh
@@ -544,12 +544,16 @@ do
 		test_clone_url [::1]:$repo ::1 "$repo"
 	'
 done
-#home directory
-test_expect_success "clone host:/~repo" '
+
+# Home directory. All tests that use "~repo" are broken in our CI job when the
+# leak sanitizer is enabled. It seems like either a bug in the sanitizer or in
+# glibc, but when executing getpwnam(3p) with an invalid username we eventually
+# start recursing in a call to free(3p), until bust the stack and segfault.
+test_expect_success !SANITIZE_LEAK "clone host:/~repo" '
 	test_clone_url host:/~repo host "~repo"
 '
 
-test_expect_$expectation_for_ipv6_tests "clone [::1]:/~repo" '
+test_expect_$expectation_for_ipv6_tests !SANITIZE_LEAK "clone [::1]:/~repo" '
 	test_clone_url [::1]:/~repo ::1 "~repo"
 '
 
@@ -569,9 +573,9 @@ do
 		test_clone_url "ssh://host.xz$tcol/home/user/repo" host.xz /home/user/repo
 	'
 	# from home directory
-	test_expect_success "clone ssh://host.xz$tcol/~repo" '
-	test_clone_url "ssh://host.xz$tcol/~repo" host.xz "~repo"
-'
+	test_expect_success !SANITIZE_LEAK "clone ssh://host.xz$tcol/~repo" '
+		test_clone_url "ssh://host.xz$tcol/~repo" host.xz "~repo"
+	'
 done
 
 # with port number
@@ -580,7 +584,7 @@ test_expect_success 'clone ssh://host.xz:22/home/user/repo' '
 '
 
 # from home directory with port number
-test_expect_success 'clone ssh://host.xz:22/~repo' '
+test_expect_success !SANITIZE_LEAK 'clone ssh://host.xz:22/~repo' '
 	test_clone_url "ssh://host.xz:22/~repo" "-p 22 host.xz" "~repo"
 '
 
@@ -597,8 +601,8 @@ done
 for tuah in ::1 [::1] user@::1 user@[::1] [user@::1]
 do
 	euah=$(echo $tuah | tr -d "[]")
-	test_expect_success "clone ssh://$tuah/~repo" "
-	  test_clone_url ssh://$tuah/~repo $euah '~repo'
+	test_expect_success !SANITIZE_LEAK "clone ssh://$tuah/~repo" "
+		test_clone_url ssh://$tuah/~repo $euah '~repo'
 	"
 done
 
@@ -615,8 +619,8 @@ done
 for tuah in [::1] user@[::1] [user@::1]
 do
 	euah=$(echo $tuah | tr -d "[]")
-	test_expect_success "clone ssh://$tuah:22/~repo" "
-	  test_clone_url ssh://$tuah:22/~repo '-p 22' $euah '~repo'
+	test_expect_success !SANITIZE_LEAK "clone ssh://$tuah:22/~repo" "
+		  test_clone_url ssh://$tuah:22/~repo '-p 22' $euah '~repo'
 	"
 done
 
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 24/27] t: mark some tests as leak free

Both t5558 and t5601 are leak-free starting with 6dab49b9fb (bundle-uri: plug leak in unbundle_from_file(), 2024-10-10). Mark them accordingly.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 t/t5558-clone-bundle-uri.sh | 1 +
 t/t5601-clone.sh            | 1 +
 2 files changed, 2 insertions(+)
Show changes to 2 files +2 −0

t/t5558-clone-bundle-uri.sh, t/t5601-clone.sh

diff --git a/t/t5558-clone-bundle-uri.sh b/t/t5558-clone-bundle-uri.sh
index 3816ed5058d90118b4cbc700d65e97aa9c9987c0..b488b505b928ab6e58258360364ba53bec704eca 100755
--- a/t/t5558-clone-bundle-uri.sh
+++ b/t/t5558-clone-bundle-uri.sh
@@ -2,6 +2,7 @@
 
 test_description='test fetching bundles with --bundle-uri'
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-bundle.sh
 
diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh
index d0c18660e33113e64a293c695239a1c1a7975add..3b5285cfcf326fa02015d7a808b4312c62283487 100755
--- a/t/t5601-clone.sh
+++ b/t/t5601-clone.sh
@@ -5,6 +5,7 @@ test_description=clone
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 X=
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 25/27] t: remove unneeded !SANITIZE_LEAK prerequisites

We have a couple of !SANITIZE_LEAK prerequisites for tests that used to fail due to memory leaks. These have all been fixed by now, so let's drop the prerequisite.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 t/t0095-bloom.sh          |  2 +-
 t/t2407-worktree-heads.sh | 16 ++++++++--------
 t/t4020-diff-external.sh  |  4 ++--
 3 files changed, 11 insertions(+), 11 deletions(-)
Show changes to 3 files +11 −11

t/t0095-bloom.sh, t/t2407-worktree-heads.sh, t/t4020-diff-external.sh

diff --git a/t/t0095-bloom.sh b/t/t0095-bloom.sh
index c8d84ab6061a9de5fe26cd333fe8a7e504a5f963..08df74cacfc6910c51568705855dffa90b79d5be 100755
--- a/t/t0095-bloom.sh
+++ b/t/t0095-bloom.sh
@@ -77,7 +77,7 @@ test_expect_success 'compute bloom key for test string 2' '
 	test_cmp expect actual
 '
 
-test_expect_success !SANITIZE_LEAK 'get bloom filters for commit with no changes' '
+test_expect_success 'get bloom filters for commit with no changes' '
 	git init &&
 	git commit --allow-empty -m "c0" &&
 	cat >expect <<-\EOF &&
diff --git a/t/t2407-worktree-heads.sh b/t/t2407-worktree-heads.sh
index f6835c91dcc49cfeb23881fe0ef7a96629bfb2e6..7750dc9265a90bdd8b0e3781accb13f00a23bb09 100755
--- a/t/t2407-worktree-heads.sh
+++ b/t/t2407-worktree-heads.sh
@@ -49,7 +49,7 @@ test_expect_success 'refuse to overwrite: checked out in worktree' '
 	done
 '
 
-test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in bisect' '
+test_expect_success 'refuse to overwrite: worktree in bisect' '
 	test_when_finished git -C wt-4 bisect reset &&
 
 	# Set up a bisect so HEAD no longer points to wt-4.
@@ -61,7 +61,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in bisect' '
 	grep "cannot force update the branch '\''wt-4'\'' used by worktree at.*wt-4" err
 '
 
-test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase (apply)' '
+test_expect_success 'refuse to overwrite: worktree in rebase (apply)' '
 	test_when_finished git -C wt-2 rebase --abort &&
 
 	# This will fail part-way through due to a conflict.
@@ -71,7 +71,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase (app
 	grep "cannot force update the branch '\''wt-2'\'' used by worktree at.*wt-2" err
 '
 
-test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase (merge)' '
+test_expect_success 'refuse to overwrite: worktree in rebase (merge)' '
 	test_when_finished git -C wt-2 rebase --abort &&
 
 	# This will fail part-way through due to a conflict.
@@ -81,7 +81,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase (mer
 	grep "cannot force update the branch '\''wt-2'\'' used by worktree at.*wt-2" err
 '
 
-test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase with --update-refs' '
+test_expect_success 'refuse to overwrite: worktree in rebase with --update-refs' '
 	test_when_finished git -C wt-3 rebase --abort &&
 
 	git branch -f can-be-updated wt-3 &&
@@ -95,7 +95,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase with
 	done
 '
 
-test_expect_success !SANITIZE_LEAK 'refuse to fetch over ref: checked out' '
+test_expect_success 'refuse to fetch over ref: checked out' '
 	test_must_fail git fetch server +refs/heads/wt-3:refs/heads/wt-3 2>err &&
 	grep "refusing to fetch into branch '\''refs/heads/wt-3'\''" err &&
 
@@ -105,7 +105,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to fetch over ref: checked out' '
 	grep "refusing to fetch into branch" err
 '
 
-test_expect_success !SANITIZE_LEAK 'refuse to fetch over ref: worktree in bisect' '
+test_expect_success 'refuse to fetch over ref: worktree in bisect' '
 	test_when_finished git -C wt-4 bisect reset &&
 
 	# Set up a bisect so HEAD no longer points to wt-4.
@@ -117,7 +117,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to fetch over ref: worktree in bisect
 	grep "refusing to fetch into branch" err
 '
 
-test_expect_success !SANITIZE_LEAK 'refuse to fetch over ref: worktree in rebase' '
+test_expect_success 'refuse to fetch over ref: worktree in rebase' '
 	test_when_finished git -C wt-3 rebase --abort &&
 
 	# This will fail part-way through due to a conflict.
@@ -157,7 +157,7 @@ test_expect_success 'refuse to overwrite when in error states' '
 
 . "$TEST_DIRECTORY"/lib-rebase.sh
 
-test_expect_success !SANITIZE_LEAK 'refuse to overwrite during rebase with --update-refs' '
+test_expect_success 'refuse to overwrite during rebase with --update-refs' '
 	git commit --fixup HEAD~2 --allow-empty &&
 	(
 		set_cat_todo_editor &&
diff --git a/t/t4020-diff-external.sh b/t/t4020-diff-external.sh
index 3baa52a9bf653da9e45df720435cb23d0713e1db..0e5a05894fd1a1be1098b6895283452ca877137c 100755
--- a/t/t4020-diff-external.sh
+++ b/t/t4020-diff-external.sh
@@ -102,7 +102,7 @@ test_expect_success 'diff attribute' '
 	test_cmp expect actual
 '
 
-test_expect_success !SANITIZE_LEAK 'diff attribute should apply only to diff' '
+test_expect_success 'diff attribute should apply only to diff' '
 	git log -p -1 HEAD >out &&
 	grep "^diff --git a/file b/file" out
 
@@ -129,7 +129,7 @@ test_expect_success 'diff attribute' '
 	test_cmp expect actual
 '
 
-test_expect_success !SANITIZE_LEAK 'diff attribute should apply only to diff' '
+test_expect_success 'diff attribute should apply only to diff' '
 	git log -p -1 HEAD >out &&
 	grep "^diff --git a/file b/file" out
 
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 26/27] test-lib: unconditionally enable leak checking

Over the last two releases we have plugged a couple hundred of memory leaks exposed by the Git test suite. With the preceding commits we have finally fixed the last leak exposed by our test suite, which means that we are now basically leak free wherever we have branch coverage.

From hereon, the Git test suite should ideally stay free of memory leaks. Most importantly, any test suite that is being added should automatically be subject to the leak checker, and if that test does not pass it is a strong signal that the added code introduced new memory leaks and should not be accepted without further changes.

Drop the infrastructure around TEST_PASSES_SANITIZE_LEAK to reflect this new requirement. Like this, all test suites will be subject to the leak checker by default.

This is being intentionally strict, but we still have an escape hatch: the SANITIZE_LEAK prerequisite. There is one known case in t5601 where the leak sanitizer itself is buggy, so adding this prereq in such cases is acceptable. Another acceptable situation is when a newly added test uncovers preexisting memory leaks: when fixing that memory leak would be sufficiently complicated it is fine to annotate and document the leak accordingly. But in any case, the burden is now on the patch author to explain why exactly they have to add the SANITIZE_LEAK prerequisite.

The TEST_PASSES_SANITIZE_LEAK annotations will be dropped in the next patch.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 ci/lib.sh        |  1 -
 t/README         | 21 -----------------
 t/lib-git-svn.sh |  4 ----
 t/test-lib.sh    | 72 +-------------------------------------------------------
 4 files changed, 1 insertion(+), 97 deletions(-)
Show changes to 4 files +1 −97

ci/lib.sh, t/README, t/lib-git-svn.sh, t/test-lib.sh

diff --git a/ci/lib.sh b/ci/lib.sh
index 246072a0932621a64562d94f5a50a1ba880bd48b..930f98d7228166c37c236beb062b14675fb68ef3 100755
--- a/ci/lib.sh
+++ b/ci/lib.sh
@@ -384,7 +384,6 @@ linux-musl)
 	;;
 linux-leaks|linux-reftable-leaks)
 	export SANITIZE=leak
-	export GIT_TEST_PASSING_SANITIZE_LEAK=true
 	;;
 linux-asan-ubsan)
 	export SANITIZE=address,undefined
diff --git a/t/README b/t/README
index 8c0319b58e5c8333a13f4d07a47519fa8f137709..e84824dc002932102d0021e96c80f70354d4994c 100644
--- a/t/README
+++ b/t/README
@@ -368,27 +368,6 @@ excluded as so much relies on it, but this might change in the future.
 GIT_TEST_SPLIT_INDEX=<boolean> forces split-index mode on the whole
 test suite. Accept any boolean values that are accepted by git-config.
 
-GIT_TEST_PASSING_SANITIZE_LEAK=true skips those tests that haven't
-declared themselves as leak-free by setting
-"TEST_PASSES_SANITIZE_LEAK=true" before sourcing "test-lib.sh". This
-test mode is used by the "linux-leaks" CI target.
-
-GIT_TEST_PASSING_SANITIZE_LEAK=check checks that our
-"TEST_PASSES_SANITIZE_LEAK=true" markings are current. Rather than
-skipping those tests that haven't set "TEST_PASSES_SANITIZE_LEAK=true"
-before sourcing "test-lib.sh" this mode runs them with
-"--invert-exit-code". This is used to check that there's a one-to-one
-mapping between "TEST_PASSES_SANITIZE_LEAK=true" and those tests that
-pass under "SANITIZE=leak". This is especially useful when testing a
-series that fixes various memory leaks with "git rebase -x".
-
-GIT_TEST_PASSING_SANITIZE_LEAK=check when combined with "--immediate"
-will run to completion faster, and result in the same failing
-tests.
-
-GIT_TEST_PASSING_SANITIZE_LEAK=check-failing behaves the same as "check",
-but skips all tests which are already marked as leak-free.
-
 GIT_TEST_PROTOCOL_VERSION=<n>, when set, makes 'protocol.version'
 default to n.
 
diff --git a/t/lib-git-svn.sh b/t/lib-git-svn.sh
index ea28971e8ee6abfcd3c0394c6d8b143c75ac12dd..2fde2353fd38356548fd40e4808984618b0d9585 100644
--- a/t/lib-git-svn.sh
+++ b/t/lib-git-svn.sh
@@ -1,7 +1,3 @@
-if test -z "$TEST_FAILS_SANITIZE_LEAK"
-then
-	TEST_PASSES_SANITIZE_LEAK=true
-fi
 . ./test-lib.sh
 
 if test -n "$NO_SVN_TESTS"
diff --git a/t/test-lib.sh b/t/test-lib.sh
index a278181a0568a2422ab1e7f007bc016b95a58e63..508b5fe1f550db690ba769c9c57f5ca8ce3d3102 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -1227,23 +1227,7 @@ check_test_results_san_file_ () {
 	fi &&
 	say_color error "$(cat "$TEST_RESULTS_SAN_FILE".*)" &&
 
-	if test -n "$passes_sanitize_leak" && test "$test_failure" = 0
-	then
-		say "As TEST_PASSES_SANITIZE_LEAK=true and our logs show we're leaking, exit non-zero!" &&
-		invert_exit_code=t
-	elif test -n "$passes_sanitize_leak"
-	then
-		say "As TEST_PASSES_SANITIZE_LEAK=true and our logs show we're leaking, and we're failing for other reasons too..." &&
-		invert_exit_code=
-	elif test -n "$sanitize_leak_check" && test "$test_failure" = 0
-	then
-		say "As TEST_PASSES_SANITIZE_LEAK=true isn't set the above leak is 'ok' with GIT_TEST_PASSING_SANITIZE_LEAK=check" &&
-		invert_exit_code=
-	elif test -n "$sanitize_leak_check"
-	then
-		say "As TEST_PASSES_SANITIZE_LEAK=true isn't set the above leak is 'ok' with GIT_TEST_PASSING_SANITIZE_LEAK=check" &&
-		invert_exit_code=t
-	elif test "$test_failure" = 0
+	if test "$test_failure" = 0
 	then
 		say "Our logs revealed a memory leak, exit non-zero!" &&
 		invert_exit_code=t
@@ -1274,11 +1258,6 @@ test_done () {
 		EOF
 	fi
 
-	if test -z "$passes_sanitize_leak" && test_bool_env TEST_PASSES_SANITIZE_LEAK false
-	then
-		BAIL_OUT "Please, set TEST_PASSES_SANITIZE_LEAK before sourcing test-lib.sh"
-	fi
-
 	if test "$test_fixed" != 0
 	then
 		say_color error "# $test_fixed known breakage(s) vanished; please update test(s)"
@@ -1515,51 +1494,8 @@ then
 	test_done
 fi
 
-BAIL_OUT_ENV_NEEDS_SANITIZE_LEAK () {
-	BAIL_OUT "$1 has no effect except when compiled with SANITIZE=leak"
-}
-
 if test -n "$SANITIZE_LEAK"
 then
-	# Normalize with test_bool_env
-	passes_sanitize_leak=
-
-	# We need to see TEST_PASSES_SANITIZE_LEAK in "test-tool
-	# env-helper" (via test_bool_env)
-	export TEST_PASSES_SANITIZE_LEAK
-	if test_bool_env TEST_PASSES_SANITIZE_LEAK false
-	then
-		passes_sanitize_leak=t
-	fi
-
-	if test "$GIT_TEST_PASSING_SANITIZE_LEAK" = "check" ||
-	   test "$GIT_TEST_PASSING_SANITIZE_LEAK" = "check-failing"
-	then
-		if test "$GIT_TEST_PASSING_SANITIZE_LEAK" = "check-failing" &&
-		   test -n "$passes_sanitize_leak"
-		then
-			skip_all="skipping leak-free $this_test under GIT_TEST_PASSING_SANITIZE_LEAK=check-failing"
-			test_done
-		fi
-
-		sanitize_leak_check=t
-		if test -n "$invert_exit_code"
-		then
-			BAIL_OUT "cannot use --invert-exit-code under GIT_TEST_PASSING_SANITIZE_LEAK=check"
-		fi
-
-		if test -z "$passes_sanitize_leak"
-		then
-			say "in GIT_TEST_PASSING_SANITIZE_LEAK=check mode, setting --invert-exit-code for TEST_PASSES_SANITIZE_LEAK != true"
-			invert_exit_code=t
-		fi
-	elif test -z "$passes_sanitize_leak" &&
-	     test_bool_env GIT_TEST_PASSING_SANITIZE_LEAK false
-	then
-		skip_all="skipping $this_test under GIT_TEST_PASSING_SANITIZE_LEAK=true"
-		test_done
-	fi
-
 	rm -rf "$TEST_RESULTS_SAN_DIR"
 	if ! mkdir -p "$TEST_RESULTS_SAN_DIR"
 	then
@@ -1574,12 +1510,6 @@ then
 	prepend_var LSAN_OPTIONS : log_exe_name=1
 	prepend_var LSAN_OPTIONS : log_path="'$TEST_RESULTS_SAN_FILE'"
 	export LSAN_OPTIONS
-
-elif test "$GIT_TEST_PASSING_SANITIZE_LEAK" = "check" ||
-     test "$GIT_TEST_PASSING_SANITIZE_LEAK" = "check-failing" ||
-     test_bool_env GIT_TEST_PASSING_SANITIZE_LEAK false
-then
-	BAIL_OUT_ENV_NEEDS_SANITIZE_LEAK "GIT_TEST_PASSING_SANITIZE_LEAK=true"
 fi
 
 if test "${GIT_TEST_CHAIN_LINT:-1}" != 0 &&
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 11, 2024, 10:38 UTC · re: Patrick Steinhardt · lore

[PATCH v2 27/27] t: remove TEST_PASSES_SANITIZE_LEAK annotations

Now that the default value for TEST_PASSES_SANITIZE_LEAK is `true` there is no longer a need to have that variable declared in all of our tests. Drop it.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 t/t0001-init.sh                                    | 1 -
 t/t0002-gitfile.sh                                 | 1 -
 t/t0003-attributes.sh                              | 1 -
 t/t0004-unwritable.sh                              | 1 -
 t/t0005-signals.sh                                 | 1 -
 t/t0006-date.sh                                    | 1 -
 t/t0007-git-var.sh                                 | 1 -
 t/t0008-ignores.sh                                 | 1 -
 t/t0010-racy-git.sh                                | 1 -
 t/t0012-help.sh                                    | 1 -
 t/t0013-sha1dc.sh                                  | 1 -
 t/t0014-alias.sh                                   | 1 -
 t/t0017-env-helper.sh                              | 1 -
 t/t0018-advice.sh                                  | 1 -
 t/t0019-json-writer.sh                             | 1 -
 t/t0020-crlf.sh                                    | 1 -
 t/t0021-conversion.sh                              | 1 -
 t/t0022-crlf-rename.sh                             | 1 -
 t/t0023-crlf-am.sh                                 | 1 -
 t/t0024-crlf-archive.sh                            | 1 -
 t/t0025-crlf-renormalize.sh                        | 1 -
 t/t0026-eol-config.sh                              | 1 -
 t/t0027-auto-crlf.sh                               | 1 -
 t/t0028-working-tree-encoding.sh                   | 1 -
 t/t0029-core-unsetenvvars.sh                       | 1 -
 t/t0030-stripspace.sh                              | 1 -
 t/t0033-safe-directory.sh                          | 1 -
 t/t0035-safe-bare-repository.sh                    | 1 -
 t/t0040-parse-options.sh                           | 1 -
 t/t0041-usage.sh                                   | 1 -
 t/t0050-filesystem.sh                              | 1 -
 t/t0052-simple-ipc.sh                              | 1 -
 t/t0055-beyond-symlinks.sh                         | 1 -
 t/t0056-git-C.sh                                   | 1 -
 t/t0060-path-utils.sh                              | 1 -
 t/t0061-run-command.sh                             | 1 -
 t/t0062-revision-walking.sh                        | 1 -
 t/t0063-string-list.sh                             | 1 -
 t/t0066-dir-iterator.sh                            | 1 -
 t/t0067-parse_pathspec_file.sh                     | 1 -
 t/t0068-for-each-repo.sh                           | 1 -
 t/t0070-fundamental.sh                             | 1 -
 t/t0071-sort.sh                                    | 1 -
 t/t0080-unit-test-output.sh                        | 1 -
 t/t0081-find-pack.sh                               | 1 -
 t/t0090-cache-tree.sh                              | 1 -
 t/t0091-bugreport.sh                               | 1 -
 t/t0092-diagnose.sh                                | 1 -
 t/t0095-bloom.sh                                   | 1 -
 t/t0100-previous.sh                                | 1 -
 t/t0101-at-syntax.sh                               | 1 -
 t/t0200-gettext-basic.sh                           | 1 -
 t/t0201-gettext-fallbacks.sh                       | 1 -
 t/t0202-gettext-perl.sh                            | 1 -
 t/t0203-gettext-setlocale-sanity.sh                | 1 -
 t/t0204-gettext-reencode-sanity.sh                 | 1 -
 t/t0210-trace2-normal.sh                           | 1 -
 t/t0211-trace2-perf.sh                             | 1 -
 t/t0212-trace2-event.sh                            | 1 -
 t/t0300-credentials.sh                             | 1 -
 t/t0301-credential-cache.sh                        | 1 -
 t/t0302-credential-store.sh                        | 1 -
 t/t0303-credential-external.sh                     | 1 -
 t/t0410-partial-clone.sh                           | 1 -
 t/t0411-clone-from-partial.sh                      | 1 -
 t/t0450-txt-doc-vs-help.sh                         | 1 -
 t/t0500-progress-display.sh                        | 1 -
 t/t0600-reffiles-backend.sh                        | 1 -
 t/t0601-reffiles-pack-refs.sh                      | 1 -
 t/t0602-reffiles-fsck.sh                           | 1 -
 t/t0610-reftable-basics.sh                         | 1 -
 t/t0611-reftable-httpd.sh                          | 1 -
 t/t0612-reftable-jgit-compatibility.sh             | 1 -
 t/t0613-reftable-write-options.sh                  | 1 -
 t/t1000-read-tree-m-3way.sh                        | 1 -
 t/t1001-read-tree-m-2way.sh                        | 1 -
 t/t1002-read-tree-m-u-2way.sh                      | 1 -
 t/t1003-read-tree-prefix.sh                        | 1 -
 t/t1004-read-tree-m-u-wf.sh                        | 1 -
 t/t1005-read-tree-reset.sh                         | 1 -
 t/t1006-cat-file.sh                                | 1 -
 t/t1007-hash-object.sh                             | 1 -
 t/t1008-read-tree-overlay.sh                       | 1 -
 t/t1009-read-tree-new-index.sh                     | 1 -
 t/t1010-mktree.sh                                  | 1 -
 t/t1011-read-tree-sparse-checkout.sh               | 1 -
 t/t1012-read-tree-df.sh                            | 1 -
 t/t1013-read-tree-submodule.sh                     | 1 -
 t/t1014-read-tree-confusing.sh                     | 1 -
 t/t1015-read-index-unmerged.sh                     | 1 -
 t/t1016-compatObjectFormat.sh                      | 1 -
 t/t1020-subdirectory.sh                            | 1 -
 t/t1021-rerere-in-workdir.sh                       | 1 -
 t/t1022-read-tree-partial-clone.sh                 | 1 -
 t/t1050-large.sh                                   | 1 -
 t/t1051-large-conversion.sh                        | 1 -
 t/t1060-object-corruption.sh                       | 1 -
 t/t1090-sparse-checkout-scope.sh                   | 1 -
 t/t1091-sparse-checkout-builtin.sh                 | 1 -
 t/t1092-sparse-checkout-compatibility.sh           | 1 -
 t/t1100-commit-tree-options.sh                     | 1 -
 t/t1300-config.sh                                  | 1 -
 t/t1301-shared-repo.sh                             | 1 -
 t/t1302-repo-version.sh                            | 1 -
 t/t1303-wacky-config.sh                            | 1 -
 t/t1304-default-acl.sh                             | 1 -
 t/t1305-config-include.sh                          | 1 -
 t/t1306-xdg-files.sh                               | 1 -
 t/t1307-config-blob.sh                             | 1 -
 t/t1308-config-set.sh                              | 1 -
 t/t1309-early-config.sh                            | 1 -
 t/t1310-config-default.sh                          | 1 -
 t/t1350-config-hooks-path.sh                       | 1 -
 t/t1400-update-ref.sh                              | 1 -
 t/t1401-symbolic-ref.sh                            | 1 -
 t/t1402-check-ref-format.sh                        | 1 -
 t/t1403-show-ref.sh                                | 1 -
 t/t1404-update-ref-errors.sh                       | 1 -
 t/t1405-main-ref-store.sh                          | 1 -
 t/t1406-submodule-ref-store.sh                     | 1 -
 t/t1407-worktree-ref-store.sh                      | 1 -
 t/t1408-packed-refs.sh                             | 1 -
 t/t1409-avoid-packing-refs.sh                      | 1 -
 t/t1410-reflog.sh                                  | 1 -
 t/t1411-reflog-show.sh                             | 1 -
 t/t1412-reflog-loop.sh                             | 1 -
 t/t1413-reflog-detach.sh                           | 1 -
 t/t1414-reflog-walk.sh                             | 1 -
 t/t1415-worktree-refs.sh                           | 1 -
 t/t1416-ref-transaction-hooks.sh                   | 1 -
 t/t1417-reflog-updateref.sh                        | 1 -
 t/t1418-reflog-exists.sh                           | 1 -
 t/t1419-exclude-refs.sh                            | 1 -
 t/t1420-lost-found.sh                              | 1 -
 t/t1430-bad-ref-name.sh                            | 1 -
 t/t1450-fsck.sh                                    | 1 -
 t/t1451-fsck-buffer.sh                             | 1 -
 t/t1460-refs-migrate.sh                            | 1 -
 t/t1500-rev-parse.sh                               | 1 -
 t/t1501-work-tree.sh                               | 1 -
 t/t1502-rev-parse-parseopt.sh                      | 1 -
 t/t1503-rev-parse-verify.sh                        | 1 -
 t/t1504-ceiling-dirs.sh                            | 1 -
 t/t1505-rev-parse-last.sh                          | 1 -
 t/t1506-rev-parse-diagnosis.sh                     | 1 -
 t/t1507-rev-parse-upstream.sh                      | 1 -
 t/t1508-at-combinations.sh                         | 1 -
 t/t1510-repo-setup.sh                              | 1 -
 t/t1511-rev-parse-caret.sh                         | 1 -
 t/t1512-rev-parse-disambiguation.sh                | 1 -
 t/t1513-rev-parse-prefix.sh                        | 1 -
 t/t1514-rev-parse-push.sh                          | 1 -
 t/t1515-rev-parse-outside-repo.sh                  | 1 -
 t/t1517-outside-repo.sh                            | 1 -
 t/t1600-index.sh                                   | 1 -
 t/t1601-index-bogus.sh                             | 1 -
 t/t1700-split-index.sh                             | 1 -
 t/t1701-racy-split-index.sh                        | 1 -
 t/t1800-hook.sh                                    | 1 -
 t/t2000-conflict-when-checking-files-out.sh        | 1 -
 t/t2002-checkout-cache-u.sh                        | 1 -
 t/t2003-checkout-cache-mkdir.sh                    | 1 -
 t/t2004-checkout-cache-temp.sh                     | 1 -
 t/t2005-checkout-index-symlinks.sh                 | 1 -
 t/t2006-checkout-index-basic.sh                    | 1 -
 t/t2007-checkout-symlink.sh                        | 1 -
 t/t2008-checkout-subdir.sh                         | 1 -
 t/t2009-checkout-statinfo.sh                       | 1 -
 t/t2010-checkout-ambiguous.sh                      | 1 -
 t/t2011-checkout-invalid-head.sh                   | 1 -
 t/t2012-checkout-last.sh                           | 1 -
 t/t2013-checkout-submodule.sh                      | 1 -
 t/t2014-checkout-switch.sh                         | 1 -
 t/t2015-checkout-unborn.sh                         | 1 -
 t/t2016-checkout-patch.sh                          | 1 -
 t/t2017-checkout-orphan.sh                         | 1 -
 t/t2018-checkout-branch.sh                         | 1 -
 t/t2019-checkout-ambiguous-ref.sh                  | 1 -
 t/t2020-checkout-detach.sh                         | 1 -
 t/t2021-checkout-overwrite.sh                      | 1 -
 t/t2022-checkout-paths.sh                          | 1 -
 t/t2023-checkout-m.sh                              | 1 -
 t/t2024-checkout-dwim.sh                           | 1 -
 t/t2025-checkout-no-overlay.sh                     | 1 -
 t/t2026-checkout-pathspec-file.sh                  | 1 -
 t/t2027-checkout-track.sh                          | 1 -
 t/t2030-unresolve-info.sh                          | 1 -
 t/t2050-git-dir-relative.sh                        | 1 -
 t/t2060-switch.sh                                  | 1 -
 t/t2070-restore.sh                                 | 1 -
 t/t2071-restore-patch.sh                           | 1 -
 t/t2072-restore-pathspec-file.sh                   | 1 -
 t/t2080-parallel-checkout-basics.sh                | 1 -
 t/t2081-parallel-checkout-collisions.sh            | 1 -
 t/t2082-parallel-checkout-attributes.sh            | 1 -
 t/t2100-update-cache-badpath.sh                    | 1 -
 t/t2101-update-index-reupdate.sh                   | 1 -
 t/t2102-update-index-symlinks.sh                   | 1 -
 t/t2103-update-index-ignore-missing.sh             | 1 -
 t/t2104-update-index-skip-worktree.sh              | 1 -
 t/t2105-update-index-gitfile.sh                    | 1 -
 t/t2106-update-index-assume-unchanged.sh           | 1 -
 t/t2107-update-index-basic.sh                      | 1 -
 t/t2108-update-index-refresh-racy.sh               | 1 -
 t/t2200-add-update.sh                              | 1 -
 t/t2201-add-update-typechange.sh                   | 1 -
 t/t2202-add-addremove.sh                           | 1 -
 t/t2203-add-intent.sh                              | 1 -
 t/t2204-add-ignored.sh                             | 1 -
 t/t2205-add-worktree-config.sh                     | 1 -
 t/t2300-cd-to-toplevel.sh                          | 1 -
 t/t2400-worktree-add.sh                            | 1 -
 t/t2401-worktree-prune.sh                          | 1 -
 t/t2402-worktree-list.sh                           | 1 -
 t/t2403-worktree-move.sh                           | 1 -
 t/t2404-worktree-config.sh                         | 1 -
 t/t2405-worktree-submodule.sh                      | 1 -
 t/t2406-worktree-repair.sh                         | 1 -
 t/t2407-worktree-heads.sh                          | 1 -
 t/t2408-worktree-relative.sh                       | 1 -
 t/t2500-untracked-overwriting.sh                   | 1 -
 t/t2501-cwd-empty.sh                               | 1 -
 t/t3000-ls-files-others.sh                         | 1 -
 t/t3001-ls-files-others-exclude.sh                 | 1 -
 t/t3002-ls-files-dashpath.sh                       | 1 -
 t/t3003-ls-files-exclude.sh                        | 1 -
 t/t3004-ls-files-basic.sh                          | 1 -
 t/t3005-ls-files-relative.sh                       | 1 -
 t/t3006-ls-files-long.sh                           | 1 -
 t/t3007-ls-files-recurse-submodules.sh             | 1 -
 t/t3008-ls-files-lazy-init-name-hash.sh            | 1 -
 t/t3009-ls-files-others-nonsubmodule.sh            | 1 -
 t/t3010-ls-files-killed-modified.sh                | 1 -
 t/t3011-common-prefixes-and-directory-traversal.sh | 1 -
 t/t3012-ls-files-dedup.sh                          | 1 -
 t/t3013-ls-files-format.sh                         | 1 -
 t/t3020-ls-files-error-unmatch.sh                  | 1 -
 t/t3040-subprojects-basic.sh                       | 1 -
 t/t3050-subprojects-fetch.sh                       | 1 -
 t/t3060-ls-files-with-tree.sh                      | 1 -
 t/t3070-wildmatch.sh                               | 1 -
 t/t3100-ls-tree-restrict.sh                        | 1 -
 t/t3101-ls-tree-dirname.sh                         | 1 -
 t/t3102-ls-tree-wildcards.sh                       | 1 -
 t/t3103-ls-tree-misc.sh                            | 1 -
 t/t3104-ls-tree-format.sh                          | 1 -
 t/t3105-ls-tree-output.sh                          | 1 -
 t/t3200-branch.sh                                  | 1 -
 t/t3201-branch-contains.sh                         | 1 -
 t/t3202-show-branch.sh                             | 1 -
 t/t3203-branch-output.sh                           | 1 -
 t/t3204-branch-name-interpretation.sh              | 1 -
 t/t3205-branch-color.sh                            | 1 -
 t/t3206-range-diff.sh                              | 1 -
 t/t3207-branch-submodule.sh                        | 1 -
 t/t3211-peel-ref.sh                                | 1 -
 t/t3300-funny-names.sh                             | 1 -
 t/t3301-notes.sh                                   | 1 -
 t/t3302-notes-index-expensive.sh                   | 1 -
 t/t3303-notes-subtrees.sh                          | 1 -
 t/t3304-notes-mixed.sh                             | 1 -
 t/t3305-notes-fanout.sh                            | 1 -
 t/t3306-notes-prune.sh                             | 1 -
 t/t3307-notes-man.sh                               | 1 -
 t/t3308-notes-merge.sh                             | 1 -
 t/t3309-notes-merge-auto-resolve.sh                | 1 -
 t/t3310-notes-merge-manual-resolve.sh              | 1 -
 t/t3311-notes-merge-fanout.sh                      | 1 -
 t/t3320-notes-merge-worktrees.sh                   | 1 -
 t/t3321-notes-stripspace.sh                        | 1 -
 t/t3400-rebase.sh                                  | 1 -
 t/t3401-rebase-and-am-rename.sh                    | 1 -
 t/t3402-rebase-merge.sh                            | 1 -
 t/t3403-rebase-skip.sh                             | 1 -
 t/t3404-rebase-interactive.sh                      | 1 -
 t/t3405-rebase-malformed.sh                        | 1 -
 t/t3406-rebase-message.sh                          | 1 -
 t/t3407-rebase-abort.sh                            | 1 -
 t/t3408-rebase-multi-line.sh                       | 1 -
 t/t3409-rebase-environ.sh                          | 1 -
 t/t3412-rebase-root.sh                             | 1 -
 t/t3413-rebase-hook.sh                             | 1 -
 t/t3415-rebase-autosquash.sh                       | 1 -
 t/t3416-rebase-onto-threedots.sh                   | 1 -
 t/t3417-rebase-whitespace-fix.sh                   | 1 -
 t/t3418-rebase-continue.sh                         | 1 -
 t/t3419-rebase-patch-id.sh                         | 1 -
 t/t3420-rebase-autostash.sh                        | 1 -
 t/t3421-rebase-topology-linear.sh                  | 1 -
 t/t3422-rebase-incompatible-options.sh             | 1 -
 t/t3423-rebase-reword.sh                           | 1 -
 t/t3424-rebase-empty.sh                            | 1 -
 t/t3425-rebase-topology-merges.sh                  | 1 -
 t/t3426-rebase-submodule.sh                        | 1 -
 t/t3427-rebase-subtree.sh                          | 1 -
 t/t3428-rebase-signoff.sh                          | 1 -
 t/t3429-rebase-edit-todo.sh                        | 1 -
 t/t3430-rebase-merges.sh                           | 1 -
 t/t3431-rebase-fork-point.sh                       | 1 -
 t/t3432-rebase-fast-forward.sh                     | 1 -
 t/t3433-rebase-across-mode-change.sh               | 1 -
 t/t3434-rebase-i18n.sh                             | 1 -
 t/t3435-rebase-gpg-sign.sh                         | 1 -
 t/t3436-rebase-more-options.sh                     | 1 -
 t/t3437-rebase-fixup-options.sh                    | 1 -
 t/t3438-rebase-broken-files.sh                     | 1 -
 t/t3500-cherry.sh                                  | 1 -
 t/t3501-revert-cherry-pick.sh                      | 1 -
 t/t3502-cherry-pick-merge.sh                       | 1 -
 t/t3503-cherry-pick-root.sh                        | 1 -
 t/t3504-cherry-pick-rerere.sh                      | 1 -
 t/t3505-cherry-pick-empty.sh                       | 1 -
 t/t3506-cherry-pick-ff.sh                          | 1 -
 t/t3507-cherry-pick-conflict.sh                    | 1 -
 t/t3508-cherry-pick-many-commits.sh                | 1 -
 t/t3509-cherry-pick-merge-df.sh                    | 1 -
 t/t3510-cherry-pick-sequence.sh                    | 1 -
 t/t3511-cherry-pick-x.sh                           | 1 -
 t/t3512-cherry-pick-submodule.sh                   | 1 -
 t/t3513-revert-submodule.sh                        | 1 -
 t/t3514-cherry-pick-revert-gpg.sh                  | 1 -
 t/t3600-rm.sh                                      | 1 -
 t/t3601-rm-pathspec-file.sh                        | 1 -
 t/t3602-rm-sparse-checkout.sh                      | 1 -
 t/t3650-replay-basics.sh                           | 1 -
 t/t3700-add.sh                                     | 1 -
 t/t3701-add-interactive.sh                         | 1 -
 t/t3702-add-edit.sh                                | 1 -
 t/t3703-add-magic-pathspec.sh                      | 1 -
 t/t3704-add-pathspec-file.sh                       | 1 -
 t/t3705-add-sparse-checkout.sh                     | 1 -
 t/t3800-mktag.sh                                   | 1 -
 t/t3900-i18n-commit.sh                             | 1 -
 t/t3901-i18n-patch.sh                              | 1 -
 t/t3902-quoted.sh                                  | 1 -
 t/t3903-stash.sh                                   | 1 -
 t/t3904-stash-patch.sh                             | 1 -
 t/t3905-stash-include-untracked.sh                 | 1 -
 t/t3906-stash-submodule.sh                         | 1 -
 t/t3907-stash-show-config.sh                       | 1 -
 t/t3908-stash-in-worktree.sh                       | 1 -
 t/t3909-stash-pathspec-file.sh                     | 1 -
 t/t3920-crlf-messages.sh                           | 1 -
 t/t4000-diff-format.sh                             | 1 -
 t/t4001-diff-rename.sh                             | 1 -
 t/t4002-diff-basic.sh                              | 1 -
 t/t4003-diff-rename-1.sh                           | 1 -
 t/t4004-diff-rename-symlink.sh                     | 1 -
 t/t4005-diff-rename-2.sh                           | 1 -
 t/t4006-diff-mode.sh                               | 1 -
 t/t4007-rename-3.sh                                | 1 -
 t/t4008-diff-break-rewrite.sh                      | 1 -
 t/t4009-diff-rename-4.sh                           | 1 -
 t/t4010-diff-pathspec.sh                           | 1 -
 t/t4011-diff-symlink.sh                            | 1 -
 t/t4012-diff-binary.sh                             | 1 -
 t/t4013-diff-various.sh                            | 1 -
 t/t4014-format-patch.sh                            | 1 -
 t/t4015-diff-whitespace.sh                         | 1 -
 t/t4016-diff-quote.sh                              | 1 -
 t/t4017-diff-retval.sh                             | 1 -
 t/t4018-diff-funcname.sh                           | 1 -
 t/t4019-diff-wserror.sh                            | 1 -
 t/t4020-diff-external.sh                           | 1 -
 t/t4021-format-patch-numbered.sh                   | 1 -
 t/t4022-diff-rewrite.sh                            | 1 -
 t/t4023-diff-rename-typechange.sh                  | 1 -
 t/t4024-diff-optimize-common.sh                    | 1 -
 t/t4025-hunk-header.sh                             | 1 -
 t/t4026-color.sh                                   | 1 -
 t/t4027-diff-submodule.sh                          | 1 -
 t/t4028-format-patch-mime-headers.sh               | 1 -
 t/t4029-diff-trailing-space.sh                     | 1 -
 t/t4030-diff-textconv.sh                           | 1 -
 t/t4031-diff-rewrite-binary.sh                     | 1 -
 t/t4032-diff-inter-hunk-context.sh                 | 1 -
 t/t4033-diff-patience.sh                           | 1 -
 t/t4034-diff-words.sh                              | 1 -
 t/t4035-diff-quiet.sh                              | 1 -
 t/t4036-format-patch-signer-mime.sh                | 1 -
 t/t4037-diff-r-t-dirs.sh                           | 1 -
 t/t4038-diff-combined.sh                           | 1 -
 t/t4039-diff-assume-unchanged.sh                   | 1 -
 t/t4040-whitespace-status.sh                       | 1 -
 t/t4041-diff-submodule-option.sh                   | 1 -
 t/t4042-diff-textconv-caching.sh                   | 1 -
 t/t4043-diff-rename-binary.sh                      | 1 -
 t/t4044-diff-index-unique-abbrev.sh                | 1 -
 t/t4045-diff-relative.sh                           | 1 -
 t/t4046-diff-unmerged.sh                           | 1 -
 t/t4047-diff-dirstat.sh                            | 1 -
 t/t4048-diff-combined-binary.sh                    | 1 -
 t/t4049-diff-stat-count.sh                         | 1 -
 t/t4050-diff-histogram.sh                          | 1 -
 t/t4051-diff-function-context.sh                   | 1 -
 t/t4052-stat-output.sh                             | 1 -
 t/t4053-diff-no-index.sh                           | 1 -
 t/t4054-diff-bogus-tree.sh                         | 1 -
 t/t4055-diff-context.sh                            | 1 -
 t/t4056-diff-order.sh                              | 1 -
 t/t4057-diff-combined-paths.sh                     | 1 -
 t/t4058-diff-duplicates.sh                         | 1 -
 t/t4059-diff-submodule-not-initialized.sh          | 1 -
 t/t4060-diff-submodule-option-diff-format.sh       | 1 -
 t/t4061-diff-indent.sh                             | 1 -
 t/t4062-diff-pickaxe.sh                            | 1 -
 t/t4063-diff-blobs.sh                              | 1 -
 t/t4064-diff-oidfind.sh                            | 1 -
 t/t4065-diff-anchored.sh                           | 1 -
 t/t4066-diff-emit-delay.sh                         | 1 -
 t/t4067-diff-partial-clone.sh                      | 1 -
 t/t4068-diff-symmetric-merge-base.sh               | 1 -
 t/t4069-remerge-diff.sh                            | 1 -
 t/t4100-apply-stat.sh                              | 1 -
 t/t4101-apply-nonl.sh                              | 1 -
 t/t4102-apply-rename.sh                            | 1 -
 t/t4103-apply-binary.sh                            | 1 -
 t/t4104-apply-boundary.sh                          | 1 -
 t/t4105-apply-fuzz.sh                              | 1 -
 t/t4106-apply-stdin.sh                             | 1 -
 t/t4107-apply-ignore-whitespace.sh                 | 1 -
 t/t4108-apply-threeway.sh                          | 1 -
 t/t4109-apply-multifrag.sh                         | 1 -
 t/t4110-apply-scan.sh                              | 1 -
 t/t4111-apply-subdir.sh                            | 1 -
 t/t4112-apply-renames.sh                           | 1 -
 t/t4113-apply-ending.sh                            | 1 -
 t/t4114-apply-typechange.sh                        | 1 -
 t/t4115-apply-symlink.sh                           | 1 -
 t/t4116-apply-reverse.sh                           | 1 -
 t/t4117-apply-reject.sh                            | 1 -
 t/t4118-apply-empty-context.sh                     | 1 -
 t/t4119-apply-config.sh                            | 1 -
 t/t4120-apply-popt.sh                              | 1 -
 t/t4121-apply-diffs.sh                             | 1 -
 t/t4122-apply-symlink-inside.sh                    | 1 -
 t/t4123-apply-shrink.sh                            | 1 -
 t/t4124-apply-ws-rule.sh                           | 1 -
 t/t4125-apply-ws-fuzz.sh                           | 1 -
 t/t4126-apply-empty.sh                             | 1 -
 t/t4127-apply-same-fn.sh                           | 1 -
 t/t4128-apply-root.sh                              | 1 -
 t/t4129-apply-samemode.sh                          | 1 -
 t/t4130-apply-criss-cross-rename.sh                | 1 -
 t/t4131-apply-fake-ancestor.sh                     | 1 -
 t/t4132-apply-removal.sh                           | 1 -
 t/t4133-apply-filenames.sh                         | 1 -
 t/t4134-apply-submodule.sh                         | 1 -
 t/t4135-apply-weird-filenames.sh                   | 1 -
 t/t4136-apply-check.sh                             | 1 -
 t/t4137-apply-submodule.sh                         | 1 -
 t/t4138-apply-ws-expansion.sh                      | 1 -
 t/t4139-apply-escape.sh                            | 1 -
 t/t4140-apply-ita.sh                               | 1 -
 t/t4141-apply-too-large.sh                         | 1 -
 t/t4150-am.sh                                      | 1 -
 t/t4151-am-abort.sh                                | 1 -
 t/t4152-am-subjects.sh                             | 1 -
 t/t4153-am-resume-override-opts.sh                 | 1 -
 t/t4200-rerere.sh                                  | 1 -
 t/t4201-shortlog.sh                                | 1 -
 t/t4202-log.sh                                     | 1 -
 t/t4203-mailmap.sh                                 | 1 -
 t/t4204-patch-id.sh                                | 1 -
 t/t4205-log-pretty-formats.sh                      | 1 -
 t/t4206-log-follow-harder-copies.sh                | 1 -
 t/t4207-log-decoration-colors.sh                   | 1 -
 t/t4208-log-magic-pathspec.sh                      | 1 -
 t/t4209-log-pickaxe.sh                             | 1 -
 t/t4210-log-i18n.sh                                | 1 -
 t/t4211-line-log.sh                                | 1 -
 t/t4212-log-corrupt.sh                             | 1 -
 t/t4213-log-tabexpand.sh                           | 1 -
 t/t4214-log-graph-octopus.sh                       | 1 -
 t/t4215-log-skewed-merges.sh                       | 1 -
 t/t4216-log-bloom.sh                               | 1 -
 t/t4217-log-limit.sh                               | 1 -
 t/t4252-am-options.sh                              | 1 -
 t/t4253-am-keep-cr-dos.sh                          | 1 -
 t/t4254-am-corrupt.sh                              | 1 -
 t/t4255-am-submodule.sh                            | 1 -
 t/t4256-am-format-flowed.sh                        | 1 -
 t/t4257-am-interactive.sh                          | 1 -
 t/t4258-am-quoted-cr.sh                            | 1 -
 t/t4300-merge-tree.sh                              | 1 -
 t/t4301-merge-tree-write-tree.sh                   | 1 -
 t/t5000-tar-tree.sh                                | 1 -
 t/t5001-archive-attr.sh                            | 1 -
 t/t5002-archive-attr-pattern.sh                    | 1 -
 t/t5003-archive-zip.sh                             | 1 -
 t/t5004-archive-corner-cases.sh                    | 1 -
 t/t5100-mailinfo.sh                                | 1 -
 t/t5150-request-pull.sh                            | 1 -
 t/t5200-update-server-info.sh                      | 1 -
 t/t5300-pack-object.sh                             | 1 -
 t/t5301-sliding-window.sh                          | 1 -
 t/t5302-pack-index.sh                              | 1 -
 t/t5303-pack-corruption-resilience.sh              | 1 -
 t/t5304-prune.sh                                   | 1 -
 t/t5305-include-tag.sh                             | 1 -
 t/t5306-pack-nobase.sh                             | 1 -
 t/t5307-pack-missing-commit.sh                     | 1 -
 t/t5308-pack-detect-duplicates.sh                  | 1 -
 t/t5309-pack-delta-cycles.sh                       | 1 -
 t/t5310-pack-bitmaps.sh                            | 1 -
 t/t5311-pack-bitmaps-shallow.sh                    | 1 -
 t/t5312-prune-corruption.sh                        | 1 -
 t/t5313-pack-bounds-checks.sh                      | 1 -
 t/t5314-pack-cycle-detection.sh                    | 1 -
 t/t5315-pack-objects-compression.sh                | 1 -
 t/t5316-pack-delta-depth.sh                        | 1 -
 t/t5317-pack-objects-filter-objects.sh             | 1 -
 t/t5318-commit-graph.sh                            | 1 -
 t/t5319-multi-pack-index.sh                        | 1 -
 t/t5320-delta-islands.sh                           | 1 -
 t/t5321-pack-large-objects.sh                      | 1 -
 t/t5322-pack-objects-sparse.sh                     | 1 -
 t/t5323-pack-redundant.sh                          | 1 -
 t/t5324-split-commit-graph.sh                      | 1 -
 t/t5325-reverse-index.sh                           | 1 -
 t/t5326-multi-pack-bitmaps.sh                      | 1 -
 t/t5327-multi-pack-bitmaps-rev.sh                  | 1 -
 t/t5328-commit-graph-64bit-time.sh                 | 1 -
 t/t5329-pack-objects-cruft.sh                      | 1 -
 t/t5330-no-lazy-fetch-with-commit-graph.sh         | 1 -
 t/t5331-pack-objects-stdin.sh                      | 1 -
 t/t5332-multi-pack-reuse.sh                        | 1 -
 t/t5333-pseudo-merge-bitmaps.sh                    | 1 -
 t/t5334-incremental-multi-pack-index.sh            | 1 -
 t/t5351-unpack-large-objects.sh                    | 1 -
 t/t5400-send-pack.sh                               | 1 -
 t/t5401-update-hooks.sh                            | 1 -
 t/t5402-post-merge-hook.sh                         | 1 -
 t/t5403-post-checkout-hook.sh                      | 1 -
 t/t5404-tracking-branches.sh                       | 1 -
 t/t5405-send-pack-rewind.sh                        | 1 -
 t/t5406-remote-rejects.sh                          | 1 -
 t/t5407-post-rewrite-hook.sh                       | 1 -
 t/t5408-send-pack-stdin.sh                         | 1 -
 t/t5409-colorize-remote-messages.sh                | 1 -
 t/t5410-receive-pack-alternates.sh                 | 1 -
 t/t5411-proc-receive-hook.sh                       | 1 -
 t/t5500-fetch-pack.sh                              | 1 -
 t/t5501-fetch-push-alternates.sh                   | 1 -
 t/t5502-quickfetch.sh                              | 1 -
 t/t5503-tagfollow.sh                               | 1 -
 t/t5504-fetch-receive-strict.sh                    | 1 -
 t/t5505-remote.sh                                  | 1 -
 t/t5506-remote-groups.sh                           | 1 -
 t/t5507-remote-environment.sh                      | 1 -
 t/t5509-fetch-push-namespaces.sh                   | 1 -
 t/t5510-fetch.sh                                   | 1 -
 t/t5511-refspec.sh                                 | 1 -
 t/t5512-ls-remote.sh                               | 1 -
 t/t5513-fetch-track.sh                             | 1 -
 t/t5514-fetch-multiple.sh                          | 1 -
 t/t5515-fetch-merge-logic.sh                       | 1 -
 t/t5516-fetch-push.sh                              | 1 -
 t/t5517-push-mirror.sh                             | 1 -
 t/t5518-fetch-exit-status.sh                       | 1 -
 t/t5519-push-alternates.sh                         | 1 -
 t/t5520-pull.sh                                    | 1 -
 t/t5521-pull-options.sh                            | 1 -
 t/t5522-pull-symlink.sh                            | 1 -
 t/t5523-push-upstream.sh                           | 1 -
 t/t5524-pull-msg.sh                                | 1 -
 t/t5525-fetch-tagopt.sh                            | 1 -
 t/t5526-fetch-submodules.sh                        | 1 -
 t/t5527-fetch-odd-refs.sh                          | 1 -
 t/t5528-push-default.sh                            | 1 -
 t/t5529-push-errors.sh                             | 1 -
 t/t5530-upload-pack-error.sh                       | 1 -
 t/t5531-deep-submodule-push.sh                     | 1 -
 t/t5532-fetch-proxy.sh                             | 1 -
 t/t5533-push-cas.sh                                | 1 -
 t/t5534-push-signed.sh                             | 1 -
 t/t5535-fetch-push-symref.sh                       | 1 -
 t/t5536-fetch-conflicts.sh                         | 1 -
 t/t5537-fetch-shallow.sh                           | 1 -
 t/t5538-push-shallow.sh                            | 1 -
 t/t5539-fetch-http-shallow.sh                      | 1 -
 t/t5540-http-push-webdav.sh                        | 1 -
 t/t5541-http-push-smart.sh                         | 1 -
 t/t5542-push-http-shallow.sh                       | 1 -
 t/t5543-atomic-push.sh                             | 1 -
 t/t5544-pack-objects-hook.sh                       | 1 -
 t/t5545-push-options.sh                            | 1 -
 t/t5546-receive-limits.sh                          | 1 -
 t/t5547-push-quarantine.sh                         | 1 -
 t/t5548-push-porcelain.sh                          | 1 -
 t/t5549-fetch-push-http.sh                         | 1 -
 t/t5550-http-fetch-dumb.sh                         | 1 -
 t/t5551-http-fetch-smart.sh                        | 1 -
 t/t5552-skipping-fetch-negotiator.sh               | 1 -
 t/t5553-set-upstream.sh                            | 1 -
 t/t5554-noop-fetch-negotiator.sh                   | 1 -
 t/t5555-http-smart-common.sh                       | 1 -
 t/t5557-http-get.sh                                | 1 -
 t/t5558-clone-bundle-uri.sh                        | 1 -
 t/t5560-http-backend-noserver.sh                   | 1 -
 t/t5561-http-backend.sh                            | 1 -
 t/t5562-http-backend-content-length.sh             | 1 -
 t/t5563-simple-http-auth.sh                        | 1 -
 t/t5564-http-proxy.sh                              | 1 -
 t/t5570-git-daemon.sh                              | 1 -
 t/t5571-pre-push-hook.sh                           | 1 -
 t/t5572-pull-submodule.sh                          | 1 -
 t/t5573-pull-verify-signatures.sh                  | 1 -
 t/t5574-fetch-output.sh                            | 1 -
 t/t5580-unc-paths.sh                               | 1 -
 t/t5581-http-curl-verbose.sh                       | 1 -
 t/t5582-fetch-negative-refspec.sh                  | 1 -
 t/t5583-push-branches.sh                           | 1 -
 t/t5600-clone-fail-cleanup.sh                      | 1 -
 t/t5601-clone.sh                                   | 1 -
 t/t5602-clone-remote-exec.sh                       | 1 -
 t/t5603-clone-dirname.sh                           | 1 -
 t/t5604-clone-reference.sh                         | 1 -
 t/t5605-clone-local.sh                             | 1 -
 t/t5606-clone-options.sh                           | 1 -
 t/t5607-clone-bundle.sh                            | 1 -
 t/t5609-clone-branch.sh                            | 1 -
 t/t5610-clone-detached.sh                          | 1 -
 t/t5611-clone-config.sh                            | 1 -
 t/t5612-clone-refspec.sh                           | 1 -
 t/t5613-info-alternate.sh                          | 1 -
 t/t5614-clone-submodules-shallow.sh                | 1 -
 t/t5615-alternate-env.sh                           | 1 -
 t/t5616-partial-clone.sh                           | 1 -
 t/t5617-clone-submodules-remote.sh                 | 1 -
 t/t5618-alternate-refs.sh                          | 1 -
 t/t5619-clone-local-ambiguous-transport.sh         | 1 -
 t/t5700-protocol-v1.sh                             | 1 -
 t/t5701-git-serve.sh                               | 1 -
 t/t5702-protocol-v2.sh                             | 1 -
 t/t5703-upload-pack-ref-in-want.sh                 | 1 -
 t/t5704-protocol-violations.sh                     | 1 -
 t/t5705-session-id-in-capabilities.sh              | 1 -
 t/t5730-protocol-v2-bundle-uri-file.sh             | 1 -
 t/t5731-protocol-v2-bundle-uri-git.sh              | 1 -
 t/t5732-protocol-v2-bundle-uri-http.sh             | 1 -
 t/t5750-bundle-uri-parse.sh                        | 1 -
 t/t5801-remote-helpers.sh                          | 1 -
 t/t5802-connect-helper.sh                          | 1 -
 t/t5810-proto-disable-local.sh                     | 1 -
 t/t5811-proto-disable-git.sh                       | 1 -
 t/t5812-proto-disable-http.sh                      | 1 -
 t/t5813-proto-disable-ssh.sh                       | 1 -
 t/t5814-proto-disable-ext.sh                       | 1 -
 t/t5815-submodule-protos.sh                        | 1 -
 t/t5900-repo-selection.sh                          | 1 -
 t/t6000-rev-list-misc.sh                           | 1 -
 t/t6001-rev-list-graft.sh                          | 1 -
 t/t6002-rev-list-bisect.sh                         | 1 -
 t/t6003-rev-list-topo-order.sh                     | 1 -
 t/t6004-rev-list-path-optim.sh                     | 1 -
 t/t6005-rev-list-count.sh                          | 1 -
 t/t6006-rev-list-format.sh                         | 1 -
 t/t6007-rev-list-cherry-pick-file.sh               | 1 -
 t/t6008-rev-list-submodule.sh                      | 1 -
 t/t6009-rev-list-parent.sh                         | 1 -
 t/t6010-merge-base.sh                              | 1 -
 t/t6011-rev-list-with-bad-commit.sh                | 1 -
 t/t6012-rev-list-simplify.sh                       | 1 -
 t/t6013-rev-list-reverse-parents.sh                | 1 -
 t/t6014-rev-list-all.sh                            | 1 -
 t/t6016-rev-list-graph-simplify-history.sh         | 1 -
 t/t6017-rev-list-stdin.sh                          | 1 -
 t/t6018-rev-list-glob.sh                           | 1 -
 t/t6019-rev-list-ancestry-path.sh                  | 1 -
 t/t6020-bundle-misc.sh                             | 1 -
 t/t6021-rev-list-exclude-hidden.sh                 | 1 -
 t/t6022-rev-list-missing.sh                        | 1 -
 t/t6030-bisect-porcelain.sh                        | 1 -
 t/t6040-tracking-info.sh                           | 1 -
 t/t6041-bisect-submodule.sh                        | 1 -
 t/t6050-replace.sh                                 | 1 -
 t/t6060-merge-index.sh                             | 1 -
 t/t6100-rev-list-in-order.sh                       | 1 -
 t/t6101-rev-parse-parents.sh                       | 1 -
 t/t6102-rev-list-unexpected-objects.sh             | 1 -
 t/t6110-rev-list-sparse.sh                         | 1 -
 t/t6111-rev-list-treesame.sh                       | 1 -
 t/t6112-rev-list-filters-objects.sh                | 1 -
 t/t6113-rev-list-bitmap-filters.sh                 | 1 -
 t/t6114-keep-packs.sh                              | 1 -
 t/t6115-rev-list-du.sh                             | 1 -
 t/t6120-describe.sh                                | 1 -
 t/t6130-pathspec-noglob.sh                         | 1 -
 t/t6131-pathspec-icase.sh                          | 1 -
 t/t6132-pathspec-exclude.sh                        | 1 -
 t/t6133-pathspec-rev-dwim.sh                       | 1 -
 t/t6134-pathspec-in-submodule.sh                   | 1 -
 t/t6135-pathspec-with-attrs.sh                     | 1 -
 t/t6136-pathspec-in-bare.sh                        | 1 -
 t/t6200-fmt-merge-msg.sh                           | 1 -
 t/t6300-for-each-ref.sh                            | 1 -
 t/t6301-for-each-ref-errors.sh                     | 1 -
 t/t6302-for-each-ref-filter.sh                     | 1 -
 t/t6400-merge-df.sh                                | 1 -
 t/t6401-merge-criss-cross.sh                       | 1 -
 t/t6402-merge-rename.sh                            | 1 -
 t/t6403-merge-file.sh                              | 1 -
 t/t6404-recursive-merge.sh                         | 1 -
 t/t6405-merge-symlinks.sh                          | 1 -
 t/t6406-merge-attr.sh                              | 1 -
 t/t6407-merge-binary.sh                            | 1 -
 t/t6408-merge-up-to-date.sh                        | 1 -
 t/t6409-merge-subtree.sh                           | 1 -
 t/t6411-merge-filemode.sh                          | 1 -
 t/t6412-merge-large-rename.sh                      | 1 -
 t/t6413-merge-crlf.sh                              | 1 -
 t/t6414-merge-rename-nocruft.sh                    | 1 -
 t/t6415-merge-dir-to-symlink.sh                    | 1 -
 t/t6416-recursive-corner-cases.sh                  | 1 -
 t/t6417-merge-ours-theirs.sh                       | 1 -
 t/t6418-merge-text-auto.sh                         | 1 -
 t/t6421-merge-partial-clone.sh                     | 1 -
 t/t6422-merge-rename-corner-cases.sh               | 1 -
 t/t6423-merge-rename-directories.sh                | 1 -
 t/t6424-merge-unrelated-index-changes.sh           | 1 -
 t/t6425-merge-rename-delete.sh                     | 1 -
 t/t6426-merge-skip-unneeded-updates.sh             | 1 -
 t/t6427-diff3-conflict-markers.sh                  | 1 -
 t/t6428-merge-conflicts-sparse.sh                  | 1 -
 t/t6429-merge-sequence-rename-caching.sh           | 1 -
 t/t6430-merge-recursive.sh                         | 1 -
 t/t6431-merge-criscross.sh                         | 1 -
 t/t6432-merge-recursive-space-options.sh           | 1 -
 t/t6433-merge-toplevel.sh                          | 1 -
 t/t6434-merge-recursive-rename-options.sh          | 1 -
 t/t6435-merge-sparse.sh                            | 1 -
 t/t6436-merge-overwrite.sh                         | 1 -
 t/t6437-submodule-merge.sh                         | 1 -
 t/t6438-submodule-directory-file-conflicts.sh      | 1 -
 t/t6439-merge-co-error-msgs.sh                     | 1 -
 t/t6500-gc.sh                                      | 1 -
 t/t6501-freshen-objects.sh                         | 1 -
 t/t6600-test-reach.sh                              | 1 -
 t/t6700-tree-depth.sh                              | 1 -
 t/t7001-mv.sh                                      | 1 -
 t/t7002-mv-sparse-checkout.sh                      | 1 -
 t/t7003-filter-branch.sh                           | 1 -
 t/t7004-tag.sh                                     | 1 -
 t/t7005-editor.sh                                  | 1 -
 t/t7006-pager.sh                                   | 1 -
 t/t7007-show.sh                                    | 1 -
 t/t7008-filter-branch-null-sha1.sh                 | 1 -
 t/t7010-setup.sh                                   | 1 -
 t/t7011-skip-worktree-reading.sh                   | 1 -
 t/t7012-skip-worktree-writing.sh                   | 1 -
 t/t7030-verify-tag.sh                              | 1 -
 t/t7031-verify-tag-signed-ssh.sh                   | 1 -
 t/t7060-wtstatus.sh                                | 1 -
 t/t7061-wtstatus-ignore.sh                         | 1 -
 t/t7062-wtstatus-ignorecase.sh                     | 1 -
 t/t7063-status-untracked-cache.sh                  | 1 -
 t/t7064-wtstatus-pv2.sh                            | 1 -
 t/t7101-reset-empty-subdirs.sh                     | 1 -
 t/t7102-reset.sh                                   | 1 -
 t/t7103-reset-bare.sh                              | 1 -
 t/t7104-reset-hard.sh                              | 1 -
 t/t7105-reset-patch.sh                             | 1 -
 t/t7106-reset-unborn-branch.sh                     | 1 -
 t/t7107-reset-pathspec-file.sh                     | 1 -
 t/t7110-reset-merge.sh                             | 1 -
 t/t7111-reset-table.sh                             | 1 -
 t/t7112-reset-submodule.sh                         | 1 -
 t/t7113-post-index-change-hook.sh                  | 1 -
 t/t7201-co.sh                                      | 1 -
 t/t7300-clean.sh                                   | 1 -
 t/t7301-clean-interactive.sh                       | 1 -
 t/t7400-submodule-basic.sh                         | 1 -
 t/t7401-submodule-summary.sh                       | 1 -
 t/t7402-submodule-rebase.sh                        | 1 -
 t/t7403-submodule-sync.sh                          | 1 -
 t/t7406-submodule-update.sh                        | 1 -
 t/t7407-submodule-foreach.sh                       | 1 -
 t/t7408-submodule-reference.sh                     | 1 -
 t/t7409-submodule-detached-work-tree.sh            | 1 -
 t/t7411-submodule-config.sh                        | 1 -
 t/t7412-submodule-absorbgitdirs.sh                 | 1 -
 t/t7413-submodule-is-active.sh                     | 1 -
 t/t7414-submodule-mistakes.sh                      | 1 -
 t/t7416-submodule-dash-url.sh                      | 1 -
 t/t7417-submodule-path-url.sh                      | 1 -
 t/t7418-submodule-sparse-gitmodules.sh             | 1 -
 t/t7419-submodule-set-branch.sh                    | 1 -
 t/t7420-submodule-set-url.sh                       | 1 -
 t/t7421-submodule-summary-add.sh                   | 1 -
 t/t7422-submodule-output.sh                        | 1 -
 t/t7423-submodule-symlinks.sh                      | 1 -
 t/t7424-submodule-mixed-ref-formats.sh             | 1 -
 t/t7450-bad-git-dotfiles.sh                        | 1 -
 t/t7500-commit-template-squash-signoff.sh          | 1 -
 t/t7501-commit-basic-functionality.sh              | 1 -
 t/t7502-commit-porcelain.sh                        | 1 -
 t/t7503-pre-commit-and-pre-merge-commit-hooks.sh   | 1 -
 t/t7504-commit-msg-hook.sh                         | 1 -
 t/t7505-prepare-commit-msg-hook.sh                 | 1 -
 t/t7506-status-submodule.sh                        | 1 -
 t/t7507-commit-verbose.sh                          | 1 -
 t/t7508-status.sh                                  | 1 -
 t/t7509-commit-authorship.sh                       | 1 -
 t/t7510-signed-commit.sh                           | 1 -
 t/t7511-status-index.sh                            | 1 -
 t/t7512-status-help.sh                             | 1 -
 t/t7513-interpret-trailers.sh                      | 1 -
 t/t7514-commit-patch.sh                            | 1 -
 t/t7515-status-symlinks.sh                         | 1 -
 t/t7516-commit-races.sh                            | 1 -
 t/t7517-per-repo-email.sh                          | 1 -
 t/t7518-ident-corner-cases.sh                      | 1 -
 t/t7519-status-fsmonitor.sh                        | 1 -
 t/t7520-ignored-hook-warning.sh                    | 1 -
 t/t7521-ignored-mode.sh                            | 1 -
 t/t7524-commit-summary.sh                          | 1 -
 t/t7525-status-rename.sh                           | 1 -
 t/t7526-commit-pathspec-file.sh                    | 1 -
 t/t7528-signed-commit-ssh.sh                       | 1 -
 t/t7600-merge.sh                                   | 1 -
 t/t7601-merge-pull-config.sh                       | 1 -
 t/t7602-merge-octopus-many.sh                      | 1 -
 t/t7603-merge-reduce-heads.sh                      | 1 -
 t/t7604-merge-custom-message.sh                    | 1 -
 t/t7605-merge-resolve.sh                           | 1 -
 t/t7606-merge-custom.sh                            | 1 -
 t/t7607-merge-state.sh                             | 1 -
 t/t7608-merge-messages.sh                          | 1 -
 t/t7609-mergetool--lib.sh                          | 1 -
 t/t7610-mergetool.sh                               | 1 -
 t/t7611-merge-abort.sh                             | 1 -
 t/t7612-merge-verify-signatures.sh                 | 1 -
 t/t7614-merge-signoff.sh                           | 1 -
 t/t7615-diff-algo-with-mergy-operations.sh         | 1 -
 t/t7700-repack.sh                                  | 1 -
 t/t7701-repack-unpack-unreachable.sh               | 1 -
 t/t7702-repack-cyclic-alternate.sh                 | 1 -
 t/t7703-repack-geometric.sh                        | 1 -
 t/t7704-repack-cruft.sh                            | 1 -
 t/t7800-difftool.sh                                | 1 -
 t/t7810-grep.sh                                    | 1 -
 t/t7811-grep-open.sh                               | 1 -
 t/t7812-grep-icase-non-ascii.sh                    | 1 -
 t/t7813-grep-icase-iso.sh                          | 1 -
 t/t7814-grep-recurse-submodules.sh                 | 1 -
 t/t7815-grep-binary.sh                             | 1 -
 t/t7816-grep-binary-pattern.sh                     | 1 -
 t/t7817-grep-sparse-checkout.sh                    | 1 -
 t/t7900-maintenance.sh                             | 1 -
 t/t8001-annotate.sh                                | 1 -
 t/t8002-blame.sh                                   | 1 -
 t/t8003-blame-corner-cases.sh                      | 1 -
 t/t8004-blame-with-conflicts.sh                    | 1 -
 t/t8005-blame-i18n.sh                              | 1 -
 t/t8006-blame-textconv.sh                          | 1 -
 t/t8007-cat-file-textconv.sh                       | 1 -
 t/t8008-blame-formats.sh                           | 1 -
 t/t8009-blame-vs-topicbranches.sh                  | 1 -
 t/t8010-cat-file-filters.sh                        | 1 -
 t/t8011-blame-split-file.sh                        | 1 -
 t/t8012-blame-colors.sh                            | 1 -
 t/t8013-blame-ignore-revs.sh                       | 1 -
 t/t8014-blame-ignore-fuzzy.sh                      | 1 -
 t/t9001-send-email.sh                              | 1 -
 t/t9002-column.sh                                  | 1 -
 t/t9003-help-autocorrect.sh                        | 1 -
 t/t9200-git-cvsexportcommit.sh                     | 1 -
 t/t9210-scalar.sh                                  | 1 -
 t/t9211-scalar-clone.sh                            | 1 -
 t/t9300-fast-import.sh                             | 1 -
 t/t9301-fast-import-notes.sh                       | 1 -
 t/t9302-fast-import-unpack-limit.sh                | 1 -
 t/t9303-fast-import-compression.sh                 | 1 -
 t/t9304-fast-import-marks.sh                       | 1 -
 t/t9350-fast-export.sh                             | 1 -
 t/t9351-fast-export-anonymize.sh                   | 1 -
 t/t9400-git-cvsserver-server.sh                    | 1 -
 t/t9401-git-cvsserver-crlf.sh                      | 1 -
 t/t9402-git-cvsserver-refs.sh                      | 1 -
 t/t9500-gitweb-standalone-no-errors.sh             | 1 -
 t/t9501-gitweb-standalone-http-status.sh           | 1 -
 t/t9502-gitweb-standalone-parse-output.sh          | 1 -
 t/t9600-cvsimport.sh                               | 1 -
 t/t9601-cvsimport-vendor-branch.sh                 | 1 -
 t/t9602-cvsimport-branches-tags.sh                 | 1 -
 t/t9603-cvsimport-patchsets.sh                     | 1 -
 t/t9604-cvsimport-timestamps.sh                    | 1 -
 t/t9700-perl-git.sh                                | 1 -
 t/t9800-git-p4-basic.sh                            | 1 -
 t/t9801-git-p4-branch.sh                           | 1 -
 t/t9802-git-p4-filetype.sh                         | 1 -
 t/t9803-git-p4-shell-metachars.sh                  | 1 -
 t/t9804-git-p4-label.sh                            | 1 -
 t/t9805-git-p4-skip-submit-edit.sh                 | 1 -
 t/t9806-git-p4-options.sh                          | 1 -
 t/t9808-git-p4-chdir.sh                            | 1 -
 t/t9809-git-p4-client-view.sh                      | 1 -
 t/t9810-git-p4-rcs.sh                              | 1 -
 t/t9811-git-p4-label-import.sh                     | 1 -
 t/t9812-git-p4-wildcards.sh                        | 1 -
 t/t9813-git-p4-preserve-users.sh                   | 1 -
 t/t9814-git-p4-rename.sh                           | 1 -
 t/t9815-git-p4-submit-fail.sh                      | 1 -
 t/t9816-git-p4-locked.sh                           | 1 -
 t/t9817-git-p4-exclude.sh                          | 1 -
 t/t9818-git-p4-block.sh                            | 1 -
 t/t9819-git-p4-case-folding.sh                     | 1 -
 t/t9820-git-p4-editor-handling.sh                  | 1 -
 t/t9821-git-p4-path-variations.sh                  | 1 -
 t/t9822-git-p4-path-encoding.sh                    | 1 -
 t/t9823-git-p4-mock-lfs.sh                         | 1 -
 t/t9825-git-p4-handle-utf16-without-bom.sh         | 1 -
 t/t9826-git-p4-keep-empty-commits.sh               | 1 -
 t/t9827-git-p4-change-filetype.sh                  | 1 -
 t/t9828-git-p4-map-user.sh                         | 1 -
 t/t9829-git-p4-jobs.sh                             | 1 -
 t/t9830-git-p4-symlink-dir.sh                      | 1 -
 t/t9831-git-p4-triggers.sh                         | 1 -
 t/t9832-unshelve.sh                                | 1 -
 t/t9833-errors.sh                                  | 1 -
 t/t9834-git-p4-file-dir-bug.sh                     | 1 -
 t/t9835-git-p4-metadata-encoding-python2.sh        | 1 -
 t/t9836-git-p4-metadata-encoding-python3.sh        | 1 -
 t/t9850-shell.sh                                   | 1 -
 t/t9901-git-web--browse.sh                         | 1 -
 t/t9902-completion.sh                              | 1 -
 t/t9903-bash-prompt.sh                             | 1 -
 928 files changed, 928 deletions(-)
Show changes to 344 files +0 −343

t/t0001-init.sh, t/t0002-gitfile.sh, t/t0003-attributes.sh, t/t0004-unwritable.sh, t/t0005-signals.sh, t/t0006-date.sh, t/t0007-git-var.sh, t/t0008-ignores.sh, t/t0010-racy-git.sh, t/t0012-help.sh, t/t0013-sha1dc.sh, t/t0014-alias.sh, t/t0017-env-helper.sh, t/t0018-advice.sh, t/t0019-json-writer.sh, t/t0020-crlf.sh, t/t0021-conversion.sh, t/t0022-crlf-rename.sh, t/t0023-crlf-am.sh, t/t0024-crlf-archive.sh, t/t0025-crlf-renormalize.sh, t/t0026-eol-config.sh, t/t0027-auto-crlf.sh, t/t0028-working-tree-encoding.sh, t/t0029-core-unsetenvvars.sh, t/t0030-stripspace.sh, t/t0033-safe-directory.sh, t/t0035-safe-bare-repository.sh, t/t0040-parse-options.sh, t/t0041-usage.sh, t/t0050-filesystem.sh, t/t0052-simple-ipc.sh, t/t0055-beyond-symlinks.sh, t/t0056-git-C.sh, t/t0060-path-utils.sh, t/t0061-run-command.sh, t/t0062-revision-walking.sh, t/t0063-string-list.sh, t/t0066-dir-iterator.sh, t/t0067-parse_pathspec_file.sh, t/t0068-for-each-repo.sh, t/t0070-fundamental.sh, t/t0071-sort.sh, t/t0080-unit-test-output.sh, t/t0081-find-pack.sh, t/t0090-cache-tree.sh, t/t0091-bugreport.sh, t/t0092-diagnose.sh, t/t0095-bloom.sh, t/t0100-previous.sh, t/t0101-at-syntax.sh, t/t0200-gettext-basic.sh, t/t0201-gettext-fallbacks.sh, t/t0202-gettext-perl.sh, t/t0203-gettext-setlocale-sanity.sh, t/t0204-gettext-reencode-sanity.sh, t/t0210-trace2-normal.sh, t/t0211-trace2-perf.sh, t/t0212-trace2-event.sh, t/t0300-credentials.sh, t/t0301-credential-cache.sh, t/t0302-credential-store.sh, t/t0303-credential-external.sh, t/t0410-partial-clone.sh, t/t0411-clone-from-partial.sh, t/t0450-txt-doc-vs-help.sh, t/t0500-progress-display.sh, t/t0600-reffiles-backend.sh, t/t0601-reffiles-pack-refs.sh, t/t0602-reffiles-fsck.sh, t/t0610-reftable-basics.sh, t/t0611-reftable-httpd.sh, t/t0612-reftable-jgit-compatibility.sh, t/t0613-reftable-write-options.sh, t/t1000-read-tree-m-3way.sh, t/t1001-read-tree-m-2way.sh, t/t1002-read-tree-m-u-2way.sh, t/t1003-read-tree-prefix.sh, t/t1004-read-tree-m-u-wf.sh, t/t1005-read-tree-reset.sh, t/t1006-cat-file.sh, t/t1007-hash-object.sh, t/t1008-read-tree-overlay.sh, t/t1009-read-tree-new-index.sh, t/t1010-mktree.sh, t/t1011-read-tree-sparse-checkout.sh, t/t1012-read-tree-df.sh, t/t1013-read-tree-submodule.sh, t/t1014-read-tree-confusing.sh, t/t1015-read-index-unmerged.sh, t/t1016-compatObjectFormat.sh, t/t1020-subdirectory.sh, t/t1021-rerere-in-workdir.sh, t/t1022-read-tree-partial-clone.sh, t/t1050-large.sh, t/t1051-large-conversion.sh, t/t1060-object-corruption.sh, t/t1090-sparse-checkout-scope.sh, t/t1091-sparse-checkout-builtin.sh, t/t1092-sparse-checkout-compatibility.sh, t/t1100-commit-tree-options.sh, t/t1300-config.sh, t/t1301-shared-repo.sh, t/t1302-repo-version.sh, t/t1303-wacky-config.sh, t/t1304-default-acl.sh, t/t1305-config-include.sh, t/t1306-xdg-files.sh, t/t1307-config-blob.sh, t/t1308-config-set.sh, t/t1309-early-config.sh, t/t1310-config-default.sh, t/t1350-config-hooks-path.sh, t/t1400-update-ref.sh, t/t1401-symbolic-ref.sh, t/t1402-check-ref-format.sh, t/t1403-show-ref.sh, t/t1404-update-ref-errors.sh, t/t1405-main-ref-store.sh, t/t1406-submodule-ref-store.sh, t/t1407-worktree-ref-store.sh, t/t1408-packed-refs.sh, t/t1409-avoid-packing-refs.sh, t/t1410-reflog.sh, t/t1411-reflog-show.sh, t/t1412-reflog-loop.sh, t/t1413-reflog-detach.sh, t/t1414-reflog-walk.sh, t/t1415-worktree-refs.sh, t/t1416-ref-transaction-hooks.sh, t/t1417-reflog-updateref.sh, t/t1418-reflog-exists.sh, t/t1419-exclude-refs.sh, t/t1420-lost-found.sh, t/t1430-bad-ref-name.sh, t/t1450-fsck.sh, t/t1451-fsck-buffer.sh, t/t1460-refs-migrate.sh, t/t1500-rev-parse.sh, t/t1501-work-tree.sh, t/t1502-rev-parse-parseopt.sh, t/t1503-rev-parse-verify.sh, t/t1504-ceiling-dirs.sh, t/t1505-rev-parse-last.sh, t/t1506-rev-parse-diagnosis.sh, t/t1507-rev-parse-upstream.sh, t/t1508-at-combinations.sh, t/t1510-repo-setup.sh, t/t1511-rev-parse-caret.sh, t/t1512-rev-parse-disambiguation.sh, t/t1513-rev-parse-prefix.sh, t/t1514-rev-parse-push.sh, t/t1515-rev-parse-outside-repo.sh, t/t1517-outside-repo.sh, t/t1600-index.sh, t/t1601-index-bogus.sh, t/t1700-split-index.sh, t/t1701-racy-split-index.sh, t/t1800-hook.sh, t/t2000-conflict-when-checking-files-out.sh, t/t2002-checkout-cache-u.sh, t/t2003-checkout-cache-mkdir.sh, t/t2004-checkout-cache-temp.sh, t/t2005-checkout-index-symlinks.sh, t/t2006-checkout-index-basic.sh, t/t2007-checkout-symlink.sh, t/t2008-checkout-subdir.sh, t/t2009-checkout-statinfo.sh, t/t2010-checkout-ambiguous.sh, t/t2011-checkout-invalid-head.sh, t/t2012-checkout-last.sh, t/t2013-checkout-submodule.sh, t/t2014-checkout-switch.sh, t/t2015-checkout-unborn.sh, t/t2016-checkout-patch.sh, t/t2017-checkout-orphan.sh, t/t2018-checkout-branch.sh, t/t2019-checkout-ambiguous-ref.sh, t/t2020-checkout-detach.sh, t/t2021-checkout-overwrite.sh, t/t2022-checkout-paths.sh, t/t2023-checkout-m.sh, t/t2024-checkout-dwim.sh, t/t2025-checkout-no-overlay.sh, t/t2026-checkout-pathspec-file.sh, t/t2027-checkout-track.sh, t/t2030-unresolve-info.sh, t/t2050-git-dir-relative.sh, t/t2060-switch.sh, t/t2070-restore.sh, t/t2071-restore-patch.sh, t/t2072-restore-pathspec-file.sh, t/t2080-parallel-checkout-basics.sh, t/t2081-parallel-checkout-collisions.sh, t/t2082-parallel-checkout-attributes.sh, t/t2100-update-cache-badpath.sh, t/t2101-update-index-reupdate.sh, t/t2102-update-index-symlinks.sh, t/t2103-update-index-ignore-missing.sh, t/t2104-update-index-skip-worktree.sh, t/t2105-update-index-gitfile.sh, t/t2106-update-index-assume-unchanged.sh, t/t2107-update-index-basic.sh, t/t2108-update-index-refresh-racy.sh, t/t2200-add-update.sh, t/t2201-add-update-typechange.sh, t/t2202-add-addremove.sh, t/t2203-add-intent.sh, t/t2204-add-ignored.sh, t/t2205-add-worktree-config.sh, t/t2300-cd-to-toplevel.sh, t/t2400-worktree-add.sh, t/t2401-worktree-prune.sh, t/t2402-worktree-list.sh, t/t2403-worktree-move.sh, t/t2404-worktree-config.sh, t/t2405-worktree-submodule.sh, t/t2406-worktree-repair.sh, t/t2407-worktree-heads.sh, t/t2408-worktree-relative.sh, t/t2500-untracked-overwriting.sh, t/t2501-cwd-empty.sh, t/t3000-ls-files-others.sh, t/t3001-ls-files-others-exclude.sh, t/t3002-ls-files-dashpath.sh, t/t3003-ls-files-exclude.sh, t/t3004-ls-files-basic.sh, t/t3005-ls-files-relative.sh, t/t3006-ls-files-long.sh, t/t3007-ls-files-recurse-submodules.sh, t/t3008-ls-files-lazy-init-name-hash.sh, t/t3009-ls-files-others-nonsubmodule.sh, t/t3010-ls-files-killed-modified.sh, t/t3011-common-prefixes-and-directory-traversal.sh, t/t3012-ls-files-dedup.sh, t/t3013-ls-files-format.sh, t/t3020-ls-files-error-unmatch.sh, t/t3040-subprojects-basic.sh, t/t3050-subprojects-fetch.sh, t/t3060-ls-files-with-tree.sh, t/t3070-wildmatch.sh, t/t3100-ls-tree-restrict.sh, t/t3101-ls-tree-dirname.sh, t/t3102-ls-tree-wildcards.sh, t/t3103-ls-tree-misc.sh, t/t3104-ls-tree-format.sh, t/t3105-ls-tree-output.sh, t/t3200-branch.sh, t/t3201-branch-contains.sh, t/t3202-show-branch.sh, t/t3203-branch-output.sh, t/t3204-branch-name-interpretation.sh, t/t3205-branch-color.sh, t/t3206-range-diff.sh, t/t3207-branch-submodule.sh, t/t3211-peel-ref.sh, t/t3300-funny-names.sh, t/t3301-notes.sh, t/t3302-notes-index-expensive.sh, t/t3303-notes-subtrees.sh, t/t3304-notes-mixed.sh, t/t3305-notes-fanout.sh, t/t3306-notes-prune.sh, t/t3307-notes-man.sh, t/t3308-notes-merge.sh, t/t3309-notes-merge-auto-resolve.sh, t/t3310-notes-merge-manual-resolve.sh, t/t3311-notes-merge-fanout.sh, t/t3320-notes-merge-worktrees.sh, t/t3321-notes-stripspace.sh, t/t3400-rebase.sh, t/t3401-rebase-and-am-rename.sh, t/t3402-rebase-merge.sh, t/t3403-rebase-skip.sh, t/t3404-rebase-interactive.sh, t/t3405-rebase-malformed.sh, t/t3406-rebase-message.sh, t/t3407-rebase-abort.sh, t/t3408-rebase-multi-line.sh, t/t3409-rebase-environ.sh, t/t3412-rebase-root.sh, t/t3413-rebase-hook.sh, t/t3415-rebase-autosquash.sh, t/t3416-rebase-onto-threedots.sh, t/t3417-rebase-whitespace-fix.sh, t/t3418-rebase-continue.sh, t/t3419-rebase-patch-id.sh, t/t3420-rebase-autostash.sh, t/t3421-rebase-topology-linear.sh, t/t3422-rebase-incompatible-options.sh, t/t3423-rebase-reword.sh, t/t3424-rebase-empty.sh, t/t3425-rebase-topology-merges.sh, t/t3426-rebase-submodule.sh, t/t3427-rebase-subtree.sh, t/t3428-rebase-signoff.sh, t/t3429-rebase-edit-todo.sh, t/t3430-rebase-merges.sh, t/t3431-rebase-fork-point.sh, t/t3432-rebase-fast-forward.sh, t/t3433-rebase-across-mode-change.sh, t/t3434-rebase-i18n.sh, t/t3435-rebase-gpg-sign.sh, t/t3436-rebase-more-options.sh, t/t3437-rebase-fixup-options.sh, t/t3438-rebase-broken-files.sh, t/t3500-cherry.sh, t/t3501-revert-cherry-pick.sh, t/t3502-cherry-pick-merge.sh, t/t3503-cherry-pick-root.sh, t/t3504-cherry-pick-rerere.sh, t/t3505-cherry-pick-empty.sh, t/t3506-cherry-pick-ff.sh, t/t3507-cherry-pick-conflict.sh, t/t3508-cherry-pick-many-commits.sh, t/t3509-cherry-pick-merge-df.sh, t/t3510-cherry-pick-sequence.sh, t/t3511-cherry-pick-x.sh, t/t3512-cherry-pick-submodule.sh, t/t3513-revert-submodule.sh, t/t3514-cherry-pick-revert-gpg.sh, t/t3600-rm.sh, t/t3601-rm-pathspec-file.sh, t/t3602-rm-sparse-checkout.sh, t/t3650-replay-basics.sh, t/t3700-add.sh, t/t3701-add-interactive.sh, t/t3702-add-edit.sh, t/t3703-add-magic-pathspec.sh, t/t3704-add-pathspec-file.sh, t/t3705-add-sparse-checkout.sh, t/t3800-mktag.sh, t/t3900-i18n-commit.sh, t/t3901-i18n-patch.sh, t/t3902-quoted.sh, t/t3903-stash.sh, t/t3904-stash-patch.sh, t/t3905-stash-include-untracked.sh, t/t3906-stash-submodule.sh, t/t3907-stash-show-config.sh, t/t3908-stash-in-worktree.sh, t/t3909-stash-pathspec-file.sh, t/t3920-crlf-messages.sh, t/t4000-d

diff --git a/t/t0001-init.sh b/t/t0001-init.sh
index 0178aa62a41f1606f2382a4a10ab593ccf11e0e8..4890dff4b27311f0b187c72da61d9f1542257b16 100755
--- a/t/t0001-init.sh
+++ b/t/t0001-init.sh
@@ -2,7 +2,6 @@
 
 test_description='git init'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 check_config () {
diff --git a/t/t0002-gitfile.sh b/t/t0002-gitfile.sh
index bf3bf604abe3470f19cc5a10e5c88c905cb28329..dfbcdddbcc1f0fd5cf632524b3dfa5a8337a7f02 100755
--- a/t/t0002-gitfile.sh
+++ b/t/t0002-gitfile.sh
@@ -7,7 +7,6 @@ Verify that plumbing commands work when .git is a file
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 objpath() {
diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh
index 66ccb5889d1e026e22862f7f09bb9b29f0722f6b..3c98b622f25b760138ed8a938c104ea017d0f408 100755
--- a/t/t0003-attributes.sh
+++ b/t/t0003-attributes.sh
@@ -2,7 +2,6 @@
 
 test_description=gitattributes
 
-TEST_PASSES_SANITIZE_LEAK=true
 TEST_CREATE_REPO_NO_TEMPLATE=1
 . ./test-lib.sh
 
diff --git a/t/t0004-unwritable.sh b/t/t0004-unwritable.sh
index 8114fac73b320b85949d8d7ce1422c35e1eb8158..3bdafbae0f003863b09d01c6ded07c8c1be14e03 100755
--- a/t/t0004-unwritable.sh
+++ b/t/t0004-unwritable.sh
@@ -2,7 +2,6 @@
 
 test_description='detect unwritable repository and fail correctly'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t0005-signals.sh b/t/t0005-signals.sh
index eba75a2490ce7e0918e6a981d42ec8f5d9fd9b2d..afba0fc3fc673e5d7d4d55b2031607905853f737 100755
--- a/t/t0005-signals.sh
+++ b/t/t0005-signals.sh
@@ -2,7 +2,6 @@
 
 test_description='signals work as we expect'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 cat >expect <<EOF
diff --git a/t/t0006-date.sh b/t/t0006-date.sh
index fd373e1b39185488bf7e5861b3457b151711be5c..53ced36df448f1b572eb39fd76b8de291c529d69 100755
--- a/t/t0006-date.sh
+++ b/t/t0006-date.sh
@@ -2,7 +2,6 @@
 
 test_description='test date parsing and printing'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # arbitrary reference time: 2009-08-30 19:20:00
diff --git a/t/t0007-git-var.sh b/t/t0007-git-var.sh
index 9fc5882387390aa8b30477c2037d28cefeea64fc..2b60317758c415acc9b054d7668a88fc085be97b 100755
--- a/t/t0007-git-var.sh
+++ b/t/t0007-git-var.sh
@@ -2,7 +2,6 @@
 
 test_description='basic sanity checks for git var'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 sane_unset_all_editors () {
diff --git a/t/t0008-ignores.sh b/t/t0008-ignores.sh
index 02a18d4fdbd244dcc99290a28695ce7a89107d3a..c9376dffb58872787abc22a8654327d95ba256fb 100755
--- a/t/t0008-ignores.sh
+++ b/t/t0008-ignores.sh
@@ -2,7 +2,6 @@
 
 test_description=check-ignore
 
-TEST_PASSES_SANITIZE_LEAK=true
 TEST_CREATE_REPO_NO_TEMPLATE=1
 . ./test-lib.sh
 
diff --git a/t/t0010-racy-git.sh b/t/t0010-racy-git.sh
index 84172a3739094adc6cdf6496b016fe68e0b2a771..45229f57b821d73c4a1690e727eb9280d4ae631b 100755
--- a/t/t0010-racy-git.sh
+++ b/t/t0010-racy-git.sh
@@ -2,7 +2,6 @@
 
 test_description='racy GIT'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # This test can give false success if your machine is sufficiently
diff --git a/t/t0012-help.sh b/t/t0012-help.sh
index 9eae0d835637885dfc2c236544b4d828020e502e..1d273d91c2125ae2c16ae1a14c628cf23fcecc06 100755
--- a/t/t0012-help.sh
+++ b/t/t0012-help.sh
@@ -2,7 +2,6 @@
 
 test_description='help'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 configure_help () {
diff --git a/t/t0013-sha1dc.sh b/t/t0013-sha1dc.sh
index 08814173cb111c941c59e2fa764ac271fcbe9dab..ce3d81227a0f0c9fece708f883d14cd6c1e2c3d3 100755
--- a/t/t0013-sha1dc.sh
+++ b/t/t0013-sha1dc.sh
@@ -2,7 +2,6 @@
 
 test_description='test sha1 collision detection'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 TEST_DATA="$TEST_DIRECTORY/t0013"
 
diff --git a/t/t0014-alias.sh b/t/t0014-alias.sh
index 2a6f39ad9c81958d5152139995feab57c4371363..854d59ec58c25ab2cfb58113bf5ea8d670829fe0 100755
--- a/t/t0014-alias.sh
+++ b/t/t0014-alias.sh
@@ -2,7 +2,6 @@
 
 test_description='git command aliasing'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'nested aliases - internal execution' '
diff --git a/t/t0017-env-helper.sh b/t/t0017-env-helper.sh
index f3a16859cc20f1a3b80334d36113e757645c6c9b..32fe8481792325f05e6fdf9a83dee43871dce9ad 100755
--- a/t/t0017-env-helper.sh
+++ b/t/t0017-env-helper.sh
@@ -2,7 +2,6 @@
 
 test_description='test test-tool env-helper'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 
diff --git a/t/t0018-advice.sh b/t/t0018-advice.sh
index fac52322a7f6739ce95feea6b527edce00941361..9a3db02fdedd076870d5fdb63953bdb235951b6e 100755
--- a/t/t0018-advice.sh
+++ b/t/t0018-advice.sh
@@ -5,7 +5,6 @@ test_description='Test advise_if_enabled functionality'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=trunk
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'advice should be printed when config variable is unset' '
diff --git a/t/t0019-json-writer.sh b/t/t0019-json-writer.sh
index 19a730c29ed8f791d7885c31ff2a908cb1b5dfb3..3a4e1cc7e388ab0d0c24bca0ccaa7f07cf0a901e 100755
--- a/t/t0019-json-writer.sh
+++ b/t/t0019-json-writer.sh
@@ -2,7 +2,6 @@
 
 test_description='test json-writer JSON generation'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'unit test of json-writer routines' '
diff --git a/t/t0020-crlf.sh b/t/t0020-crlf.sh
index 81946e87ccb9b478789164a6db54d9a80278288d..fd1cae09edcc2609c69df8b1e934eb428793face 100755
--- a/t/t0020-crlf.sh
+++ b/t/t0020-crlf.sh
@@ -5,7 +5,6 @@ test_description='CRLF conversion'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 has_cr() {
diff --git a/t/t0021-conversion.sh b/t/t0021-conversion.sh
index 9e6c6ee0d44c0353dbf7dc10fe9c24a4421693a3..3f6433d3045826f776fe932c30a4aa5bef358d48 100755
--- a/t/t0021-conversion.sh
+++ b/t/t0021-conversion.sh
@@ -5,7 +5,6 @@ test_description='blob conversion via gitattributes'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-terminal.sh
 
diff --git a/t/t0022-crlf-rename.sh b/t/t0022-crlf-rename.sh
index 9fe98912511d3b6cb050aa51e33906caf7fb51c5..9bd863a970d2b16ff5d9d44b3a23d6c39f310217 100755
--- a/t/t0022-crlf-rename.sh
+++ b/t/t0022-crlf-rename.sh
@@ -2,7 +2,6 @@
 
 test_description='ignore CR in CRLF sequence while computing similiarity'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t0023-crlf-am.sh b/t/t0023-crlf-am.sh
index 575805513a3d7f6d27fee7ceefcb75e71753f1f9..f9bbb91f64e35d284a4ac79a6b2ecaa1d2913455 100755
--- a/t/t0023-crlf-am.sh
+++ b/t/t0023-crlf-am.sh
@@ -2,7 +2,6 @@
 
 test_description='Test am with auto.crlf'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 cat >patchfile <<\EOF
diff --git a/t/t0024-crlf-archive.sh b/t/t0024-crlf-archive.sh
index a7f4de4a43ffa022ae56ebf14999cbe81900a4a9..44958cb2c2d946656bae5289ee418bf3a295cec5 100755
--- a/t/t0024-crlf-archive.sh
+++ b/t/t0024-crlf-archive.sh
@@ -2,7 +2,6 @@
 
 test_description='respect crlf in git archive'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t0025-crlf-renormalize.sh b/t/t0025-crlf-renormalize.sh
index f7202c192e7b63e07c904fe9dcf1b76252d8808d..2e28feb69c9fea23b4a8481925280eb333f1e91f 100755
--- a/t/t0025-crlf-renormalize.sh
+++ b/t/t0025-crlf-renormalize.sh
@@ -2,7 +2,6 @@
 
 test_description='CRLF renormalization'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t0026-eol-config.sh b/t/t0026-eol-config.sh
index f426a185bb9b32e732c0404d65237f8278435f0e..493b01a0e7c6a01d2c3016f41bc218d1a3c56e96 100755
--- a/t/t0026-eol-config.sh
+++ b/t/t0026-eol-config.sh
@@ -2,7 +2,6 @@
 
 test_description='CRLF conversion'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 has_cr() {
diff --git a/t/t0027-auto-crlf.sh b/t/t0027-auto-crlf.sh
index 2f57c8669cb5af3dd6fc79bfca4b486f50fa4d19..49dbf09da7738646e2614eba1fb0a6169482eae4 100755
--- a/t/t0027-auto-crlf.sh
+++ b/t/t0027-auto-crlf.sh
@@ -2,7 +2,6 @@
 
 test_description='CRLF conversion all combinations'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 compare_files () {
diff --git a/t/t0028-working-tree-encoding.sh b/t/t0028-working-tree-encoding.sh
index 510da4ca12dfbabe6e093baa14c9a1873cacbde3..50b3b4649b614fe39a9e7e0202bd55593d666690 100755
--- a/t/t0028-working-tree-encoding.sh
+++ b/t/t0028-working-tree-encoding.sh
@@ -5,7 +5,6 @@ test_description='working-tree-encoding conversion via gitattributes'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 TEST_CREATE_REPO_NO_TEMPLATE=1
 . ./test-lib.sh
 . "$TEST_DIRECTORY/lib-encoding.sh"
diff --git a/t/t0029-core-unsetenvvars.sh b/t/t0029-core-unsetenvvars.sh
index 4e8e90dd9824b33bd4420423a447decea46e848e..baa1b7e85b10b4a4973f570f5dccf87711bc682d 100755
--- a/t/t0029-core-unsetenvvars.sh
+++ b/t/t0029-core-unsetenvvars.sh
@@ -2,7 +2,6 @@
 
 test_description='test the Windows-only core.unsetenvvars setting'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 if ! test_have_prereq MINGW
diff --git a/t/t0030-stripspace.sh b/t/t0030-stripspace.sh
index f10f42ff1e4a8716609a1e8dd86e1441e020db3d..43155f6bd86bf4c290d066b80b39af2523bfb581 100755
--- a/t/t0030-stripspace.sh
+++ b/t/t0030-stripspace.sh
@@ -5,7 +5,6 @@
 
 test_description='git stripspace'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 t40='A quick brown fox jumps over the lazy do'
diff --git a/t/t0033-safe-directory.sh b/t/t0033-safe-directory.sh
index e97a84764f786769614fd096aa0ef67a12e14a90..e103fe710927ceaa9e04a75dd70f141a86c0a6dc 100755
--- a/t/t0033-safe-directory.sh
+++ b/t/t0033-safe-directory.sh
@@ -2,7 +2,6 @@
 
 test_description='verify safe.directory checks'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 GIT_TEST_ASSUME_DIFFERENT_OWNER=1
diff --git a/t/t0035-safe-bare-repository.sh b/t/t0035-safe-bare-repository.sh
index d3cb2a1cb9edb8f9ad7480be6ec3e02b464046bd..ae7ef092abf6d9abec6aa99cb5bb362cafd091b2 100755
--- a/t/t0035-safe-bare-repository.sh
+++ b/t/t0035-safe-bare-repository.sh
@@ -2,7 +2,6 @@
 
 test_description='verify safe.bareRepository checks'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 pwd="$(pwd)"
diff --git a/t/t0040-parse-options.sh b/t/t0040-parse-options.sh
index 45a773642fd167e9190b9b693a08001bb5939883..2fe3522305f64d0f8366d160d4c03de81c4a210a 100755
--- a/t/t0040-parse-options.sh
+++ b/t/t0040-parse-options.sh
@@ -5,7 +5,6 @@
 
 test_description='our own option parser'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 cat >expect <<\EOF
diff --git a/t/t0041-usage.sh b/t/t0041-usage.sh
index 1464294bd1bfc36d48f06a3ead7826daeb9a745c..a0f6f134c718220e41d9eab8f70158b1c5fb1643 100755
--- a/t/t0041-usage.sh
+++ b/t/t0041-usage.sh
@@ -5,7 +5,6 @@ test_description='Test commands behavior when given invalid argument value'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup ' '
diff --git a/t/t0050-filesystem.sh b/t/t0050-filesystem.sh
index 325eb1c3cd0add75bcaf3b629c2692420c279f8a..5c9dc90d0b096d9f104caedeb035b50b919b6811 100755
--- a/t/t0050-filesystem.sh
+++ b/t/t0050-filesystem.sh
@@ -5,7 +5,6 @@ test_description='Various filesystem issues'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 auml=$(printf '\303\244')
diff --git a/t/t0052-simple-ipc.sh b/t/t0052-simple-ipc.sh
index 1a36a535743c14c29b993d77ed9bf6482c0b16a7..ff98be31a51b360ef917aba97dbda0e53719b58a 100755
--- a/t/t0052-simple-ipc.sh
+++ b/t/t0052-simple-ipc.sh
@@ -2,7 +2,6 @@
 
 test_description='simple command server'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test-tool simple-ipc SUPPORTS_SIMPLE_IPC || {
diff --git a/t/t0055-beyond-symlinks.sh b/t/t0055-beyond-symlinks.sh
index c3eb1158ef9ae2eb10f3f7a6d5c882e41f3c576a..d0740038b8778e6ccb6e10c435cd23a6180ab6db 100755
--- a/t/t0055-beyond-symlinks.sh
+++ b/t/t0055-beyond-symlinks.sh
@@ -2,7 +2,6 @@
 
 test_description='update-index and add refuse to add beyond symlinks'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success SYMLINKS setup '
diff --git a/t/t0056-git-C.sh b/t/t0056-git-C.sh
index 752aa8c945431b909e580f557ef738a455fa8132..2630e756dab7322a5360a67766a648a80a5a7222 100755
--- a/t/t0056-git-C.sh
+++ b/t/t0056-git-C.sh
@@ -2,7 +2,6 @@
 
 test_description='"-C <path>" option and its effects on other path-related options'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success '"git -C <path>" runs git from the directory <path>' '
diff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh
index 0afa3d0d312ca6d1788b76d3b0dfcba04f8397e7..dbb2e73bcd912ae6a804603ff54e4c609966fa5d 100755
--- a/t/t0060-path-utils.sh
+++ b/t/t0060-path-utils.sh
@@ -5,7 +5,6 @@
 
 test_description='Test various path utilities'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 norm_path() {
diff --git a/t/t0061-run-command.sh b/t/t0061-run-command.sh
index 20986b693cfbe8de91552f43daa11be630842f34..76d4936a879afdfcc8961117084174d88da96c26 100755
--- a/t/t0061-run-command.sh
+++ b/t/t0061-run-command.sh
@@ -5,7 +5,6 @@
 
 test_description='Test run command'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 cat >hello-script <<-EOF
diff --git a/t/t0062-revision-walking.sh b/t/t0062-revision-walking.sh
index b9480c8178193e4eba46dd2d581e1aa4eaa5dae6..8e215867b8c197dedef32c569e1d1f632d22b631 100755
--- a/t/t0062-revision-walking.sh
+++ b/t/t0062-revision-walking.sh
@@ -5,7 +5,6 @@
 
 test_description='Test revision walking api'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 cat >run_twice_expected <<-EOF
diff --git a/t/t0063-string-list.sh b/t/t0063-string-list.sh
index 1fee6d90102cc6f9b90786a6324f56e7086b91bf..aac63ba5064b786a29f1390554106eab271013ec 100755
--- a/t/t0063-string-list.sh
+++ b/t/t0063-string-list.sh
@@ -5,7 +5,6 @@
 
 test_description='Test string list functionality'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_split () {
diff --git a/t/t0066-dir-iterator.sh b/t/t0066-dir-iterator.sh
index 7d0a0da8c01b8b69a9d9ca607c55145d96e59ad1..df3e9f5fa5d4b52deb5ecdb25daedc8ed0dc2ec5 100755
--- a/t/t0066-dir-iterator.sh
+++ b/t/t0066-dir-iterator.sh
@@ -2,7 +2,6 @@
 
 test_description='Test the dir-iterator functionality'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t0067-parse_pathspec_file.sh b/t/t0067-parse_pathspec_file.sh
index 0188d0423a0aa246d40b0735a31470f1bb97e8a6..7bab49f361a9bfea7cf72042d60e65b25698e5a9 100755
--- a/t/t0067-parse_pathspec_file.sh
+++ b/t/t0067-parse_pathspec_file.sh
@@ -2,7 +2,6 @@
 
 test_description='Test parse_pathspec_file()'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'one item from stdin' '
diff --git a/t/t0068-for-each-repo.sh b/t/t0068-for-each-repo.sh
index 95019e01ed33289aa025ec729d6b120f4c29f3c7..f2f3e50031291620dde9feef2aa0e2db9acf3c0a 100755
--- a/t/t0068-for-each-repo.sh
+++ b/t/t0068-for-each-repo.sh
@@ -2,7 +2,6 @@
 
 test_description='git for-each-repo builtin'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'run based on configured value' '
diff --git a/t/t0070-fundamental.sh b/t/t0070-fundamental.sh
index 0ecec2ba71116959fd2efceac7fc46683d1a3e91..6b9dcf984bcb546a2a2dae276ae56c3c3d81f0c8 100755
--- a/t/t0070-fundamental.sh
+++ b/t/t0070-fundamental.sh
@@ -6,7 +6,6 @@ test_description='check that the most basic functions work
 Verify wrappers and compatibility functions.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'mktemp to nonexistent directory prints filename' '
diff --git a/t/t0071-sort.sh b/t/t0071-sort.sh
index ba8ad1d1ca0adeee8f001450951ec782e1fc3d74..2236a7e9563ab117876e52e6a6ca9b2d365cc525 100755
--- a/t/t0071-sort.sh
+++ b/t/t0071-sort.sh
@@ -2,7 +2,6 @@
 
 test_description='verify sort functions'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'DEFINE_LIST_SORT_DEBUG' '
diff --git a/t/t0080-unit-test-output.sh b/t/t0080-unit-test-output.sh
index 3c369c88e2a416fa53c8ea8e8af135a26316251a..3db10f095c2edc63e7064e582884dc2553bd9365 100755
--- a/t/t0080-unit-test-output.sh
+++ b/t/t0080-unit-test-output.sh
@@ -2,7 +2,6 @@
 
 test_description='Test the output of the unit test framework'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'TAP output from unit tests' - <<\EOT
diff --git a/t/t0081-find-pack.sh b/t/t0081-find-pack.sh
index 67b11216a3e54185882d176bb59899411ae6666a..5a628bf7356445384ff97f5e55a8d233379bdecb 100755
--- a/t/t0081-find-pack.sh
+++ b/t/t0081-find-pack.sh
@@ -2,7 +2,6 @@
 
 test_description='test `test-tool find-pack`'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t0090-cache-tree.sh b/t/t0090-cache-tree.sh
index d8e2fc42e15c73dfffebba57071b8d3e4bfd1ed1..ab80c9ef1358f0c29d7cdb877c1dd41e0a98e7aa 100755
--- a/t/t0090-cache-tree.sh
+++ b/t/t0090-cache-tree.sh
@@ -6,7 +6,6 @@ Tests whether various commands properly update and/or rewrite the
 cache-tree extension.
 "
 
-TEST_PASSES_SANITIZE_LEAK=true
  . ./test-lib.sh
 
 cmp_cache_tree () {
diff --git a/t/t0091-bugreport.sh b/t/t0091-bugreport.sh
index fca39048fe8840099c2d7a393e91dfd3a6683029..e11d819b62a15087575d639b28be3c64fcd06386 100755
--- a/t/t0091-bugreport.sh
+++ b/t/t0091-bugreport.sh
@@ -2,7 +2,6 @@
 
 test_description='git bugreport'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'create a report' '
diff --git a/t/t0092-diagnose.sh b/t/t0092-diagnose.sh
index 133e5747d613e5ade6ab8bfe67ab46a31021d64e..6cabd6e67b9a141a4ac7839d296189d7e21d35f3 100755
--- a/t/t0092-diagnose.sh
+++ b/t/t0092-diagnose.sh
@@ -2,7 +2,6 @@
 
 test_description='git diagnose'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success UNZIP 'creates diagnostics zip archive' '
diff --git a/t/t0095-bloom.sh b/t/t0095-bloom.sh
index 08df74cacfc6910c51568705855dffa90b79d5be..8f0c3b7325b8bd917934f31e51fc9325be29736b 100755
--- a/t/t0095-bloom.sh
+++ b/t/t0095-bloom.sh
@@ -2,7 +2,6 @@
 
 test_description='Testing the various Bloom filter computations in bloom.c'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'compute unseeded murmur3 hash for empty string' '
diff --git a/t/t0100-previous.sh b/t/t0100-previous.sh
index 70a3223f2199b06833166863e58489ba0f632e59..dd5d9b4e5ebdf26839e091f446f93df8e0c95d8e 100755
--- a/t/t0100-previous.sh
+++ b/t/t0100-previous.sh
@@ -5,7 +5,6 @@ test_description='previous branch syntax @{-n}'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'branch -d @{-1}' '
diff --git a/t/t0101-at-syntax.sh b/t/t0101-at-syntax.sh
index 878aadd64c9517dc1891031bd8bee0b298cfccb6..023b4c6f0b3a0c0007eec8f9673a2645d6029d2f 100755
--- a/t/t0101-at-syntax.sh
+++ b/t/t0101-at-syntax.sh
@@ -2,7 +2,6 @@
 
 test_description='various @{whatever} syntax tests'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t0200-gettext-basic.sh b/t/t0200-gettext-basic.sh
index 522fb2ae696da93e0b8bb8d430f0a4dad6cbd7b3..8853d8afb923e62e5a60d6a52ddcc9a4c6e45aac 100755
--- a/t/t0200-gettext-basic.sh
+++ b/t/t0200-gettext-basic.sh
@@ -5,7 +5,6 @@
 
 test_description='Gettext support for Git'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./lib-gettext.sh
 
 test_expect_success "sanity: \$GIT_INTERNAL_GETTEXT_SH_SCHEME is set (to $GIT_INTERNAL_GETTEXT_SH_SCHEME)" '
diff --git a/t/t0201-gettext-fallbacks.sh b/t/t0201-gettext-fallbacks.sh
index 8724ce1052ddbf23ce421e15562c2416b2ea0ceb..6c74df0dc67e575d171c8ad4a4ab57465b1e622c 100755
--- a/t/t0201-gettext-fallbacks.sh
+++ b/t/t0201-gettext-fallbacks.sh
@@ -8,7 +8,6 @@ test_description='Gettext Shell fallbacks'
 GIT_INTERNAL_GETTEXT_TEST_FALLBACKS=YesPlease
 export GIT_INTERNAL_GETTEXT_TEST_FALLBACKS
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./lib-gettext.sh
 
 test_expect_success "sanity: \$GIT_INTERNAL_GETTEXT_SH_SCHEME is set (to $GIT_INTERNAL_GETTEXT_SH_SCHEME)" '
diff --git a/t/t0202-gettext-perl.sh b/t/t0202-gettext-perl.sh
index 5a6f28051bd275577110ddbba5618f756ca0937e..b15cb65d5d790007aa1a18365f69d873f913b353 100755
--- a/t/t0202-gettext-perl.sh
+++ b/t/t0202-gettext-perl.sh
@@ -5,7 +5,6 @@
 
 test_description='Perl gettext interface (Git::I18N)'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./lib-gettext.sh
 . "$TEST_DIRECTORY"/lib-perl.sh
 skip_all_if_no_Test_More
diff --git a/t/t0203-gettext-setlocale-sanity.sh b/t/t0203-gettext-setlocale-sanity.sh
index 86cff324ff181110cf1ef8a44af6c4295b7f5d40..0ce1f22eff66285ee0da9b1830de961555fbad2b 100755
--- a/t/t0203-gettext-setlocale-sanity.sh
+++ b/t/t0203-gettext-setlocale-sanity.sh
@@ -5,7 +5,6 @@
 
 test_description="The Git C functions aren't broken by setlocale(3)"
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./lib-gettext.sh
 
 test_expect_success 'git show a ISO-8859-1 commit under C locale' '
diff --git a/t/t0204-gettext-reencode-sanity.sh b/t/t0204-gettext-reencode-sanity.sh
index 310a4500125f4a0d18f6c68a10cf1e8fe7d3beff..28d92bb9b7cade291d2dacbce893afdd6543c94e 100755
--- a/t/t0204-gettext-reencode-sanity.sh
+++ b/t/t0204-gettext-reencode-sanity.sh
@@ -5,7 +5,6 @@
 
 test_description="Gettext reencoding of our *.po/*.mo files works"
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./lib-gettext.sh
 
 # The constants used in a tricky observation for undefined behaviour
diff --git a/t/t0210-trace2-normal.sh b/t/t0210-trace2-normal.sh
index b9adc94aab41650da73e5541bc4666102e4baad5..eff9a59dbd0d5d865dff434fd7860cb1070100af 100755
--- a/t/t0210-trace2-normal.sh
+++ b/t/t0210-trace2-normal.sh
@@ -2,7 +2,6 @@
 
 test_description='test trace2 facility (normal target)'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # Turn off any inherited trace2 settings for this test.
diff --git a/t/t0211-trace2-perf.sh b/t/t0211-trace2-perf.sh
index 91260ce97e5bdb39550a9e1e4abbc4d5fea48a21..bac90465406d94743236024c20dbfdaf78782471 100755
--- a/t/t0211-trace2-perf.sh
+++ b/t/t0211-trace2-perf.sh
@@ -2,7 +2,6 @@
 
 test_description='test trace2 facility (perf target)'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # Turn off any inherited trace2 settings for this test.
diff --git a/t/t0212-trace2-event.sh b/t/t0212-trace2-event.sh
index 147643d582643efebf794000fa48e3d460c76173..1211db9f4687176810395d6fb28416612d7bc927 100755
--- a/t/t0212-trace2-event.sh
+++ b/t/t0212-trace2-event.sh
@@ -2,7 +2,6 @@
 
 test_description='test trace2 facility'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # Turn off any inherited trace2 settings for this test.
diff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh
index 6a76b7fdbd4557b2df8e34f9683323cf8073ea38..17952e52d69bfcad54faf3feafec324e0ac0825b 100755
--- a/t/t0300-credentials.sh
+++ b/t/t0300-credentials.sh
@@ -2,7 +2,6 @@
 
 test_description='basic credential helper tests'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-credential.sh
 
diff --git a/t/t0301-credential-cache.sh b/t/t0301-credential-cache.sh
index 5d5b64205ffe35dfd74750b3188946200aab916e..dc30289f7539ee7ec8dac98be814f09472c23822 100755
--- a/t/t0301-credential-cache.sh
+++ b/t/t0301-credential-cache.sh
@@ -2,7 +2,6 @@
 
 test_description='credential-cache tests'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-credential.sh
 
diff --git a/t/t0302-credential-store.sh b/t/t0302-credential-store.sh
index f83db659e2581444b9a9740df8cefd7fb530c359..c1cd60edd019a07128b130336f53d1a46d44baf6 100755
--- a/t/t0302-credential-store.sh
+++ b/t/t0302-credential-store.sh
@@ -2,7 +2,6 @@
 
 test_description='credential-store tests'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-credential.sh
 
diff --git a/t/t0303-credential-external.sh b/t/t0303-credential-external.sh
index 8aadbe86c458560f1e23811db10679c806c5a324..72ae405c3ed979edee54cbe83e73ec566d23f6d1 100755
--- a/t/t0303-credential-external.sh
+++ b/t/t0303-credential-external.sh
@@ -29,7 +29,6 @@ you can set GIT_TEST_CREDENTIAL_HELPER_SETUP to a sequence of shell
 commands.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-credential.sh
 
diff --git a/t/t0410-partial-clone.sh b/t/t0410-partial-clone.sh
index 818700fbecd457a9fbb7cc3bb91984c1224631d5..34bdb3ab1f23b70115a47bb7b5bb01fb57beae8f 100755
--- a/t/t0410-partial-clone.sh
+++ b/t/t0410-partial-clone.sh
@@ -2,7 +2,6 @@
 
 test_description='partial clone'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-terminal.sh
 
diff --git a/t/t0411-clone-from-partial.sh b/t/t0411-clone-from-partial.sh
index 932bf2067daaeb88de744762f2cdbc0b59c8b565..c98d5018695a137b57cc9634312f220cff897cce 100755
--- a/t/t0411-clone-from-partial.sh
+++ b/t/t0411-clone-from-partial.sh
@@ -2,7 +2,6 @@
 
 test_description='check that local clone does not fetch from promisor remotes'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'create evil repo' '
diff --git a/t/t0450-txt-doc-vs-help.sh b/t/t0450-txt-doc-vs-help.sh
index f99a69ae1b74a91defa88ed74062fd13d29c2bad..853101b86ef53d8a1f6e31c45906496ca09d9cbb 100755
--- a/t/t0450-txt-doc-vs-help.sh
+++ b/t/t0450-txt-doc-vs-help.sh
@@ -5,7 +5,6 @@ test_description='assert (unbuilt) Documentation/*.txt and -h output
 Run this with --debug to see a summary of where we still fail to make
 the two versions consistent with one another.'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup: list of builtins' '
diff --git a/t/t0500-progress-display.sh b/t/t0500-progress-display.sh
index 1eb3a8306ba15b3e782b940f605afa8ec551ec8c..d1a498a216fb522eefa57ac7cb2c63d0ebc21f47 100755
--- a/t/t0500-progress-display.sh
+++ b/t/t0500-progress-display.sh
@@ -2,7 +2,6 @@
 
 test_description='progress display'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 show_cr () {
diff --git a/t/t0600-reffiles-backend.sh b/t/t0600-reffiles-backend.sh
index bef2b70871364931ab8b3ead950f59d11b6fe216..1e62c791d97250f081842c86316985bee0f7a940 100755
--- a/t/t0600-reffiles-backend.sh
+++ b/t/t0600-reffiles-backend.sh
@@ -7,7 +7,6 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 GIT_TEST_DEFAULT_REF_FORMAT=files
 export GIT_TEST_DEFAULT_REF_FORMAT
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t0601-reffiles-pack-refs.sh b/t/t0601-reffiles-pack-refs.sh
index d8cbd3f202b5f00c9a94c5a2ea2dced6606b6f4d..aa7f6ecd813c44d4db8f9f6dc41f297742b2377e 100755
--- a/t/t0601-reffiles-pack-refs.sh
+++ b/t/t0601-reffiles-pack-refs.sh
@@ -15,7 +15,6 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 GIT_TEST_DEFAULT_REF_FORMAT=files
 export GIT_TEST_DEFAULT_REF_FORMAT
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'enable reflogs' '
diff --git a/t/t0602-reffiles-fsck.sh b/t/t0602-reffiles-fsck.sh
index 71a4d1a5ae4bab3dcca3a8ecc1060cb2f360ab30..30e0a36242e2f280b9384438e52199d327028639 100755
--- a/t/t0602-reffiles-fsck.sh
+++ b/t/t0602-reffiles-fsck.sh
@@ -6,7 +6,6 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 GIT_TEST_DEFAULT_REF_FORMAT=files
 export GIT_TEST_DEFAULT_REF_FORMAT
-TEST_PASSES_SANITIZE_LEAK=true
 
 . ./test-lib.sh
 
diff --git a/t/t0610-reftable-basics.sh b/t/t0610-reftable-basics.sh
index babec7993e3f3ec1dc2a72b13fce797766765cfe..67bf3a82f6eb531b6791a294baf0194f139bdf47 100755
--- a/t/t0610-reftable-basics.sh
+++ b/t/t0610-reftable-basics.sh
@@ -10,7 +10,6 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 GIT_TEST_DEFAULT_REF_FORMAT=reftable
 export GIT_TEST_DEFAULT_REF_FORMAT
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 INVALID_OID=$(test_oid 001)
diff --git a/t/t0611-reftable-httpd.sh b/t/t0611-reftable-httpd.sh
index 2805995cc8c6980b6e8477c21e21987254e5e3e0..5e05b9c1f2ac73deac78ce6fa91e60cb377a3c68 100755
--- a/t/t0611-reftable-httpd.sh
+++ b/t/t0611-reftable-httpd.sh
@@ -2,7 +2,6 @@
 
 test_description='reftable HTTPD tests'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-httpd.sh
 
diff --git a/t/t0612-reftable-jgit-compatibility.sh b/t/t0612-reftable-jgit-compatibility.sh
index 84922153ab6a6d1aca3ce79d42a290a3899b372a..d0d7e80b492091d1949467f9835c35f622ae0bb4 100755
--- a/t/t0612-reftable-jgit-compatibility.sh
+++ b/t/t0612-reftable-jgit-compatibility.sh
@@ -11,7 +11,6 @@ export GIT_TEST_DEFAULT_REF_FORMAT
 GIT_TEST_SPLIT_INDEX=0
 export GIT_TEST_SPLIT_INDEX
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 if ! test_have_prereq JGIT
diff --git a/t/t0613-reftable-write-options.sh b/t/t0613-reftable-write-options.sh
index b1c6c97524f16cb5ba15cf814ff8f959e4cb0c80..e2708e11d5b941cf707d3c22466e4cc6957d0302 100755
--- a/t/t0613-reftable-write-options.sh
+++ b/t/t0613-reftable-write-options.sh
@@ -16,7 +16,6 @@ export GIT_TEST_DEFAULT_HASH
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'default write options' '
diff --git a/t/t1000-read-tree-m-3way.sh b/t/t1000-read-tree-m-3way.sh
index 0e8c0dfbbee643c80d2164b6dc8e80fe6522f2e0..b9dd21cfb6b1d51d1862ef3c6ad80f3496b04694 100755
--- a/t/t1000-read-tree-m-3way.sh
+++ b/t/t1000-read-tree-m-3way.sh
@@ -72,7 +72,6 @@ In addition:
 
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-read-tree.sh
 . "$TEST_DIRECTORY"/lib-read-tree-m-3way.sh
diff --git a/t/t1001-read-tree-m-2way.sh b/t/t1001-read-tree-m-2way.sh
index 48a1550371a14b8f92d72ac59efd463b229afb88..4a88bb9ef0c4012fc829c1d537c53747f67c05bb 100755
--- a/t/t1001-read-tree-m-2way.sh
+++ b/t/t1001-read-tree-m-2way.sh
@@ -21,7 +21,6 @@ In the test, these paths are used:
 	yomin   - not in H or M
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-read-tree.sh
 
diff --git a/t/t1002-read-tree-m-u-2way.sh b/t/t1002-read-tree-m-u-2way.sh
index a7c2ed0d7c0a31180e6af1abe9dcc6366e62e2c5..df6ef53725878015850c5ac55caf38829a55b242 100755
--- a/t/t1002-read-tree-m-u-2way.sh
+++ b/t/t1002-read-tree-m-u-2way.sh
@@ -9,7 +9,6 @@ This is identical to t1001, but uses -u to update the work tree as well.
 
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-read-tree.sh
 
diff --git a/t/t1003-read-tree-prefix.sh b/t/t1003-read-tree-prefix.sh
index c860c08ecb46a37a6f20bf403963afd7576fed9f..66e2bf4aec3d7a24bfd846e1125ae94bfdce5c74 100755
--- a/t/t1003-read-tree-prefix.sh
+++ b/t/t1003-read-tree-prefix.sh
@@ -6,7 +6,6 @@
 test_description='git read-tree --prefix test.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t1004-read-tree-m-u-wf.sh b/t/t1004-read-tree-m-u-wf.sh
index 2b9720b0feb465bb9c4651626c43829ec27cd7b8..11bf10424f16208cda726c612cb64bfc89d9c803 100755
--- a/t/t1004-read-tree-m-u-wf.sh
+++ b/t/t1004-read-tree-m-u-wf.sh
@@ -5,7 +5,6 @@ test_description='read-tree -m -u checks working tree files'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-read-tree.sh
 
diff --git a/t/t1005-read-tree-reset.sh b/t/t1005-read-tree-reset.sh
index 26be4a2b5a007afa7ef1a9bd4438d16173c6aad5..6b5033d0ce3b3489598f0f1fba5b047bd3e5b43a 100755
--- a/t/t1005-read-tree-reset.sh
+++ b/t/t1005-read-tree-reset.sh
@@ -2,7 +2,6 @@
 
 test_description='read-tree -u --reset'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-read-tree.sh
 
diff --git a/t/t1006-cat-file.sh b/t/t1006-cat-file.sh
index d36cd7c0863591d197cfc3ef340972943ff40e6f..ff9bf213aa2c73e42ab82d9b227fbbb7049c1e43 100755
--- a/t/t1006-cat-file.sh
+++ b/t/t1006-cat-file.sh
@@ -2,7 +2,6 @@
 
 test_description='git cat-file'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_cmdmode_usage () {
diff --git a/t/t1007-hash-object.sh b/t/t1007-hash-object.sh
index d73a5cc23705e2b697d56f961b27a6815725f8c4..a0481139de5519bf65a3320f21dfd72e97a4f6f5 100755
--- a/t/t1007-hash-object.sh
+++ b/t/t1007-hash-object.sh
@@ -2,7 +2,6 @@
 
 test_description="git hash-object"
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 echo_without_newline() {
diff --git a/t/t1008-read-tree-overlay.sh b/t/t1008-read-tree-overlay.sh
index ad5936e54d1f73ed46c1066600f273f0847ca673..4512fb0b6e68b4ac12e54610441fe1f2de89ea0c 100755
--- a/t/t1008-read-tree-overlay.sh
+++ b/t/t1008-read-tree-overlay.sh
@@ -5,7 +5,6 @@ test_description='test multi-tree read-tree without merging'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-read-tree.sh
 
diff --git a/t/t1009-read-tree-new-index.sh b/t/t1009-read-tree-new-index.sh
index fc179ac5dd604a085c9a19a491f0abb7ac4c066f..2935f68f8d215203ee1d2a9813de0039a89cb58f 100755
--- a/t/t1009-read-tree-new-index.sh
+++ b/t/t1009-read-tree-new-index.sh
@@ -5,7 +5,6 @@ test_description='test read-tree into a fresh index file'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t1010-mktree.sh b/t/t1010-mktree.sh
index 22875ba598c2a82bba6c7504c420c690441f7167..c291a2b33d79b7af79b4039cf41a0d9dd1e2bc17 100755
--- a/t/t1010-mktree.sh
+++ b/t/t1010-mktree.sh
@@ -2,7 +2,6 @@
 
 test_description='git mktree'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t1011-read-tree-sparse-checkout.sh b/t/t1011-read-tree-sparse-checkout.sh
index 595b24c0adb3081230fe65884fd436e1f12896d4..742f0fa909fd6e8a7fe2b376b3e5083a30d71c73 100755
--- a/t/t1011-read-tree-sparse-checkout.sh
+++ b/t/t1011-read-tree-sparse-checkout.sh
@@ -12,7 +12,6 @@ test_description='sparse checkout tests
 '
 
 TEST_CREATE_REPO_NO_TEMPLATE=1
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-read-tree.sh
 
diff --git a/t/t1012-read-tree-df.sh b/t/t1012-read-tree-df.sh
index cde93d22cde4ab09fe9fa594a58813f1d3f276af..57f0770df1410ea2005d8637323ff0eeeb82d880 100755
--- a/t/t1012-read-tree-df.sh
+++ b/t/t1012-read-tree-df.sh
@@ -2,7 +2,6 @@
 
 test_description='read-tree D/F conflict corner cases'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-read-tree.sh
 
diff --git a/t/t1013-read-tree-submodule.sh b/t/t1013-read-tree-submodule.sh
index cf8b94ebedbdd2ce780550d6217e7223bcf20d8b..bfc90d4cf272e8a8d6b6d517787bed0f074f4e82 100755
--- a/t/t1013-read-tree-submodule.sh
+++ b/t/t1013-read-tree-submodule.sh
@@ -2,7 +2,6 @@
 
 test_description='read-tree can handle submodules'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-submodule-update.sh
 
diff --git a/t/t1014-read-tree-confusing.sh b/t/t1014-read-tree-confusing.sh
index 8ea8d36818bea10b227640b4974cc57f2157fa2e..0c0e6da5cf5b20d7e0b5bb5267d4d08f655055ba 100755
--- a/t/t1014-read-tree-confusing.sh
+++ b/t/t1014-read-tree-confusing.sh
@@ -2,7 +2,6 @@
 
 test_description='check that read-tree rejects confusing paths'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'create base tree' '
diff --git a/t/t1015-read-index-unmerged.sh b/t/t1015-read-index-unmerged.sh
index da737a32a271185882b6f1fb6b190e7e82d90a48..9b965d0294309f947339111a91a67e885972a6c3 100755
--- a/t/t1015-read-index-unmerged.sh
+++ b/t/t1015-read-index-unmerged.sh
@@ -2,7 +2,6 @@
 
 test_description='Test various callers of read_index_unmerged'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup modify/delete + directory/file conflict' '
diff --git a/t/t1016-compatObjectFormat.sh b/t/t1016-compatObjectFormat.sh
index 8341a2fe8395a0ed41d46e442ddf3b2df465bd1e..5641271b23a445c12292de5242a499c2f178ded9 100755
--- a/t/t1016-compatObjectFormat.sh
+++ b/t/t1016-compatObjectFormat.sh
@@ -5,7 +5,6 @@
 
 test_description='Test how well compatObjectFormat works'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-gpg.sh
 
diff --git a/t/t1020-subdirectory.sh b/t/t1020-subdirectory.sh
index 45eef9457fe13d9eef6e463405190ca84c67bda5..9fdbb2af80e0a82429289d06b24d4dcfac3f263d 100755
--- a/t/t1020-subdirectory.sh
+++ b/t/t1020-subdirectory.sh
@@ -6,7 +6,6 @@
 test_description='Try various core-level commands in subdirectory.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-read-tree.sh
 
diff --git a/t/t1021-rerere-in-workdir.sh b/t/t1021-rerere-in-workdir.sh
index 69bf9476cbf65dc39ac6460774938773424b61cf..0b892894eb9031d88aa26cf43fc09235a2aa07bc 100755
--- a/t/t1021-rerere-in-workdir.sh
+++ b/t/t1021-rerere-in-workdir.sh
@@ -4,7 +4,6 @@ test_description='rerere run in a workdir'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success SYMLINKS setup '
diff --git a/t/t1022-read-tree-partial-clone.sh b/t/t1022-read-tree-partial-clone.sh
index cca4380e4319a024416c4bbe2e097f63e409af48..d390d7d5f857bb3c755d0c0d385e9045a754887c 100755
--- a/t/t1022-read-tree-partial-clone.sh
+++ b/t/t1022-read-tree-partial-clone.sh
@@ -3,7 +3,6 @@
 test_description='git read-tree in partial clones'
 
 TEST_NO_CREATE_REPO=1
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'read-tree in partial clone prefetches in one batch' '
diff --git a/t/t1050-large.sh b/t/t1050-large.sh
index ed638f664479bd1abfca19b985aeaaff66452f18..c71932b02423734908428a9b2be776fec229ce9e 100755
--- a/t/t1050-large.sh
+++ b/t/t1050-large.sh
@@ -3,7 +3,6 @@
 
 test_description='adding and checking out large blobs'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'core.bigFileThreshold must be non-negative' '
diff --git a/t/t1051-large-conversion.sh b/t/t1051-large-conversion.sh
index f6709c9f569ec7170d24694b369abf0d6f8518ec..361afb679b0af752d1be91d29b9b42a7c6a6992d 100755
--- a/t/t1051-large-conversion.sh
+++ b/t/t1051-large-conversion.sh
@@ -2,7 +2,6 @@
 
 test_description='test conversion filters on large files'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 set_attr() {
diff --git a/t/t1060-object-corruption.sh b/t/t1060-object-corruption.sh
index 5e0f0a334f4d43dd76199a50037c5900da2cb63b..502a5ea1c51e3ac808297148e1e2c27ec9784549 100755
--- a/t/t1060-object-corruption.sh
+++ b/t/t1060-object-corruption.sh
@@ -2,7 +2,6 @@
 
 test_description='see how we handle various forms of corruption'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # convert "1234abcd" to ".git/objects/12/34abcd"
diff --git a/t/t1090-sparse-checkout-scope.sh b/t/t1090-sparse-checkout-scope.sh
index da0e7714d5ac5c94a04e7aa100288ef85f42a860..3a14218b245d4cf67f9bdde4c18a7eee8ac6524a 100755
--- a/t/t1090-sparse-checkout-scope.sh
+++ b/t/t1090-sparse-checkout-scope.sh
@@ -6,7 +6,6 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
 TEST_CREATE_REPO_NO_TEMPLATE=1
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t1091-sparse-checkout-builtin.sh b/t/t1091-sparse-checkout-builtin.sh
index 8c5cd651b4b80ba05ab9fab572e384806a8404dd..ab3a105ffff2532b35074611de9e65d60b8db082 100755
--- a/t/t1091-sparse-checkout-builtin.sh
+++ b/t/t1091-sparse-checkout-builtin.sh
@@ -8,7 +8,6 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 GIT_TEST_SPLIT_INDEX=false
 export GIT_TEST_SPLIT_INDEX
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 list_files() {
diff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh
index 2157f37da36fd61b6cfac3d09d3e01643bd1e6e4..a4c7c41fc00aa3043c3f18fdc4c5d7785d17f7de 100755
--- a/t/t1092-sparse-checkout-compatibility.sh
+++ b/t/t1092-sparse-checkout-compatibility.sh
@@ -5,7 +5,6 @@ test_description='compare full workdir to sparse workdir'
 GIT_TEST_SPLIT_INDEX=0
 GIT_TEST_SPARSE_INDEX=
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t1100-commit-tree-options.sh b/t/t1100-commit-tree-options.sh
index 0f37a43fd3c5b2638fe41408a3860ce2facd6401..ae66ba5babf347f12f2c4cb213b0de72ea980da2 100755
--- a/t/t1100-commit-tree-options.sh
+++ b/t/t1100-commit-tree-options.sh
@@ -12,7 +12,6 @@ Also make sure that command line parser understands the normal
 "flags first and then non flag arguments" command line.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 cat >expected <<EOF
diff --git a/t/t1300-config.sh b/t/t1300-config.sh
index f13277c8f3e3c410aecd3aea9141323c0398058e..51a85e83c27b1300f29354b35a13726687b23997 100755
--- a/t/t1300-config.sh
+++ b/t/t1300-config.sh
@@ -8,7 +8,6 @@ test_description='Test git config in different settings'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 for mode in legacy subcommands
diff --git a/t/t1301-shared-repo.sh b/t/t1301-shared-repo.sh
index 29cf8a966133a7851722c8cdf828fe3c524a12ec..630a47af21e6558f1d3c9985411a603aaaab5ec0 100755
--- a/t/t1301-shared-repo.sh
+++ b/t/t1301-shared-repo.sh
@@ -9,7 +9,6 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
 TEST_CREATE_REPO_NO_TEMPLATE=1
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # Remove a default ACL from the test dir if possible.
diff --git a/t/t1302-repo-version.sh b/t/t1302-repo-version.sh
index 42caa0d2978b58755d43b3361589c6e7691c34db..69723b88ff896130832c5081721c2393702f61ed 100755
--- a/t/t1302-repo-version.sh
+++ b/t/t1302-repo-version.sh
@@ -5,7 +5,6 @@
 
 test_description='Test repository version check'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t1303-wacky-config.sh b/t/t1303-wacky-config.sh
index 0506f3d6bba6cb64255a1b7685481b8ccdb7784d..d971925ed021ccd38db89843bff19727fe823367 100755
--- a/t/t1303-wacky-config.sh
+++ b/t/t1303-wacky-config.sh
@@ -2,7 +2,6 @@
 
 test_description='Test wacky input to git config'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # Leaving off the newline is intentional!
diff --git a/t/t1304-default-acl.sh b/t/t1304-default-acl.sh
index 31b89dd9693afc95f30e0bb9e11dc704fda24b41..c69ae41306c90d33b2ac253a25961ae76fec81e7 100755
--- a/t/t1304-default-acl.sh
+++ b/t/t1304-default-acl.sh
@@ -9,7 +9,6 @@ test_description='Test repository with default ACL'
 # => this must come before . ./test-lib.sh
 umask 077
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # We need an arbitrary other user give permission to using ACLs. root
diff --git a/t/t1305-config-include.sh b/t/t1305-config-include.sh
index 517d6c869379bfdeef61a4c346d1e05fb7f55d99..8ff2b0c232b485a2d5225c30a9f75170c5bea952 100755
--- a/t/t1305-config-include.sh
+++ b/t/t1305-config-include.sh
@@ -1,7 +1,6 @@
 #!/bin/sh
 
 test_description='test config file include directives'
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # Force setup_explicit_git_dir() to run until the end. This is needed
diff --git a/t/t1306-xdg-files.sh b/t/t1306-xdg-files.sh
index 53e5b290b9bcab0d8809e34f4343f191af4ed9dc..40d3c42618c04f8b0e656af83fb2e303601dd7ff 100755
--- a/t/t1306-xdg-files.sh
+++ b/t/t1306-xdg-files.sh
@@ -7,7 +7,6 @@
 
 test_description='Compatibility with $XDG_CONFIG_HOME/git/ files'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'read config: xdg file exists and ~/.gitconfig doesn'\''t' '
diff --git a/t/t1307-config-blob.sh b/t/t1307-config-blob.sh
index b9852fe40e4a045ae4a355a85aa6e2d14d758479..5cb546dd00c665b015f4002b21d50b8a7104ab79 100755
--- a/t/t1307-config-blob.sh
+++ b/t/t1307-config-blob.sh
@@ -2,7 +2,6 @@
 
 test_description='support for reading config from a blob'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'create config blob' '
diff --git a/t/t1308-config-set.sh b/t/t1308-config-set.sh
index 3bfec07f1abcc1d997f428e84acf6cc3490b1b6a..e0e49053f07fbcdad817cf084fcd1328793302cb 100755
--- a/t/t1308-config-set.sh
+++ b/t/t1308-config-set.sh
@@ -2,7 +2,6 @@
 
 test_description='Test git config-set API in different settings'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # 'check_config get_* section.key value' verifies that the entry for
diff --git a/t/t1309-early-config.sh b/t/t1309-early-config.sh
index 523aa99a1e264661c9af03e450ff14c345831617..9710ee0ca4571dd578575ee1a08ede9afec6819e 100755
--- a/t/t1309-early-config.sh
+++ b/t/t1309-early-config.sh
@@ -2,7 +2,6 @@
 
 test_description='Test read_early_config()'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'read early config' '
diff --git a/t/t1310-config-default.sh b/t/t1310-config-default.sh
index 1a90d31201a612b69944bffba27b347eeb0ab580..69e64c6c8686fb17fb24616bd7cb6fc2992cc9fa 100755
--- a/t/t1310-config-default.sh
+++ b/t/t1310-config-default.sh
@@ -2,7 +2,6 @@
 
 test_description='Test git config in different settings (with --default)'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'uses --default when entry missing' '
diff --git a/t/t1350-config-hooks-path.sh b/t/t1350-config-hooks-path.sh
index ceeb7ac3a4745fd817dc601da93b836260fcf51a..45a04929170640b1fa673f88614728b449c43887 100755
--- a/t/t1350-config-hooks-path.sh
+++ b/t/t1350-config-hooks-path.sh
@@ -2,7 +2,6 @@
 
 test_description='Test the core.hooksPath configuration variable'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'set up a pre-commit hook in core.hooksPath' '
diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh
index bb057596f1e05abe4e0fa561a7eb1c1d087b91a1..e2316f1dd4c200df790ac639540d196df5c70c7b 100755
--- a/t/t1400-update-ref.sh
+++ b/t/t1400-update-ref.sh
@@ -5,7 +5,6 @@
 
 test_description='Test git update-ref and basic ref logging'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 Z=$ZERO_OID
diff --git a/t/t1401-symbolic-ref.sh b/t/t1401-symbolic-ref.sh
index 90af3f955c018bd86807c2756f142968242e8ca5..a2a7e947164c2a304ce588a4433cca07a98e9469 100755
--- a/t/t1401-symbolic-ref.sh
+++ b/t/t1401-symbolic-ref.sh
@@ -2,7 +2,6 @@
 
 test_description='basic symbolic-ref tests'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # If the tests munging HEAD fail, they can break detection of
diff --git a/t/t1402-check-ref-format.sh b/t/t1402-check-ref-format.sh
index 5ed9d7318e0cc97435952039c7e8c1af842a24a9..cabc516ae9a4fa1c404c245f4b3b9efd7e93200e 100755
--- a/t/t1402-check-ref-format.sh
+++ b/t/t1402-check-ref-format.sh
@@ -2,7 +2,6 @@
 
 test_description='Test git check-ref-format'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 valid_ref() {
diff --git a/t/t1403-show-ref.sh b/t/t1403-show-ref.sh
index 403f6b8f7daf00353cf741450c3390331ae40647..9d698b3cc35a7f13f30c36a0d8fe7b5ed1430b07 100755
--- a/t/t1403-show-ref.sh
+++ b/t/t1403-show-ref.sh
@@ -4,7 +4,6 @@ test_description='show-ref'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t1404-update-ref-errors.sh b/t/t1404-update-ref-errors.sh
index df90112618c10681f887222ef9890c28c6c27bc8..28e6c380d76db10d313868b140eae6c4c1597c7e 100755
--- a/t/t1404-update-ref-errors.sh
+++ b/t/t1404-update-ref-errors.sh
@@ -2,7 +2,6 @@
 
 test_description='Test git update-ref error handling'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # Create some references, perhaps run pack-refs --all, then try to
diff --git a/t/t1405-main-ref-store.sh b/t/t1405-main-ref-store.sh
index a6bcd62ab658eefcd11ae1778692ad6d7f4c3008..6d8f401a2a98271e2cbd9c6a515c10044b53ce22 100755
--- a/t/t1405-main-ref-store.sh
+++ b/t/t1405-main-ref-store.sh
@@ -5,7 +5,6 @@ test_description='test main ref store api'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 RUN="test-tool ref-store main"
diff --git a/t/t1406-submodule-ref-store.sh b/t/t1406-submodule-ref-store.sh
index c01f0f14a1266f93f9066c738693d7c8a9a526dc..9b9e5d0766f38da19e4b532a003b7559efb28676 100755
--- a/t/t1406-submodule-ref-store.sh
+++ b/t/t1406-submodule-ref-store.sh
@@ -5,7 +5,6 @@ test_description='test submodule ref store api'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 RUN="test-tool ref-store submodule:sub"
diff --git a/t/t1407-worktree-ref-store.sh b/t/t1407-worktree-ref-store.sh
index 48b1c92a41450b25645d6cd782aa86c8e630164b..9d8e1a13432b8344088cb3282b22aa2e9240ec89 100755
--- a/t/t1407-worktree-ref-store.sh
+++ b/t/t1407-worktree-ref-store.sh
@@ -5,7 +5,6 @@ test_description='test worktree ref store api'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 RWT="test-tool ref-store worktree:wt"
diff --git a/t/t1408-packed-refs.sh b/t/t1408-packed-refs.sh
index 9469c79a585f051177a4c9223c0e0f9fd37124dd..41ba1f1d7fca94e9504e0c198b2e1f7885c41185 100755
--- a/t/t1408-packed-refs.sh
+++ b/t/t1408-packed-refs.sh
@@ -5,7 +5,6 @@ test_description='packed-refs entries are covered by loose refs'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t1409-avoid-packing-refs.sh b/t/t1409-avoid-packing-refs.sh
index 7748973733e6adab07117192accabf7698189681..e3c501848a494c6ff11caaa6044cefae08e1dbc0 100755
--- a/t/t1409-avoid-packing-refs.sh
+++ b/t/t1409-avoid-packing-refs.sh
@@ -2,7 +2,6 @@
 
 test_description='avoid rewriting packed-refs unnecessarily'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 if test_have_prereq !REFFILES
diff --git a/t/t1410-reflog.sh b/t/t1410-reflog.sh
index 246a3f46abafdf0e24528be59b33a4987ff791c1..388fdf9ae57dac4ed7d568e8043e090a445632cc 100755
--- a/t/t1410-reflog.sh
+++ b/t/t1410-reflog.sh
@@ -7,7 +7,6 @@ test_description='Test prune and reflog expiration'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 check_have () {
diff --git a/t/t1411-reflog-show.sh b/t/t1411-reflog-show.sh
index da581ec19ac619cef717a4a3b4dc34f55c0142b8..975c4ea83a877b2dfaf6059c320c71c0282fee0c 100755
--- a/t/t1411-reflog-show.sh
+++ b/t/t1411-reflog-show.sh
@@ -4,7 +4,6 @@ test_description='Test reflog display routines'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t1412-reflog-loop.sh b/t/t1412-reflog-loop.sh
index ff30874f940439fe979e3857400c54b944194dcb..f7d69b66ff33e8c23b858d58d0473e6f672f5c9f 100755
--- a/t/t1412-reflog-loop.sh
+++ b/t/t1412-reflog-loop.sh
@@ -2,7 +2,6 @@
 
 test_description='reflog walk shows repeated commits again'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup commits' '
diff --git a/t/t1413-reflog-detach.sh b/t/t1413-reflog-detach.sh
index d2a4822d46fd05c45273f48b0caf48cadb2a07f1..934688a1ee82e29f2552bb2444eb06626fe254f8 100755
--- a/t/t1413-reflog-detach.sh
+++ b/t/t1413-reflog-detach.sh
@@ -4,7 +4,6 @@ test_description='Test reflog interaction with detached HEAD'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 reset_state () {
diff --git a/t/t1414-reflog-walk.sh b/t/t1414-reflog-walk.sh
index 49d28166da0d93095988c959ad87842e17cc9860..be6c3f472c176525b64383b726ad7b05b664accd 100755
--- a/t/t1414-reflog-walk.sh
+++ b/t/t1414-reflog-walk.sh
@@ -4,7 +4,6 @@ test_description='various tests of reflog walk (log -g) behavior'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'set up some reflog entries' '
diff --git a/t/t1415-worktree-refs.sh b/t/t1415-worktree-refs.sh
index eb4eec8becbfa64efcde4e866334363a866c01a2..51d79bae83b429378db2ebabc628719053d831e0 100755
--- a/t/t1415-worktree-refs.sh
+++ b/t/t1415-worktree-refs.sh
@@ -2,7 +2,6 @@
 
 test_description='per-worktree refs'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t1416-ref-transaction-hooks.sh b/t/t1416-ref-transaction-hooks.sh
index 5a812ca3c0b5d3f7de60dc999de6aafaf1f384a6..dd003a196f718b7c5ee5f85be41f74ef7d538c32 100755
--- a/t/t1416-ref-transaction-hooks.sh
+++ b/t/t1416-ref-transaction-hooks.sh
@@ -5,7 +5,6 @@ test_description='reference transaction hooks'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t1417-reflog-updateref.sh b/t/t1417-reflog-updateref.sh
index 0eb5e674bc1f0dbc688523dd3f94a5e5bb32b6d7..2f37402536743e164f6cc452afeec58a307e87cb 100755
--- a/t/t1417-reflog-updateref.sh
+++ b/t/t1417-reflog-updateref.sh
@@ -2,7 +2,6 @@
 
 test_description='git reflog --updateref'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t1418-reflog-exists.sh b/t/t1418-reflog-exists.sh
index 2268bca3c11ac8e2d73e3a399b8debc44fc712cb..d51ecd5e9250f004e0b0c894b308172237e5666c 100755
--- a/t/t1418-reflog-exists.sh
+++ b/t/t1418-reflog-exists.sh
@@ -4,7 +4,6 @@ test_description='Test reflog display routines'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t1419-exclude-refs.sh b/t/t1419-exclude-refs.sh
index 3256e4462f96db6f45f953ddc4473a6ba05213df..c04eeb72111662a607479f78f496ce36e75e9f51 100755
--- a/t/t1419-exclude-refs.sh
+++ b/t/t1419-exclude-refs.sh
@@ -5,7 +5,6 @@ test_description='test exclude_patterns functionality in main ref store'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 for_each_ref__exclude () {
diff --git a/t/t1420-lost-found.sh b/t/t1420-lost-found.sh
index dbe15a0be1051608c4dc6dd727e1589e9422b7b5..2fb2f44f021ea36eb2f1601ba07974a041f19661 100755
--- a/t/t1420-lost-found.sh
+++ b/t/t1420-lost-found.sh
@@ -5,7 +5,6 @@
 
 test_description='Test fsck --lost-found'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t1430-bad-ref-name.sh b/t/t1430-bad-ref-name.sh
index 0c00118c2b3f798777bad27a7082e5c0a2f29ea4..3ab65f72cdec882c8fab9079599e4fd55c1d1774 100755
--- a/t/t1430-bad-ref-name.sh
+++ b/t/t1430-bad-ref-name.sh
@@ -4,7 +4,6 @@ test_description='Test handling of ref names that check-ref-format rejects'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh
index 280cbf3e031e1ab67ed28aa2af4c3b105b7d254e..8a456b1142d1cc463f97c5e8809bcfc83ffa1e96 100755
--- a/t/t1450-fsck.sh
+++ b/t/t1450-fsck.sh
@@ -6,7 +6,6 @@ test_description='git fsck random collection of tests
 * (main) A
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t1451-fsck-buffer.sh b/t/t1451-fsck-buffer.sh
index 3413da40e4ae0c197b42cb92e9a75983a27bdeb3..3a3d33f40548954313b8d3e58351ea8ceed6b469 100755
--- a/t/t1451-fsck-buffer.sh
+++ b/t/t1451-fsck-buffer.sh
@@ -15,7 +15,6 @@ These tests _might_ catch such overruns in normal use, but should be run with
 ASan or valgrind for more confidence.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # the general idea for tags and commits is to build up the "base" file
diff --git a/t/t1460-refs-migrate.sh b/t/t1460-refs-migrate.sh
index f7c0783d30ccd61b0fee67c115193b42bb0e2c77..cf57cd66f2db2d6b42e66a8a4349706be002d940 100755
--- a/t/t1460-refs-migrate.sh
+++ b/t/t1460-refs-migrate.sh
@@ -5,7 +5,6 @@ test_description='migration of ref storage backends'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_migration () {
diff --git a/t/t1500-rev-parse.sh b/t/t1500-rev-parse.sh
index 30c31918fde6539d52800e18dfbb3423b5b73491..bf2a90df9484662a13294ab3a0ffecdc44996c05 100755
--- a/t/t1500-rev-parse.sh
+++ b/t/t1500-rev-parse.sh
@@ -4,7 +4,6 @@ test_description='test git rev-parse'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_one () {
diff --git a/t/t1501-work-tree.sh b/t/t1501-work-tree.sh
index ae6528aecea7d3b36cfe51c5f19c7098f05429e3..8c94ac2e70bdc6835a6f79705fe34e0744ddcc42 100755
--- a/t/t1501-work-tree.sh
+++ b/t/t1501-work-tree.sh
@@ -2,7 +2,6 @@
 
 test_description='test separate work tree'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t1502-rev-parse-parseopt.sh b/t/t1502-rev-parse-parseopt.sh
index 5eaa6428c43917515f95baed1c1cf4ad2cb6110b..3962f1d2882a1f4331e0ca8c83c0ac27fecf2019 100755
--- a/t/t1502-rev-parse-parseopt.sh
+++ b/t/t1502-rev-parse-parseopt.sh
@@ -2,7 +2,6 @@
 
 test_description='test git rev-parse --parseopt'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 check_invalid_long_option () {
diff --git a/t/t1503-rev-parse-verify.sh b/t/t1503-rev-parse-verify.sh
index 79df65ec7f619baa053b2aa50d5ec08557cb820a..75a708f9ba5f22d0eb007cc68871da5a62571905 100755
--- a/t/t1503-rev-parse-verify.sh
+++ b/t/t1503-rev-parse-verify.sh
@@ -9,7 +9,6 @@ exec </dev/null
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 add_line_into_file()
diff --git a/t/t1504-ceiling-dirs.sh b/t/t1504-ceiling-dirs.sh
index c1679e31d8afca409323484d588bf63b264f45f2..e04420f4368b9305162f1fd7b0be7926a113e057 100755
--- a/t/t1504-ceiling-dirs.sh
+++ b/t/t1504-ceiling-dirs.sh
@@ -2,7 +2,6 @@
 
 test_description='test GIT_CEILING_DIRECTORIES'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_prefix() {
diff --git a/t/t1505-rev-parse-last.sh b/t/t1505-rev-parse-last.sh
index 4a5758f08a8b2f38bc98e6ac4e26cfa36713780d..2803ca9489c7c6bc2accd85c62ec52805ce2bce3 100755
--- a/t/t1505-rev-parse-last.sh
+++ b/t/t1505-rev-parse-last.sh
@@ -5,7 +5,6 @@ test_description='test @{-N} syntax'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 
diff --git a/t/t1506-rev-parse-diagnosis.sh b/t/t1506-rev-parse-diagnosis.sh
index a3464976e3a934ca1dc0b17703b6476339a07fcb..722884e65f45871e281954f814154cfe976d35c1 100755
--- a/t/t1506-rev-parse-diagnosis.sh
+++ b/t/t1506-rev-parse-diagnosis.sh
@@ -7,7 +7,6 @@ exec </dev/null
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_did_you_mean ()
diff --git a/t/t1507-rev-parse-upstream.sh b/t/t1507-rev-parse-upstream.sh
index b9af6b3ac035a04858ae0c7e0963166af665bd81..cb9ef7e329eb06a693ead9ab747f9efd37021c94 100755
--- a/t/t1507-rev-parse-upstream.sh
+++ b/t/t1507-rev-parse-upstream.sh
@@ -5,7 +5,6 @@ test_description='test <branch>@{upstream} syntax'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 
diff --git a/t/t1508-at-combinations.sh b/t/t1508-at-combinations.sh
index e841309d0eab1022f3442c23795f884ad98a8280..87a42864145f85ed539b9d1cbb9a3dd5f71fc708 100755
--- a/t/t1508-at-combinations.sh
+++ b/t/t1508-at-combinations.sh
@@ -4,7 +4,6 @@ test_description='test various @{X} syntax combinations together'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 check() {
diff --git a/t/t1510-repo-setup.sh b/t/t1510-repo-setup.sh
index 591505a39c02786962a02161d533f28dca16951e..bbfe05b8e4a5c4c13e531647bfa460c0a552de2e 100755
--- a/t/t1510-repo-setup.sh
+++ b/t/t1510-repo-setup.sh
@@ -43,7 +43,6 @@ A few rules for repo setup:
 # This test heavily relies on the standard error of nested function calls.
 test_untraceable=UnfortunatelyYes
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 here=$(pwd)
diff --git a/t/t1511-rev-parse-caret.sh b/t/t1511-rev-parse-caret.sh
index e7e78a402813368396632bdbc32793f4919a2f95..6ecfed86bc0d6aa6390f09dd3a06976208d3f8cb 100755
--- a/t/t1511-rev-parse-caret.sh
+++ b/t/t1511-rev-parse-caret.sh
@@ -5,7 +5,6 @@ test_description='tests for ref^{stuff}'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t1512-rev-parse-disambiguation.sh b/t/t1512-rev-parse-disambiguation.sh
index f9d68ce74ea0950455300c761b5345e9db300a09..70f1e0a998e103704373e2cc4ffd21e09c7c64b0 100755
--- a/t/t1512-rev-parse-disambiguation.sh
+++ b/t/t1512-rev-parse-disambiguation.sh
@@ -23,7 +23,6 @@ one tagged as v1.0.0.  They all have one regular file each.
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_cmp_failed_rev_parse () {
diff --git a/t/t1513-rev-parse-prefix.sh b/t/t1513-rev-parse-prefix.sh
index ba43387bf167b598de91bea497251d270214f545..5f437be8c9e8c932f5d355e3f8636e5cbcd69791 100755
--- a/t/t1513-rev-parse-prefix.sh
+++ b/t/t1513-rev-parse-prefix.sh
@@ -5,7 +5,6 @@ test_description='Tests for rev-parse --prefix'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t1514-rev-parse-push.sh b/t/t1514-rev-parse-push.sh
index a835a196aa81be9e7aa79f38c3977a03b71b5336..d868a0811056c83810bdd468d85e6f3a90622da7 100755
--- a/t/t1514-rev-parse-push.sh
+++ b/t/t1514-rev-parse-push.sh
@@ -4,7 +4,6 @@ test_description='test <branch>@{push} syntax'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 resolve () {
diff --git a/t/t1515-rev-parse-outside-repo.sh b/t/t1515-rev-parse-outside-repo.sh
index cdb26a30d726bb0088230c251a58ece0d160c72d..75e89c4b6e23c2659006615ba58e44526fc9e373 100755
--- a/t/t1515-rev-parse-outside-repo.sh
+++ b/t/t1515-rev-parse-outside-repo.sh
@@ -2,7 +2,6 @@
 
 test_description='check that certain rev-parse options work outside repo'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'set up non-repo directory' '
diff --git a/t/t1517-outside-repo.sh b/t/t1517-outside-repo.sh
index 342defbb61762892744c3f4dfa96336c6a19d36a..dbd8cd6906338dff358c5fa5a9b8ce1524903110 100755
--- a/t/t1517-outside-repo.sh
+++ b/t/t1517-outside-repo.sh
@@ -2,7 +2,6 @@
 
 test_description='check random commands outside repo'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'set up a non-repo directory and test file' '
diff --git a/t/t1600-index.sh b/t/t1600-index.sh
index 62e7fd15964bba7cbc8904471879027219368951..03239e9faa4b7e834b8b8420d8dc5cc17e8a7d4f 100755
--- a/t/t1600-index.sh
+++ b/t/t1600-index.sh
@@ -2,7 +2,6 @@
 
 test_description='index file specific tests'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 sane_unset GIT_TEST_SPLIT_INDEX
diff --git a/t/t1601-index-bogus.sh b/t/t1601-index-bogus.sh
index 5dcc10188280b2c0ff4b6b9465c87651de47c5a8..a45a8b4eb046f637aa196412c4da7ddf14694546 100755
--- a/t/t1601-index-bogus.sh
+++ b/t/t1601-index-bogus.sh
@@ -2,7 +2,6 @@
 
 test_description='test handling of bogus index entries'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'create tree with null sha1' '
diff --git a/t/t1700-split-index.sh b/t/t1700-split-index.sh
index 2625ac44889a5c9219e9575a9bbc5265d3c419d5..ac4a5b2734c0784c2cb8878112a5ead9593860de 100755
--- a/t/t1700-split-index.sh
+++ b/t/t1700-split-index.sh
@@ -5,7 +5,6 @@ test_description='split index mode tests'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # We need total control of index splitting here
diff --git a/t/t1701-racy-split-index.sh b/t/t1701-racy-split-index.sh
index d8fa489998acc5984da7e21a8a2adf43cfe88cee..5dc221ef382df13089b84dcb03002c2a8f19a9ba 100755
--- a/t/t1701-racy-split-index.sh
+++ b/t/t1701-racy-split-index.sh
@@ -5,7 +5,6 @@
 
 test_description='racy split index'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t1800-hook.sh b/t/t1800-hook.sh
index 8b0234cf2d5d96980403d65b844639715acfe91b..4feaf0d7bef71fc558e640f5fae37ae1fb95c95c 100755
--- a/t/t1800-hook.sh
+++ b/t/t1800-hook.sh
@@ -2,7 +2,6 @@
 
 test_description='git-hook command'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-terminal.sh
 
diff --git a/t/t2000-conflict-when-checking-files-out.sh b/t/t2000-conflict-when-checking-files-out.sh
index 79fc97f1d7eb42675c85ef29b8cb36a75d7e7669..f18616ad2be3eaaf6dc72ab9131c88a0c9bdf2fc 100755
--- a/t/t2000-conflict-when-checking-files-out.sh
+++ b/t/t2000-conflict-when-checking-files-out.sh
@@ -21,7 +21,6 @@ test_description='git conflicts when checking files out test.'
 # path1 is occupied by a non-directory.  With "-f" flag, it should remove
 # the conflicting paths and succeed.
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 show_files() {
diff --git a/t/t2002-checkout-cache-u.sh b/t/t2002-checkout-cache-u.sh
index fc95cf90485366314dcebb7fe77f18b1d8d4ef1b..70361c806e1baf1b26810983374c53eb49ea2f2d 100755
--- a/t/t2002-checkout-cache-u.sh
+++ b/t/t2002-checkout-cache-u.sh
@@ -8,7 +8,6 @@ test_description='git checkout-index -u test.
 With -u flag, git checkout-index internally runs the equivalent of
 git update-index --refresh on the checked out entry.'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success \
diff --git a/t/t2003-checkout-cache-mkdir.sh b/t/t2003-checkout-cache-mkdir.sh
index f0fd441d810d52c909476a76107098d16ecc9f35..ff163cf6750f6d82c36964eb694efbcfae06135f 100755
--- a/t/t2003-checkout-cache-mkdir.sh
+++ b/t/t2003-checkout-cache-mkdir.sh
@@ -10,7 +10,6 @@ also verifies that such leading path may contain symlinks, unlike
 the GIT controlled paths.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t2004-checkout-cache-temp.sh b/t/t2004-checkout-cache-temp.sh
index 98e818f09f21fe6ea374dba692c3f4ed619af735..b92d96fdc4ed5fe1a4b577596133cc59becbd327 100755
--- a/t/t2004-checkout-cache-temp.sh
+++ b/t/t2004-checkout-cache-temp.sh
@@ -8,7 +8,6 @@ test_description='git checkout-index --temp test.
 With --temp flag, git checkout-index writes to temporary merge files
 rather than the tracked path.'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t2005-checkout-index-symlinks.sh b/t/t2005-checkout-index-symlinks.sh
index 67d18cfa104b867bfdd2004df0bc8c9e305cfdc9..91b08e03717a619807e0687be6d538bbb6036824 100755
--- a/t/t2005-checkout-index-symlinks.sh
+++ b/t/t2005-checkout-index-symlinks.sh
@@ -8,7 +8,6 @@ test_description='git checkout-index on filesystem w/o symlinks test.
 This tests that git checkout-index creates a symbolic link as a plain
 file if core.symlinks is false.'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success \
diff --git a/t/t2006-checkout-index-basic.sh b/t/t2006-checkout-index-basic.sh
index 570ba38580d99513fe12a2c6ed1e1a4c6951e0e2..bac231b167c2c66522b067f027ae4b7801709f11 100755
--- a/t/t2006-checkout-index-basic.sh
+++ b/t/t2006-checkout-index-basic.sh
@@ -3,7 +3,6 @@
 test_description='basic checkout-index tests
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'checkout-index --gobbledegook' '
diff --git a/t/t2007-checkout-symlink.sh b/t/t2007-checkout-symlink.sh
index bd9e9e7530da06da9eb3fc6ce103b82196625d23..6f0b90ce1271ec49f6fd78016c5f3cb082053674 100755
--- a/t/t2007-checkout-symlink.sh
+++ b/t/t2007-checkout-symlink.sh
@@ -7,7 +7,6 @@ test_description='git checkout to switch between branches with symlink<->dir'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t2008-checkout-subdir.sh b/t/t2008-checkout-subdir.sh
index 8a518a44ea2d2a65f6ee2d9d88c5a8233476c902..eadb9434ae764cc0ca57085a6ce28dd5bee4bb77 100755
--- a/t/t2008-checkout-subdir.sh
+++ b/t/t2008-checkout-subdir.sh
@@ -4,7 +4,6 @@
 
 test_description='git checkout from subdirectories'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t2009-checkout-statinfo.sh b/t/t2009-checkout-statinfo.sh
index 71195dd28f2258d3286cc478967b0319ae58b143..b0540636ae387104edae67cd7baa74949f7f5ffd 100755
--- a/t/t2009-checkout-statinfo.sh
+++ b/t/t2009-checkout-statinfo.sh
@@ -5,7 +5,6 @@ test_description='checkout should leave clean stat info'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t2010-checkout-ambiguous.sh b/t/t2010-checkout-ambiguous.sh
index 82c3bfeac1ad9b96eb2adb9ae835fb2032222bd5..3a3d56018e525e9c2e0620fd3e06e0b916ca4782 100755
--- a/t/t2010-checkout-ambiguous.sh
+++ b/t/t2010-checkout-ambiguous.sh
@@ -5,7 +5,6 @@ test_description='checkout and pathspecs/refspecs ambiguities'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t2011-checkout-invalid-head.sh b/t/t2011-checkout-invalid-head.sh
index 04f53b1ea14cb5046ee3cf3ad70804812c6fce8a..61417c756750bbd49c1da3cb7457cca481529207 100755
--- a/t/t2011-checkout-invalid-head.sh
+++ b/t/t2011-checkout-invalid-head.sh
@@ -5,7 +5,6 @@ test_description='checkout switching away from an invalid branch'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t2012-checkout-last.sh b/t/t2012-checkout-last.sh
index 4b6372f4c3e946c26a490698335a821cff5701f2..1f6c4ed0428a5c966c76359c1f4fa2e536f37fcf 100755
--- a/t/t2012-checkout-last.sh
+++ b/t/t2012-checkout-last.sh
@@ -5,7 +5,6 @@ test_description='checkout can switch to last branch and merge base'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t2013-checkout-submodule.sh b/t/t2013-checkout-submodule.sh
index 3c1d663d948490901fb3de330b35ae0227730158..b2bdd1fcb425a14a12df9fe896269e5f9c349434 100755
--- a/t/t2013-checkout-submodule.sh
+++ b/t/t2013-checkout-submodule.sh
@@ -2,7 +2,6 @@
 
 test_description='checkout can handle submodules'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-submodule-update.sh
 
diff --git a/t/t2014-checkout-switch.sh b/t/t2014-checkout-switch.sh
index c138bdde4fea1536a06137c68ab100b6b0d1f49b..3e757c6e4e3250577d8327ad3d33651788d43561 100755
--- a/t/t2014-checkout-switch.sh
+++ b/t/t2014-checkout-switch.sh
@@ -2,7 +2,6 @@
 
 test_description='Peter MacMillan'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t2015-checkout-unborn.sh b/t/t2015-checkout-unborn.sh
index fb0e13881cd8a290dd272c6dc16c3f097f49cb39..1820300c62fb3421b3ac3544f746d93207583c52 100755
--- a/t/t2015-checkout-unborn.sh
+++ b/t/t2015-checkout-unborn.sh
@@ -4,7 +4,6 @@ test_description='checkout from unborn branch'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t2016-checkout-patch.sh b/t/t2016-checkout-patch.sh
index c40b661ac12d57209199ea397748409860345d8f..c4f9bf09aa4fd8d541a858d55cfbff34e78de1c0 100755
--- a/t/t2016-checkout-patch.sh
+++ b/t/t2016-checkout-patch.sh
@@ -2,7 +2,6 @@
 
 test_description='git checkout --patch'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./lib-patch-mode.sh
 
 test_expect_success 'setup' '
diff --git a/t/t2017-checkout-orphan.sh b/t/t2017-checkout-orphan.sh
index a5c7358eeabefb3dacc94ae94e2c61d200381ac5..80ac661815d0a750ef2291ae3d10798cf96afea0 100755
--- a/t/t2017-checkout-orphan.sh
+++ b/t/t2017-checkout-orphan.sh
@@ -10,7 +10,6 @@ Main Tests for --orphan functionality.'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 TEST_FILE=foo
diff --git a/t/t2018-checkout-branch.sh b/t/t2018-checkout-branch.sh
index 43551cc1481c3813c3aae0b291bac2b1a17b63d7..a48ebdbf4d0957181a881228ede5ccda29039f02 100755
--- a/t/t2018-checkout-branch.sh
+++ b/t/t2018-checkout-branch.sh
@@ -3,7 +3,6 @@
 test_description='checkout'
 
 TEST_CREATE_REPO_NO_TEMPLATE=1
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # Arguments: [!] <branch> <oid> [<checkout options>]
diff --git a/t/t2019-checkout-ambiguous-ref.sh b/t/t2019-checkout-ambiguous-ref.sh
index c67261e2b68a9d330dc14c92783a485b0f605601..1fcef4be95ce14be0635fa44660a59996e8ed53b 100755
--- a/t/t2019-checkout-ambiguous-ref.sh
+++ b/t/t2019-checkout-ambiguous-ref.sh
@@ -2,7 +2,6 @@
 
 test_description='checkout handling of ambiguous (branch/tag) refs'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup ambiguous refs' '
diff --git a/t/t2020-checkout-detach.sh b/t/t2020-checkout-detach.sh
index 8d90d0285045294b3f39233957ea4487bc7929e0..28bbbe6c05547a4ef8eae1cd671abd298013b68a 100755
--- a/t/t2020-checkout-detach.sh
+++ b/t/t2020-checkout-detach.sh
@@ -4,7 +4,6 @@ test_description='checkout into detached HEAD state'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 check_detached () {
diff --git a/t/t2021-checkout-overwrite.sh b/t/t2021-checkout-overwrite.sh
index ecfacf0f7f3a5fa7c03fa837891c745dec10dda6..a5c03d5d4a2c5a31a8e921fc81344d9470dd79bb 100755
--- a/t/t2021-checkout-overwrite.sh
+++ b/t/t2021-checkout-overwrite.sh
@@ -2,7 +2,6 @@
 
 test_description='checkout must not overwrite an untracked objects'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t2022-checkout-paths.sh b/t/t2022-checkout-paths.sh
index f1b709d58bef0080c1e8067b4b6e725b8141d027..c49ba7f9bd4fe0c6f8f88fbe5a0722b2d6337ac7 100755
--- a/t/t2022-checkout-paths.sh
+++ b/t/t2022-checkout-paths.sh
@@ -4,7 +4,6 @@ test_description='checkout $tree -- $paths'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t2023-checkout-m.sh b/t/t2023-checkout-m.sh
index 81e772fb4ebbf1d6c4d156560aa10dfdb02a0852..7b327b754494a8ebb27bb11c7f70649063ccd8d2 100755
--- a/t/t2023-checkout-m.sh
+++ b/t/t2023-checkout-m.sh
@@ -7,7 +7,6 @@ Ensures that checkout -m on a resolved file restores the conflicted file'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t2024-checkout-dwim.sh b/t/t2024-checkout-dwim.sh
index 2caada3d834ffc139c0af2e3f1b0b52f9eee9718..a3b1449ef1166756e5bd029a2f94ac6e1c50b03b 100755
--- a/t/t2024-checkout-dwim.sh
+++ b/t/t2024-checkout-dwim.sh
@@ -4,7 +4,6 @@ test_description='checkout <branch>
 
 Ensures that checkout on an unborn branch does what the user expects'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # Is the current branch "refs/heads/$1"?
diff --git a/t/t2025-checkout-no-overlay.sh b/t/t2025-checkout-no-overlay.sh
index 246609d54d050e5fce76730318123b30f322b75a..dda169bbc4a649989a519ff5b74ad34fc5791c1f 100755
--- a/t/t2025-checkout-no-overlay.sh
+++ b/t/t2025-checkout-no-overlay.sh
@@ -2,7 +2,6 @@
 
 test_description='checkout --no-overlay <tree-ish> -- <pathspec>'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t2026-checkout-pathspec-file.sh b/t/t2026-checkout-pathspec-file.sh
index acd55217a6231c35d17f4fbefe2ea27e30d05501..161da054b6dbb534bd70e4150be3e41166d7c27a 100755
--- a/t/t2026-checkout-pathspec-file.sh
+++ b/t/t2026-checkout-pathspec-file.sh
@@ -2,7 +2,6 @@
 
 test_description='checkout --pathspec-from-file'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_tick
diff --git a/t/t2027-checkout-track.sh b/t/t2027-checkout-track.sh
index 98f16c72399806d2e0a5cdc0580072dcc8c65dae..a397790df59d0bc015e2b1f244cbbbca27525b7a 100755
--- a/t/t2027-checkout-track.sh
+++ b/t/t2027-checkout-track.sh
@@ -5,7 +5,6 @@ test_description='tests for git branch --track'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t2030-unresolve-info.sh b/t/t2030-unresolve-info.sh
index b3f6bc97b53d87a4442739d4d62cccd923b55bcd..be3fcdde07562c27da31e7dfe549058f3ced0ea9 100755
--- a/t/t2030-unresolve-info.sh
+++ b/t/t2030-unresolve-info.sh
@@ -5,7 +5,6 @@ test_description='undoing resolution'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 check_resolve_undo () {
diff --git a/t/t2050-git-dir-relative.sh b/t/t2050-git-dir-relative.sh
index 1f193cde965303a8f2362e824e0a86e99f746548..21f4659a9d1c22fcc8c9eb3261315d67988dad2f 100755
--- a/t/t2050-git-dir-relative.sh
+++ b/t/t2050-git-dir-relative.sh
@@ -12,7 +12,6 @@ into the subdir while keeping the worktree location,
 and tries commits from the top and the subdir, checking
 that the commit-hook still gets called.'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 COMMIT_FILE="$(pwd)/output"
diff --git a/t/t2060-switch.sh b/t/t2060-switch.sh
index 77b2346291b39cfe16c614e8018a20195e7f1118..c91c4db9361133e4e790f2c0201c5f41c14eaff1 100755
--- a/t/t2060-switch.sh
+++ b/t/t2060-switch.sh
@@ -5,7 +5,6 @@ test_description='switch basic functionality'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t2070-restore.sh b/t/t2070-restore.sh
index ac404945d4c4e28b608f664f64c4b422557b2684..16d6348b692806ab25faf89d77a73cd62fab4d93 100755
--- a/t/t2070-restore.sh
+++ b/t/t2070-restore.sh
@@ -5,7 +5,6 @@ test_description='restore basic functionality'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t2071-restore-patch.sh b/t/t2071-restore-patch.sh
index 42d552211915754e14ddb79d869fc9ba8f517fce..27e85be40ad6957f9070a609d83ae334776ed855 100755
--- a/t/t2071-restore-patch.sh
+++ b/t/t2071-restore-patch.sh
@@ -2,7 +2,6 @@
 
 test_description='git restore --patch'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./lib-patch-mode.sh
 
 test_expect_success 'setup' '
diff --git a/t/t2072-restore-pathspec-file.sh b/t/t2072-restore-pathspec-file.sh
index 86c9c887881b94a586dc96b3f495a72c022fd827..8198a1e5789cc963c32ecb028209a7a773144fd5 100755
--- a/t/t2072-restore-pathspec-file.sh
+++ b/t/t2072-restore-pathspec-file.sh
@@ -2,7 +2,6 @@
 
 test_description='restore --pathspec-from-file'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_tick
diff --git a/t/t2080-parallel-checkout-basics.sh b/t/t2080-parallel-checkout-basics.sh
index 59e5570cb2d52298ba1c1045d2baef025fd86baf..5ffe1a41e2cd726e00b242a9f289c28c183ef5f0 100755
--- a/t/t2080-parallel-checkout-basics.sh
+++ b/t/t2080-parallel-checkout-basics.sh
@@ -8,7 +8,6 @@ working tree.
 '
 
 TEST_NO_CREATE_REPO=1
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY/lib-parallel-checkout.sh"
 
diff --git a/t/t2081-parallel-checkout-collisions.sh b/t/t2081-parallel-checkout-collisions.sh
index 6acdb89d12bd046674c27aba12119a231dbb0f08..f6fcfc0c1e403930a602e694fe3bf7632b81192a 100755
--- a/t/t2081-parallel-checkout-collisions.sh
+++ b/t/t2081-parallel-checkout-collisions.sh
@@ -11,7 +11,6 @@ The tests in this file exercise parallel checkout's collision detection code in
 both these mechanics.
 "
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY/lib-parallel-checkout.sh"
 
diff --git a/t/t2082-parallel-checkout-attributes.sh b/t/t2082-parallel-checkout-attributes.sh
index d02d6a555040c8fde2eb13ba1a990f1d6ce93fca..79fb11f139a2c105f4b86ba0147306166b9ddae9 100755
--- a/t/t2082-parallel-checkout-attributes.sh
+++ b/t/t2082-parallel-checkout-attributes.sh
@@ -10,7 +10,6 @@ properly (without access to the index or attribute stack).
 '
 
 TEST_NO_CREATE_REPO=1
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY/lib-parallel-checkout.sh"
 . "$TEST_DIRECTORY/lib-encoding.sh"
diff --git a/t/t2100-update-cache-badpath.sh b/t/t2100-update-cache-badpath.sh
index 7915e7b8211dbb16f49c9f1e5f0433c6f3230e58..2df3fdde8bf665a2b531dd367b70a7a767ee3dbc 100755
--- a/t/t2100-update-cache-badpath.sh
+++ b/t/t2100-update-cache-badpath.sh
@@ -22,7 +22,6 @@ and tries to git update-index --add the following:
 All of the attempts should fail.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 mkdir path2 path3
diff --git a/t/t2101-update-index-reupdate.sh b/t/t2101-update-index-reupdate.sh
index e3c7acdbf9125d68d72d983ed692ce6851f785bd..6c32d42c8c688845682d578141dbef760a663215 100755
--- a/t/t2101-update-index-reupdate.sh
+++ b/t/t2101-update-index-reupdate.sh
@@ -6,7 +6,6 @@
 test_description='git update-index --again test.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'update-index --add' '
diff --git a/t/t2102-update-index-symlinks.sh b/t/t2102-update-index-symlinks.sh
index c49cdfb6e582f41ea4010df7f4556f7aad5f1cc4..9b11130ab93a327f9c5e57cbe37062e3e095dbee 100755
--- a/t/t2102-update-index-symlinks.sh
+++ b/t/t2102-update-index-symlinks.sh
@@ -8,7 +8,6 @@ test_description='git update-index on filesystem w/o symlinks test.
 This tests that git update-index keeps the symbolic link property
 even if a plain file is in the working tree if core.symlinks is false.'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success \
diff --git a/t/t2103-update-index-ignore-missing.sh b/t/t2103-update-index-ignore-missing.sh
index e9451cd567cd61ffb678ee33d3c01e646b4cbe3a..6938ecca86836660ea3f4e7d74a7ba2ca2913606 100755
--- a/t/t2103-update-index-ignore-missing.sh
+++ b/t/t2103-update-index-ignore-missing.sh
@@ -2,7 +2,6 @@
 
 test_description='update-index with options'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success basics '
diff --git a/t/t2104-update-index-skip-worktree.sh b/t/t2104-update-index-skip-worktree.sh
index 7ec7f30b442b3bc04be5ac64cbf1898c0b5268b6..7a0778ed983a509a8fc65f06901b4c37ba4db0ee 100755
--- a/t/t2104-update-index-skip-worktree.sh
+++ b/t/t2104-update-index-skip-worktree.sh
@@ -5,7 +5,6 @@
 
 test_description='skip-worktree bit test'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 sane_unset GIT_TEST_SPLIT_INDEX
diff --git a/t/t2105-update-index-gitfile.sh b/t/t2105-update-index-gitfile.sh
index 963ebe77eb6b49b733f249b4ee93020b35ca4097..a7f3d47aec2591f9da19ce24b2796005ddf87096 100755
--- a/t/t2105-update-index-gitfile.sh
+++ b/t/t2105-update-index-gitfile.sh
@@ -6,7 +6,6 @@
 test_description='git update-index for gitlink to .git file.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'submodule with absolute .git file' '
diff --git a/t/t2106-update-index-assume-unchanged.sh b/t/t2106-update-index-assume-unchanged.sh
index 95c004dc5c5462b8b18cf348e5b1c44115a73042..6b2ccc21a937dff83c7f408f06d4fe8355c81f4a 100755
--- a/t/t2106-update-index-assume-unchanged.sh
+++ b/t/t2106-update-index-assume-unchanged.sh
@@ -3,7 +3,6 @@
 test_description='git update-index --assume-unchanged test.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t2107-update-index-basic.sh b/t/t2107-update-index-basic.sh
index f0eab13f96a6b946f982db2543112cc7467d857d..cc72ead79f397873b5005196a99baad6b0ba2450 100755
--- a/t/t2107-update-index-basic.sh
+++ b/t/t2107-update-index-basic.sh
@@ -5,7 +5,6 @@ test_description='basic update-index tests
 Tests for command-line parsing and basic operation.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'update-index --nonsense fails' '
diff --git a/t/t2108-update-index-refresh-racy.sh b/t/t2108-update-index-refresh-racy.sh
index bc5f2886faf8877fc13adecd607b41f46d69b6d1..b31dd8ece5023ee7bcb122739997b07315c1f5d7 100755
--- a/t/t2108-update-index-refresh-racy.sh
+++ b/t/t2108-update-index-refresh-racy.sh
@@ -2,7 +2,6 @@
 
 test_description='update-index refresh tests related to racy timestamps'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 reset_files () {
diff --git a/t/t2200-add-update.sh b/t/t2200-add-update.sh
index df235ac306e7126f7090bc62c451e906b174c387..06e83d33333dc8e11c48fdf33bd255ea66a41ec8 100755
--- a/t/t2200-add-update.sh
+++ b/t/t2200-add-update.sh
@@ -14,7 +14,6 @@ only the updates to dir/sub.
 Also tested are "git add -u" without limiting, and "git add -u"
 without contents changes, and other conditions'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t2201-add-update-typechange.sh b/t/t2201-add-update-typechange.sh
index dba62d69c6c5c18172bdbc62c5138643cf284b00..687be974d413a1f50e0f25377d9ff3f30af47ec2 100755
--- a/t/t2201-add-update-typechange.sh
+++ b/t/t2201-add-update-typechange.sh
@@ -2,7 +2,6 @@
 
 test_description='more git add -u'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t2202-add-addremove.sh b/t/t2202-add-addremove.sh
index 24c60bfd7905ba136ad59f090b40fe23a37d0a1e..9ee659098c45fbc18dfb5ccc2292f978320c1ebb 100755
--- a/t/t2202-add-addremove.sh
+++ b/t/t2202-add-addremove.sh
@@ -2,7 +2,6 @@
 
 test_description='git add --all'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t2203-add-intent.sh b/t/t2203-add-intent.sh
index 8fa44a92a277f414018d3f71731f791ec4b4f490..192ad14b5f474f7718ff57b4f6700d0f7d93649a 100755
--- a/t/t2203-add-intent.sh
+++ b/t/t2203-add-intent.sh
@@ -2,7 +2,6 @@
 
 test_description='Intent to add'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'intent to add' '
diff --git a/t/t2204-add-ignored.sh b/t/t2204-add-ignored.sh
index b7cf1e492c1073ee3fb4705bf8755d8b49c3d6d0..31eb233df51f5e7f145764a3aa8c5b1fd7142f80 100755
--- a/t/t2204-add-ignored.sh
+++ b/t/t2204-add-ignored.sh
@@ -2,7 +2,6 @@
 
 test_description='giving ignored paths to git add'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t2205-add-worktree-config.sh b/t/t2205-add-worktree-config.sh
index 98265ba1b495eb91df0fa60467ebf0ac932cf1b5..43d950de6400fca709286c5316e71e037791f04f 100755
--- a/t/t2205-add-worktree-config.sh
+++ b/t/t2205-add-worktree-config.sh
@@ -17,7 +17,6 @@ outside the repository.  Two instances for which this can occur are tested:
 	   repository can be added to the index.
 	'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success '1a: setup--config worktree' '
diff --git a/t/t2300-cd-to-toplevel.sh b/t/t2300-cd-to-toplevel.sh
index b40eeb263fe896a9553ef93f82e8a78b1dc2fb60..c8de6d8a1902209ef98ec0832296ed9060310429 100755
--- a/t/t2300-cd-to-toplevel.sh
+++ b/t/t2300-cd-to-toplevel.sh
@@ -2,7 +2,6 @@
 
 test_description='cd_to_toplevel'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 EXEC_PATH="$(git --exec-path)"
diff --git a/t/t2400-worktree-add.sh b/t/t2400-worktree-add.sh
index cfc4aeb1798c6d023909cec771e5b74e983af5ea..ba320dc4171aa7884591067c00853a955d84f4e8 100755
--- a/t/t2400-worktree-add.sh
+++ b/t/t2400-worktree-add.sh
@@ -6,7 +6,6 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
 TEST_CREATE_REPO_NO_TEMPLATE=1
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 . "$TEST_DIRECTORY"/lib-rebase.sh
diff --git a/t/t2401-worktree-prune.sh b/t/t2401-worktree-prune.sh
index 976d048e3efc74be9cd909ce76d552b3944d2e10..aa5b42c0f7b9384641f7cb2b85728bd1a79c26c4 100755
--- a/t/t2401-worktree-prune.sh
+++ b/t/t2401-worktree-prune.sh
@@ -5,7 +5,6 @@ test_description='prune $GIT_DIR/worktrees'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success initialize '
diff --git a/t/t2402-worktree-list.sh b/t/t2402-worktree-list.sh
index 33ea9cb21ba07c9563530b54da06753eaa993fe2..cb125ec2265b1dc378908079d859a7eac3dfc833 100755
--- a/t/t2402-worktree-list.sh
+++ b/t/t2402-worktree-list.sh
@@ -5,7 +5,6 @@ test_description='test git worktree list'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t2403-worktree-move.sh b/t/t2403-worktree-move.sh
index 901342ea09b51a8e832f1109fbb737df84283aa2..08531deb5b203751489722802590d18b120d2015 100755
--- a/t/t2403-worktree-move.sh
+++ b/t/t2403-worktree-move.sh
@@ -2,7 +2,6 @@
 
 test_description='test git worktree move, remove, lock and unlock'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t2404-worktree-config.sh b/t/t2404-worktree-config.sh
index 842937bfb9a8a660bf0696df324ec71f6693ae5b..9536d1091954b48a87b74eead0c382ce70355c4e 100755
--- a/t/t2404-worktree-config.sh
+++ b/t/t2404-worktree-config.sh
@@ -2,7 +2,6 @@
 
 test_description="config file in multi worktree"
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t2405-worktree-submodule.sh b/t/t2405-worktree-submodule.sh
index 1d7f60563387f9c2f53dfc3a79ac0289afe57611..11018f37c70c02e9052b36be9edb8b05211bcf8d 100755
--- a/t/t2405-worktree-submodule.sh
+++ b/t/t2405-worktree-submodule.sh
@@ -5,7 +5,6 @@ test_description='Combination of submodules and multiple worktrees'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 base_path=$(pwd -P)
diff --git a/t/t2406-worktree-repair.sh b/t/t2406-worktree-repair.sh
index 7686e60f6ad186519b275f11a5e14064c905b207..bf340b877261b0201d321499da4d18cc6cf379d2 100755
--- a/t/t2406-worktree-repair.sh
+++ b/t/t2406-worktree-repair.sh
@@ -2,7 +2,6 @@
 
 test_description='test git worktree repair'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t2407-worktree-heads.sh b/t/t2407-worktree-heads.sh
index 7750dc9265a90bdd8b0e3781accb13f00a23bb09..57c201869f02e6d9b763e004175d29d5769149b1 100755
--- a/t/t2407-worktree-heads.sh
+++ b/t/t2407-worktree-heads.sh
@@ -2,7 +2,6 @@
 
 test_description='test operations trying to overwrite refs at worktree HEAD'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t2408-worktree-relative.sh b/t/t2408-worktree-relative.sh
index a3136db7e28cb20926ff44211e246ce625a6e51a..d51cc8c5ab7e4f51048afdb8ee8fbfcac3695042 100755
--- a/t/t2408-worktree-relative.sh
+++ b/t/t2408-worktree-relative.sh
@@ -2,7 +2,6 @@
 
 test_description='test worktrees linked with relative paths'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'links worktrees with relative paths' '
diff --git a/t/t2500-untracked-overwriting.sh b/t/t2500-untracked-overwriting.sh
index 714feb83be5b36640008a96921b4b091e798df88..5c0bf4d21fcbb2a55e2c41c184ccb4c188c88ca4 100755
--- a/t/t2500-untracked-overwriting.sh
+++ b/t/t2500-untracked-overwriting.sh
@@ -2,7 +2,6 @@
 
 test_description='Test handling of overwriting untracked files'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_setup_reset () {
diff --git a/t/t2501-cwd-empty.sh b/t/t2501-cwd-empty.sh
index 8af4e8cfe3c8414d2c8d676b5fec7f6bfcb6909a..f6d8d7d03d7ca42b566c2b177ee57345e09b7107 100755
--- a/t/t2501-cwd-empty.sh
+++ b/t/t2501-cwd-empty.sh
@@ -2,7 +2,6 @@
 
 test_description='Test handling of the current working directory becoming empty'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t3000-ls-files-others.sh b/t/t3000-ls-files-others.sh
index 11af4552f7461e1091e71407517504a6497867e5..13f66fd649d81d9e7c620cf0693a82e041a2711a 100755
--- a/t/t3000-ls-files-others.sh
+++ b/t/t3000-ls-files-others.sh
@@ -16,7 +16,6 @@ filesystem.
     path4       - an empty directory
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup ' '
diff --git a/t/t3001-ls-files-others-exclude.sh b/t/t3001-ls-files-others-exclude.sh
index 1ed0aa967ece5a38cf49bc43178e4fba187d4cd4..4b676462852ab8436e1c72eb4ca759cfea2b8d34 100755
--- a/t/t3001-ls-files-others-exclude.sh
+++ b/t/t3001-ls-files-others-exclude.sh
@@ -8,7 +8,6 @@ test_description='git ls-files --others --exclude
 This test runs git ls-files --others and tests --exclude patterns.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 rm -fr one three
diff --git a/t/t3002-ls-files-dashpath.sh b/t/t3002-ls-files-dashpath.sh
index 4dd24550eba00ef005abea327ba1c1862768f3a1..31462cb441ef2fc4e2bab6e12a4e1aca9425ef4d 100755
--- a/t/t3002-ls-files-dashpath.sh
+++ b/t/t3002-ls-files-dashpath.sh
@@ -13,7 +13,6 @@ filesystem.
     --		- another file with a funny name.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t3003-ls-files-exclude.sh b/t/t3003-ls-files-exclude.sh
index 7933dff9b3849181b4c168096d166f1054a2a374..ac3c811f464c289f87536ea4dcbc2faf7b30f634 100755
--- a/t/t3003-ls-files-exclude.sh
+++ b/t/t3003-ls-files-exclude.sh
@@ -2,7 +2,6 @@
 
 test_description='ls-files --exclude does not affect index files'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'create repo with file' '
diff --git a/t/t3004-ls-files-basic.sh b/t/t3004-ls-files-basic.sh
index 12e41a7b40e0ab73efa1fc30354e80996c3a91a4..a1078f8701dbfbc6a05237216f82eb334fb0b931 100755
--- a/t/t3004-ls-files-basic.sh
+++ b/t/t3004-ls-files-basic.sh
@@ -6,7 +6,6 @@ This test runs git ls-files with various unusual or malformed
 command-line arguments.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'ls-files in empty repository' '
diff --git a/t/t3005-ls-files-relative.sh b/t/t3005-ls-files-relative.sh
index fbfa210a50b2906e57853095a2830f3bc6e18136..db13aabf625b3aa26f4b5ca3dc2cf86f623c4e51 100755
--- a/t/t3005-ls-files-relative.sh
+++ b/t/t3005-ls-files-relative.sh
@@ -5,7 +5,6 @@ test_description='ls-files tests with relative paths
 This test runs git ls-files with various relative path arguments.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'prepare' '
diff --git a/t/t3006-ls-files-long.sh b/t/t3006-ls-files-long.sh
index 2aaf91ebc8c323a5ce4475bb8a7e03543dc319ad..22c7256c3aec853cc67aca7feca5600d656d7c3b 100755
--- a/t/t3006-ls-files-long.sh
+++ b/t/t3006-ls-files-long.sh
@@ -2,7 +2,6 @@
 
 test_description='overly long paths'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t3007-ls-files-recurse-submodules.sh b/t/t3007-ls-files-recurse-submodules.sh
index f04bdc8c78b6e852d04ab4b93446248e40459f13..61771eec830c0688587588ee0a334282effdb1bb 100755
--- a/t/t3007-ls-files-recurse-submodules.sh
+++ b/t/t3007-ls-files-recurse-submodules.sh
@@ -6,7 +6,6 @@ This test verifies the recurse-submodules feature correctly lists files from
 submodules.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup directory structure and submodules' '
diff --git a/t/t3008-ls-files-lazy-init-name-hash.sh b/t/t3008-ls-files-lazy-init-name-hash.sh
index 51d3dffaa66528ff36ebe7b6660f823a2fe56371..85f370495876f51691322f3556b944a023ad8388 100755
--- a/t/t3008-ls-files-lazy-init-name-hash.sh
+++ b/t/t3008-ls-files-lazy-init-name-hash.sh
@@ -2,7 +2,6 @@
 
 test_description='Test the lazy init name hash with various folder structures'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 if test 1 -eq $(test-tool online-cpus)
diff --git a/t/t3009-ls-files-others-nonsubmodule.sh b/t/t3009-ls-files-others-nonsubmodule.sh
index 14218b342437788fef40c539c45fb41575ef0071..963f3462b750b2a4fc7d009df6cf1fa1949090d6 100755
--- a/t/t3009-ls-files-others-nonsubmodule.sh
+++ b/t/t3009-ls-files-others-nonsubmodule.sh
@@ -18,7 +18,6 @@ This test runs git ls-files --others with the following working tree:
       git repository with a commit and an untracked file
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup: directories' '
diff --git a/t/t3010-ls-files-killed-modified.sh b/t/t3010-ls-files-killed-modified.sh
index 054178703d732403ce32eda9871d8d85c47dddaa..7af4532cd1dfd063f554f3b049052d27006db483 100755
--- a/t/t3010-ls-files-killed-modified.sh
+++ b/t/t3010-ls-files-killed-modified.sh
@@ -42,7 +42,6 @@ We should report path0, path1, path2/file2, path3/file3, path7 and path8
 modified without reporting path9 and path10.  submod1 is also modified.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'git update-index --add to add various paths.' '
diff --git a/t/t3011-common-prefixes-and-directory-traversal.sh b/t/t3011-common-prefixes-and-directory-traversal.sh
index 69e44c387fa83c576e80854424da694c8afa299c..3da5b2b6e795ec4587608ead8bc10abf0c6d9039 100755
--- a/t/t3011-common-prefixes-and-directory-traversal.sh
+++ b/t/t3011-common-prefixes-and-directory-traversal.sh
@@ -2,7 +2,6 @@
 
 test_description='directory traversal handling, especially with common prefixes'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t3012-ls-files-dedup.sh b/t/t3012-ls-files-dedup.sh
index 190e2f6eed758229579a85118106e80d05c8d7d8..2682b1f43a666564a6f74bd20deca547f721ac34 100755
--- a/t/t3012-ls-files-dedup.sh
+++ b/t/t3012-ls-files-dedup.sh
@@ -2,7 +2,6 @@
 
 test_description='git ls-files --deduplicate test'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t3013-ls-files-format.sh b/t/t3013-ls-files-format.sh
index 6e6ea0b6f3ca256eb3903b08ca7025e3508ecb0b..8bdaacd85ace3d871b4e8f188f77f5a889f252ea 100755
--- a/t/t3013-ls-files-format.sh
+++ b/t/t3013-ls-files-format.sh
@@ -2,7 +2,6 @@
 
 test_description='git ls-files --format test'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 for flag in -s -o -k -t --resolve-undo --deduplicate --eol
diff --git a/t/t3020-ls-files-error-unmatch.sh b/t/t3020-ls-files-error-unmatch.sh
index 133593d23c0e898b41f697831d4f41dcbbf54d6c..ac82c9cee8a0f3267b7258c10857a4b46f485a98 100755
--- a/t/t3020-ls-files-error-unmatch.sh
+++ b/t/t3020-ls-files-error-unmatch.sh
@@ -10,7 +10,6 @@ returns an error when a non-existent path is provided on the command
 line.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t3040-subprojects-basic.sh b/t/t3040-subprojects-basic.sh
index bd65dfcffc7b80e6dceb1603a189d07ab0d4b0b3..768d702fbbfb4a4684904db59d3a664f07b5a452 100755
--- a/t/t3040-subprojects-basic.sh
+++ b/t/t3040-subprojects-basic.sh
@@ -2,7 +2,6 @@
 
 test_description='Basic subproject functionality'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup: create superproject' '
diff --git a/t/t3050-subprojects-fetch.sh b/t/t3050-subprojects-fetch.sh
index 3884694165525b9e4a3d8527785f40758817be53..f1f09abdd9b254eed1efa6b0d06369f3c8606cf8 100755
--- a/t/t3050-subprojects-fetch.sh
+++ b/t/t3050-subprojects-fetch.sh
@@ -2,7 +2,6 @@
 
 test_description='fetching and pushing project with subproject'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t3060-ls-files-with-tree.sh b/t/t3060-ls-files-with-tree.sh
index 5a06732ca730f4a4becff478cc96f20b8931f6fc..eb69da61fe7cd17dd4cc875181935e45d15931a8 100755
--- a/t/t3060-ls-files-with-tree.sh
+++ b/t/t3060-ls-files-with-tree.sh
@@ -9,7 +9,6 @@ This test runs git ls-files --with-tree and in particular in
 a scenario known to trigger a crash with some versions of git.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t3070-wildmatch.sh b/t/t3070-wildmatch.sh
index 4dd42df38c25615e0833b754d1a2c3132ef0bf1d..3da824117c61fd6d390f84ae56d631fe5d0d9071 100755
--- a/t/t3070-wildmatch.sh
+++ b/t/t3070-wildmatch.sh
@@ -2,7 +2,6 @@
 
 test_description='wildmatch tests'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 should_create_test_file() {
diff --git a/t/t3100-ls-tree-restrict.sh b/t/t3100-ls-tree-restrict.sh
index 436de44971eca5d7cbbe79d45ff2a59cf51329eb..8f294d983267f394891340962dce944bb07bed71 100755
--- a/t/t3100-ls-tree-restrict.sh
+++ b/t/t3100-ls-tree-restrict.sh
@@ -17,7 +17,6 @@ The new path restriction code should do the right thing for path2 and
 path2/baz.  Also path0/ should snow nothing.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success \
diff --git a/t/t3101-ls-tree-dirname.sh b/t/t3101-ls-tree-dirname.sh
index 5af2dac0e4b8d5fde4d6a11dae240086473e0571..ac44525810f977fca606034bc1eb8adb58219a7e 100755
--- a/t/t3101-ls-tree-dirname.sh
+++ b/t/t3101-ls-tree-dirname.sh
@@ -20,7 +20,6 @@ Test the handling of multiple directories which have matching file
 entries.  Also test odd filename and missing entries handling.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t3102-ls-tree-wildcards.sh b/t/t3102-ls-tree-wildcards.sh
index 3942db229000e0c367a93b200f30c57bba95e7ee..1e16c6b8ea610c4582e63950b8939205fc228b25 100755
--- a/t/t3102-ls-tree-wildcards.sh
+++ b/t/t3102-ls-tree-wildcards.sh
@@ -2,7 +2,6 @@
 
 test_description='ls-tree with(out) globs'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t3103-ls-tree-misc.sh b/t/t3103-ls-tree-misc.sh
index 81c6343962381fc17b1bff4d3ca8958951bde70d..e7636f6908f19fe041246a644616b35cc99b5e13 100755
--- a/t/t3103-ls-tree-misc.sh
+++ b/t/t3103-ls-tree-misc.sh
@@ -7,7 +7,6 @@ Miscellaneous tests for git ls-tree.
 
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t3104-ls-tree-format.sh b/t/t3104-ls-tree-format.sh
index 3adb206a93bc58aac509a1f093f9dd86cb98e5be..a1b2069a256aab83a8f6ad0469d4c23eccc3ecc9 100755
--- a/t/t3104-ls-tree-format.sh
+++ b/t/t3104-ls-tree-format.sh
@@ -2,7 +2,6 @@
 
 test_description='ls-tree --format'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-t3100.sh
 
diff --git a/t/t3105-ls-tree-output.sh b/t/t3105-ls-tree-output.sh
index ce2391e28be6f213aead49ec1315e6f5f08fa25d..8bdf400682dae54a8f22e1ef6fbb84c28981b7fa 100755
--- a/t/t3105-ls-tree-output.sh
+++ b/t/t3105-ls-tree-output.sh
@@ -2,7 +2,6 @@
 
 test_description='ls-tree output'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-t3100.sh
 
diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh
index ccfa6a720d090c2f7f2a085f60065bdcfaf8d1d9..2295db3dcb018cb1dcf2ad461e9f29b9ccb98a6d 100755
--- a/t/t3200-branch.sh
+++ b/t/t3200-branch.sh
@@ -8,7 +8,6 @@ test_description='git branch assorted tests'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-rebase.sh
 
diff --git a/t/t3201-branch-contains.sh b/t/t3201-branch-contains.sh
index 6e587d27d7a5e3867d27d05d300f7e8149e77587..800fc33165a9eff0abe1f6edc27acb2b4978e317 100755
--- a/t/t3201-branch-contains.sh
+++ b/t/t3201-branch-contains.sh
@@ -2,7 +2,6 @@
 
 test_description='branch --contains <commit>, --no-contains <commit> --merged, and --no-merged'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t3202-show-branch.sh b/t/t3202-show-branch.sh
index 3b6dad0c4661505b6c26ee111eb351efd3d0caca..a1139f79e2ccfdff2b562571bdd8bdf8aa974883 100755
--- a/t/t3202-show-branch.sh
+++ b/t/t3202-show-branch.sh
@@ -2,7 +2,6 @@
 
 test_description='test show-branch'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'error descriptions on empty repository' '
diff --git a/t/t3203-branch-output.sh b/t/t3203-branch-output.sh
index e627f08a1790b39ea6d21d29cb769a8d58ceb580..500c9d0e727a2989ef0c37c71890d057f0d90819 100755
--- a/t/t3203-branch-output.sh
+++ b/t/t3203-branch-output.sh
@@ -2,7 +2,6 @@
 
 test_description='git branch display tests'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-terminal.sh
 
diff --git a/t/t3204-branch-name-interpretation.sh b/t/t3204-branch-name-interpretation.sh
index 594e3e43e129a8848b5f2e65538087ca978743d6..3399344f25dc859ad743b3914a3f5c37e92bffbb 100755
--- a/t/t3204-branch-name-interpretation.sh
+++ b/t/t3204-branch-name-interpretation.sh
@@ -9,7 +9,6 @@ This script aims to check the behavior of those corner cases.
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 expect_branch() {
diff --git a/t/t3205-branch-color.sh b/t/t3205-branch-color.sh
index 0b61da92b37763213e4cee3744f127971cb6fcb1..da1c202fa7134500a317f03f7baa5de1dc1d6da2 100755
--- a/t/t3205-branch-color.sh
+++ b/t/t3205-branch-color.sh
@@ -1,7 +1,6 @@
 #!/bin/sh
 
 test_description='basic branch output coloring'
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'set up some sample branches' '
diff --git a/t/t3206-range-diff.sh b/t/t3206-range-diff.sh
index 86010931ab6243e0e617b14cae0eb63975edee7d..d2ca43d6aab504a4802535e07cb9808f33cdcdca 100755
--- a/t/t3206-range-diff.sh
+++ b/t/t3206-range-diff.sh
@@ -5,7 +5,6 @@ test_description='range-diff tests'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # Note that because of the range-diff's heuristics, test_commit does more
diff --git a/t/t3207-branch-submodule.sh b/t/t3207-branch-submodule.sh
index 904eea7df598f7d4b6c03ce000c0db2a44556324..fe72b247164e56fc9a7af134583e2b9f8cc9bbdc 100755
--- a/t/t3207-branch-submodule.sh
+++ b/t/t3207-branch-submodule.sh
@@ -5,7 +5,6 @@ test_description='git branch submodule tests'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-rebase.sh
 
diff --git a/t/t3211-peel-ref.sh b/t/t3211-peel-ref.sh
index 9cbc34fc5838b4d4a886135352e92d613ca8146a..37b9d26f4b6ba88396a2aaaecd4675470cfaa581 100755
--- a/t/t3211-peel-ref.sh
+++ b/t/t3211-peel-ref.sh
@@ -4,7 +4,6 @@ test_description='tests for the peel_ref optimization of packed-refs'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'create annotated tag in refs/tags' '
diff --git a/t/t3300-funny-names.sh b/t/t3300-funny-names.sh
index d3ac826283e1a16315bb158754224067d5b0afe4..f5bf16abcd8ce2aae5929129913cbb8927b06539 100755
--- a/t/t3300-funny-names.sh
+++ b/t/t3300-funny-names.sh
@@ -9,7 +9,6 @@ This test tries pathnames with funny characters in the working
 tree, index, and tree objects.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 HT='	'
diff --git a/t/t3301-notes.sh b/t/t3301-notes.sh
index 813dfd8db9759e90fed510734848e9dd28582549..d6c50460d08648622c519cca690ef21e32a23179 100755
--- a/t/t3301-notes.sh
+++ b/t/t3301-notes.sh
@@ -5,7 +5,6 @@
 
 test_description='Test commit notes'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 write_script fake_editor <<\EOF
diff --git a/t/t3302-notes-index-expensive.sh b/t/t3302-notes-index-expensive.sh
index d0c4d38b4d485d0b3faef4cdc7acbeb42b3c929c..bb5fea02a03a563a23e806d80dbb88a673c40802 100755
--- a/t/t3302-notes-index-expensive.sh
+++ b/t/t3302-notes-index-expensive.sh
@@ -8,7 +8,6 @@ test_description='Test commit notes index (expensive!)'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 create_repo () {
diff --git a/t/t3303-notes-subtrees.sh b/t/t3303-notes-subtrees.sh
index bc9b791d1b9ed2a780de4544232f769e093072b1..eac193757bf1a5cd27ed4d54249a41de7b302bde 100755
--- a/t/t3303-notes-subtrees.sh
+++ b/t/t3303-notes-subtrees.sh
@@ -5,7 +5,6 @@ test_description='Test commit notes organized in subtrees'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 number_of_commits=100
diff --git a/t/t3304-notes-mixed.sh b/t/t3304-notes-mixed.sh
index 2c3a2452668c514ce40c107537cc4e0c1abe5312..03dfcd3954cee5402dde186c6edd17b47db211dd 100755
--- a/t/t3304-notes-mixed.sh
+++ b/t/t3304-notes-mixed.sh
@@ -5,7 +5,6 @@ test_description='Test notes trees that also contain non-notes'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 number_of_commits=100
diff --git a/t/t3305-notes-fanout.sh b/t/t3305-notes-fanout.sh
index 1ec1fb6715efda8a0ec546956a0deece76efefff..fcecdc94ff74c21f69435237ebc504d4328faaa0 100755
--- a/t/t3305-notes-fanout.sh
+++ b/t/t3305-notes-fanout.sh
@@ -2,7 +2,6 @@
 
 test_description='Test that adding/removing many notes triggers automatic fanout restructuring'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 path_has_fanout() {
diff --git a/t/t3306-notes-prune.sh b/t/t3306-notes-prune.sh
index b6e9f643e3cd8d4a81d63e721c5a16390b879e05..8f4102ff9e446bce66436b5e7046c84d739c226f 100755
--- a/t/t3306-notes-prune.sh
+++ b/t/t3306-notes-prune.sh
@@ -2,7 +2,6 @@
 
 test_description='Test git notes prune'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup: create a few commits with notes' '
diff --git a/t/t3307-notes-man.sh b/t/t3307-notes-man.sh
index ae316502c4531b7cdadfddff12e2f95ea7c9797c..1aa366a410e9a3e2ad4c2fa84431198fbb553a5f 100755
--- a/t/t3307-notes-man.sh
+++ b/t/t3307-notes-man.sh
@@ -4,7 +4,6 @@ test_description='Examples from the git-notes man page
 
 Make sure the manual is not full of lies.'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t3308-notes-merge.sh b/t/t3308-notes-merge.sh
index e1d05ff6bc986a05bc42f02e2e86d78ddedd7aed..202702be1a78b7bb631952dc36af9a1cb69c2ecf 100755
--- a/t/t3308-notes-merge.sh
+++ b/t/t3308-notes-merge.sh
@@ -5,7 +5,6 @@
 
 test_description='Test merging of notes trees'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t3309-notes-merge-auto-resolve.sh b/t/t3309-notes-merge-auto-resolve.sh
index f55277f499dd57661e166bf3487c792df1cb1bf3..9bd5dbf341fd81a80dbebf0e1fafe623defecfa4 100755
--- a/t/t3309-notes-merge-auto-resolve.sh
+++ b/t/t3309-notes-merge-auto-resolve.sh
@@ -5,7 +5,6 @@
 
 test_description='Test notes merging with auto-resolving strategies'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # Set up a notes merge scenario with all kinds of potential conflicts
diff --git a/t/t3310-notes-merge-manual-resolve.sh b/t/t3310-notes-merge-manual-resolve.sh
index 04866b89bed3146fe9506c748c0b824ef70b12b3..597df5ebc0a582018d30c018e734d1154c364ed6 100755
--- a/t/t3310-notes-merge-manual-resolve.sh
+++ b/t/t3310-notes-merge-manual-resolve.sh
@@ -5,7 +5,6 @@
 
 test_description='Test notes merging with manual conflict resolution'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # Set up a notes merge scenario with different kinds of conflicts
diff --git a/t/t3311-notes-merge-fanout.sh b/t/t3311-notes-merge-fanout.sh
index ce4144db0f24c7bd9ccbbe30575118b565bb4486..5b675417e9bbf9d21cac561473c90622b08def5a 100755
--- a/t/t3311-notes-merge-fanout.sh
+++ b/t/t3311-notes-merge-fanout.sh
@@ -5,7 +5,6 @@
 
 test_description='Test notes merging at various fanout levels'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 verify_notes () {
diff --git a/t/t3320-notes-merge-worktrees.sh b/t/t3320-notes-merge-worktrees.sh
index 0fd33280cf91f7fe9384205df8b7570363a37076..96243b722224209e33fcc88fea10bd600852b377 100755
--- a/t/t3320-notes-merge-worktrees.sh
+++ b/t/t3320-notes-merge-worktrees.sh
@@ -8,7 +8,6 @@ test_description='Test merging of notes trees in multiple worktrees'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup commit' '
diff --git a/t/t3321-notes-stripspace.sh b/t/t3321-notes-stripspace.sh
index beca34605672d407244b26ebcffb1f70527f5915..c4a7839540a99e047a99908d776d1aecd641146c 100755
--- a/t/t3321-notes-stripspace.sh
+++ b/t/t3321-notes-stripspace.sh
@@ -5,7 +5,6 @@
 
 test_description='Test commit notes with stripspace behavior'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 MULTI_LF="$LF$LF$LF"
diff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh
index 09f230eefb2cbc03a6b8f85e0f5c39cfcb2467d5..bab675938a3e06dc632bb7a9dcd1dac65f0c21e9 100755
--- a/t/t3400-rebase.sh
+++ b/t/t3400-rebase.sh
@@ -11,7 +11,6 @@ among other things.
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 GIT_AUTHOR_NAME=author@name
diff --git a/t/t3401-rebase-and-am-rename.sh b/t/t3401-rebase-and-am-rename.sh
index 328c1d3a3f45bcf2a2c153c94556d0b56fb5bbce..f18bae94507587a4dc9118cc3d508902e02c6bc1 100755
--- a/t/t3401-rebase-and-am-rename.sh
+++ b/t/t3401-rebase-and-am-rename.sh
@@ -2,7 +2,6 @@
 
 test_description='git rebase + directory rename tests'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-rebase.sh
 
diff --git a/t/t3402-rebase-merge.sh b/t/t3402-rebase-merge.sh
index 5c67d07ba3ecf6333d1967c341d9bfb75fc33769..761de63b6b982286c3ecb0c821d38920d0be7bf6 100755
--- a/t/t3402-rebase-merge.sh
+++ b/t/t3402-rebase-merge.sh
@@ -8,7 +8,6 @@ test_description='git rebase --merge test'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 T="A quick brown fox
diff --git a/t/t3403-rebase-skip.sh b/t/t3403-rebase-skip.sh
index 4f1d6e8ea642e1a2f6b624ad333385e11036dcba..a1911c4a9d60e71f99d66ef6d7f30728ab8732df 100755
--- a/t/t3403-rebase-skip.sh
+++ b/t/t3403-rebase-skip.sh
@@ -8,7 +8,6 @@ test_description='git rebase --merge --skip tests'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 . "$TEST_DIRECTORY"/lib-rebase.sh
diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
index 77cceda14a024b5144b426b66c41961beef935e7..b11f04eb3349b7fe489ef99996d972902ef45711 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -26,7 +26,6 @@ Initial setup:
  touch file "conflict".
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 . "$TEST_DIRECTORY"/lib-rebase.sh
diff --git a/t/t3405-rebase-malformed.sh b/t/t3405-rebase-malformed.sh
index 8979bc340734f860f56c49a4380366dca1d46ee8..2524331861869d6b9ee9f80082c09d2ed089e8fe 100755
--- a/t/t3405-rebase-malformed.sh
+++ b/t/t3405-rebase-malformed.sh
@@ -5,7 +5,6 @@ test_description='rebase should handle arbitrary git message'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-rebase.sh
 
diff --git a/t/t3406-rebase-message.sh b/t/t3406-rebase-message.sh
index 82108b67e67c18230c385dfef03f7bdee37f9eb2..a1d7fa7f7c6965f49cc017303aca52a658211b10 100755
--- a/t/t3406-rebase-message.sh
+++ b/t/t3406-rebase-message.sh
@@ -5,7 +5,6 @@ test_description='messages from rebase operation'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t3407-rebase-abort.sh b/t/t3407-rebase-abort.sh
index 2c3f38d45a848260995967cfce91a38cacfe82ee..9f49c4228b629589d7bfcf3435fda8e7c4b308be 100755
--- a/t/t3407-rebase-abort.sh
+++ b/t/t3407-rebase-abort.sh
@@ -5,7 +5,6 @@ test_description='git rebase --abort tests'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t3408-rebase-multi-line.sh b/t/t3408-rebase-multi-line.sh
index 7b4607d72f2748df9d0800a5e471e4af1d6ae32a..cde3562e3a64f756544763107d9c607eaa4f38ca 100755
--- a/t/t3408-rebase-multi-line.sh
+++ b/t/t3408-rebase-multi-line.sh
@@ -5,7 +5,6 @@ test_description='rebasing a commit with multi-line first paragraph.'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t3409-rebase-environ.sh b/t/t3409-rebase-environ.sh
index acaf5558dbe2e445efe2989e137b2f9ef5140aaf..83ffb39d9ffdfd869ecb24e5adbbe11944a73c53 100755
--- a/t/t3409-rebase-environ.sh
+++ b/t/t3409-rebase-environ.sh
@@ -2,7 +2,6 @@
 
 test_description='git rebase interactive environment'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t3412-rebase-root.sh b/t/t3412-rebase-root.sh
index e75b3d0e07cb13b5d8b4fd3b83b07c35eeddce49..58371d8a5477f47d53384a84ad0dae14457128d9 100755
--- a/t/t3412-rebase-root.sh
+++ b/t/t3412-rebase-root.sh
@@ -7,7 +7,6 @@ Tests if git rebase --root --onto <newparent> can rebase the root commit.
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 log_with_names () {
diff --git a/t/t3413-rebase-hook.sh b/t/t3413-rebase-hook.sh
index 426ff098e1dc738a57299a6499bf89174979db37..b4ff614987ed6270dc836f34a6e921bc8bb9b1d3 100755
--- a/t/t3413-rebase-hook.sh
+++ b/t/t3413-rebase-hook.sh
@@ -5,7 +5,6 @@ test_description='git rebase with its hook(s)'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t3415-rebase-autosquash.sh b/t/t3415-rebase-autosquash.sh
index 22452ff84cb339936cf2efcb1b4147655943eeff..fcc40d6fe1fd5b2a9c4f2a5e4ede15e73c247790 100755
--- a/t/t3415-rebase-autosquash.sh
+++ b/t/t3415-rebase-autosquash.sh
@@ -5,7 +5,6 @@ test_description='auto squash'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 . "$TEST_DIRECTORY"/lib-rebase.sh
diff --git a/t/t3416-rebase-onto-threedots.sh b/t/t3416-rebase-onto-threedots.sh
index f8c4ed78c9ef7ffd0fa970525bf3cab47842b55a..ea501f2b42b8cc43394192d11051992605bfb619 100755
--- a/t/t3416-rebase-onto-threedots.sh
+++ b/t/t3416-rebase-onto-threedots.sh
@@ -5,7 +5,6 @@ test_description='git rebase --onto A...B'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY/lib-rebase.sh"
 
diff --git a/t/t3417-rebase-whitespace-fix.sh b/t/t3417-rebase-whitespace-fix.sh
index 22ee3a204598cfed88dead7f00f7de548c94cb85..96f2cf22fafd4795e54928b14b5c2b4b2333e8f3 100755
--- a/t/t3417-rebase-whitespace-fix.sh
+++ b/t/t3417-rebase-whitespace-fix.sh
@@ -5,7 +5,6 @@ test_description='git rebase --whitespace=fix
 This test runs git rebase --whitespace=fix and make sure that it works.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # prepare initial revision of "file" with a blank line at the end
diff --git a/t/t3418-rebase-continue.sh b/t/t3418-rebase-continue.sh
index c0d29c2154f0b4eff481352fd1acb0bb1f3c2331..127216f7225aa412022bb0f296f716c42ce15f56 100755
--- a/t/t3418-rebase-continue.sh
+++ b/t/t3418-rebase-continue.sh
@@ -5,7 +5,6 @@ test_description='git rebase --continue tests'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 . "$TEST_DIRECTORY"/lib-rebase.sh
diff --git a/t/t3419-rebase-patch-id.sh b/t/t3419-rebase-patch-id.sh
index 6c61f240cf9874bbdb0190739b66a1c0ed99289f..7181f176b8136504b4a9bc5e962cf358b00ffbba 100755
--- a/t/t3419-rebase-patch-id.sh
+++ b/t/t3419-rebase-patch-id.sh
@@ -5,7 +5,6 @@ test_description='git rebase - test patch id computation'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 scramble () {
diff --git a/t/t3420-rebase-autostash.sh b/t/t3420-rebase-autostash.sh
index b43046b3b0dfb89740692a16f0e365d091590657..ad3ba6a9848f8a940a71cba1e11579d0e831a209 100755
--- a/t/t3420-rebase-autostash.sh
+++ b/t/t3420-rebase-autostash.sh
@@ -7,7 +7,6 @@ test_description='git rebase --autostash tests'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t3421-rebase-topology-linear.sh b/t/t3421-rebase-topology-linear.sh
index 737af80bb3dbb205346a3b6ccedf6cbb34fbfab2..f5b7807abd089d05a009aea8e67c2a04b1d4f736 100755
--- a/t/t3421-rebase-topology-linear.sh
+++ b/t/t3421-rebase-topology-linear.sh
@@ -2,7 +2,6 @@
 
 test_description='basic rebase topology tests'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-rebase.sh
 
diff --git a/t/t3422-rebase-incompatible-options.sh b/t/t3422-rebase-incompatible-options.sh
index b40f26250b7e3d8ce95b149589822bd57d84dbbe..b9408f9ba1285f404f148e7f9cade54affed2f0a 100755
--- a/t/t3422-rebase-incompatible-options.sh
+++ b/t/t3422-rebase-incompatible-options.sh
@@ -2,7 +2,6 @@
 
 test_description='test if rebase detects and aborts on incompatible options'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t3423-rebase-reword.sh b/t/t3423-rebase-reword.sh
index 2fab703d615485020f0692bdc2d39748ba0f72d4..4859bb8f722314df2fdb67aa51a4419009ce22ec 100755
--- a/t/t3423-rebase-reword.sh
+++ b/t/t3423-rebase-reword.sh
@@ -2,7 +2,6 @@
 
 test_description='git rebase interactive with rewording'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 . "$TEST_DIRECTORY"/lib-rebase.sh
diff --git a/t/t3424-rebase-empty.sh b/t/t3424-rebase-empty.sh
index 515c949ae37269d056e9bf5b0fb88f409eba5c02..1ee6b00fd57726e055b95903e09f97c1e24ebcd2 100755
--- a/t/t3424-rebase-empty.sh
+++ b/t/t3424-rebase-empty.sh
@@ -2,7 +2,6 @@
 
 test_description='git rebase of commits that start or become empty'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup test repository' '
diff --git a/t/t3425-rebase-topology-merges.sh b/t/t3425-rebase-topology-merges.sh
index a16428bdf54ab9157dfefb7cc9797e4c5dd86e1e..675491234a6155f6a3b09701d96ac048d648648c 100755
--- a/t/t3425-rebase-topology-merges.sh
+++ b/t/t3425-rebase-topology-merges.sh
@@ -2,7 +2,6 @@
 
 test_description='rebase topology tests with merges'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-rebase.sh
 
diff --git a/t/t3426-rebase-submodule.sh b/t/t3426-rebase-submodule.sh
index 94ea88e384e6219c7d47c6c9fb8409640623680d..ba069dccbdf56197b0e93831fdb1316853d54ef4 100755
--- a/t/t3426-rebase-submodule.sh
+++ b/t/t3426-rebase-submodule.sh
@@ -2,7 +2,6 @@
 
 test_description='rebase can handle submodules'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-submodule-update.sh
 . "$TEST_DIRECTORY"/lib-rebase.sh
diff --git a/t/t3427-rebase-subtree.sh b/t/t3427-rebase-subtree.sh
index 5e9046e3df3d5262c2845d190476b9d9bc56873e..1b3e97c8755f3d8b41549e70cf67529298118182 100755
--- a/t/t3427-rebase-subtree.sh
+++ b/t/t3427-rebase-subtree.sh
@@ -7,7 +7,6 @@ This test runs git rebase and tests the subtree strategy.
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-rebase.sh
 
diff --git a/t/t3428-rebase-signoff.sh b/t/t3428-rebase-signoff.sh
index 365436ebfc36415333d01bd231f7f89e5223477d..6f57aed9fac68f1b5d670b2e3c35bcc84690a525 100755
--- a/t/t3428-rebase-signoff.sh
+++ b/t/t3428-rebase-signoff.sh
@@ -5,7 +5,6 @@ test_description='git rebase --signoff
 This test runs git rebase --signoff and make sure that it works.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-rebase.sh
 
diff --git a/t/t3429-rebase-edit-todo.sh b/t/t3429-rebase-edit-todo.sh
index 8e0d03969a2fec13fba015158b3380ec2ee37c42..abd66f360213e18ad80b1c7bb2396b06d3e77b28 100755
--- a/t/t3429-rebase-edit-todo.sh
+++ b/t/t3429-rebase-edit-todo.sh
@@ -2,7 +2,6 @@
 
 test_description='rebase should reread the todo file if an exec modifies it'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-rebase.sh
 
diff --git a/t/t3430-rebase-merges.sh b/t/t3430-rebase-merges.sh
index cb891eeb5fd112bf94e31a2158a5dce7990e36e2..2593711fecdc9f18c1b83b8d921ae06fbd2495ac 100755
--- a/t/t3430-rebase-merges.sh
+++ b/t/t3430-rebase-merges.sh
@@ -21,7 +21,6 @@ Initial setup:
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-rebase.sh
 . "$TEST_DIRECTORY"/lib-log-graph.sh
diff --git a/t/t3431-rebase-fork-point.sh b/t/t3431-rebase-fork-point.sh
index 7b9c135c6e2766ceff9d99e188ab92ab6a7cdc62..be09fc78c16aab1fe525daeaa1348a9db5cec9a6 100755
--- a/t/t3431-rebase-fork-point.sh
+++ b/t/t3431-rebase-fork-point.sh
@@ -8,7 +8,6 @@ test_description='git rebase --fork-point test'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # A---B---D---E    (main)
diff --git a/t/t3432-rebase-fast-forward.sh b/t/t3432-rebase-fast-forward.sh
index 7f1a5dd3deb10bef921654ef767a7cd53347bfd8..5086e14c02207184bd7c048ee2bc2419ad4d1b34 100755
--- a/t/t3432-rebase-fast-forward.sh
+++ b/t/t3432-rebase-fast-forward.sh
@@ -8,7 +8,6 @@ test_description='ensure rebase fast-forwards commits when possible'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t3433-rebase-across-mode-change.sh b/t/t3433-rebase-across-mode-change.sh
index c8172b0852233b6f370eab47c6cc4877db54d8f7..05df964670f49d011bf35b414177a35f812a4c4e 100755
--- a/t/t3433-rebase-across-mode-change.sh
+++ b/t/t3433-rebase-across-mode-change.sh
@@ -2,7 +2,6 @@
 
 test_description='git rebase across mode change'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t3434-rebase-i18n.sh b/t/t3434-rebase-i18n.sh
index 97fc9a23f21f9b02b0b6e0e132dd56dbe82eafcb..8c94fdffc43044b18f15605bc43c8014c021bb3b 100755
--- a/t/t3434-rebase-i18n.sh
+++ b/t/t3434-rebase-i18n.sh
@@ -17,7 +17,6 @@ Initial setup:
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 if ! test_have_prereq ICONV
diff --git a/t/t3435-rebase-gpg-sign.sh b/t/t3435-rebase-gpg-sign.sh
index 6e329fea7c0fac0482e363a3d297134c942e256a..6aa2aeb628d0eda991ee16760985f9017dceebb1 100755
--- a/t/t3435-rebase-gpg-sign.sh
+++ b/t/t3435-rebase-gpg-sign.sh
@@ -8,7 +8,6 @@ test_description='test rebase --[no-]gpg-sign'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY/lib-rebase.sh"
 . "$TEST_DIRECTORY/lib-gpg.sh"
diff --git a/t/t3436-rebase-more-options.sh b/t/t3436-rebase-more-options.sh
index 4d9744e5fc7ade70fc4cf2b7a594d1b0513e0f58..94671d3c4650463525006090702210eda76594e0 100755
--- a/t/t3436-rebase-more-options.sh
+++ b/t/t3436-rebase-more-options.sh
@@ -5,7 +5,6 @@
 
 test_description='tests to ensure compatibility between am and interactive backends'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 . "$TEST_DIRECTORY"/lib-rebase.sh
diff --git a/t/t3437-rebase-fixup-options.sh b/t/t3437-rebase-fixup-options.sh
index 7929e2e2e3a8fc1240af3991f85172c16dcbd2cf..6f9307e0e3cdfe8903b5a77229b2439d375b51b2 100755
--- a/t/t3437-rebase-fixup-options.sh
+++ b/t/t3437-rebase-fixup-options.sh
@@ -14,7 +14,6 @@ to the "fixup" command that works with "fixup!", "fixup -C" works with
 "amend!" upon --autosquash.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 . "$TEST_DIRECTORY"/lib-rebase.sh
diff --git a/t/t3438-rebase-broken-files.sh b/t/t3438-rebase-broken-files.sh
index 821f08e5afb6983cf8f69abc525a54b6274885e6..78d42f4c799f144caabcc2b0e5f04e82122beb02 100755
--- a/t/t3438-rebase-broken-files.sh
+++ b/t/t3438-rebase-broken-files.sh
@@ -2,7 +2,6 @@
 
 test_description='rebase behavior when on-disk files are broken'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'set up conflicting branches' '
diff --git a/t/t3500-cherry.sh b/t/t3500-cherry.sh
index 61ca87512d59dcc37a831619cb6691af97fa7d25..78c3eac54b599ef9cded9a042f4346621798b645 100755
--- a/t/t3500-cherry.sh
+++ b/t/t3500-cherry.sh
@@ -11,7 +11,6 @@ checks that git cherry only returns the second patch in the local branch
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 GIT_AUTHOR_EMAIL=bogus_email_address
diff --git a/t/t3501-revert-cherry-pick.sh b/t/t3501-revert-cherry-pick.sh
index 411027fb58c7dfb657409980970e71005f2c79c5..17a993796254501a2dd3d35a08c1bd00594a61c9 100755
--- a/t/t3501-revert-cherry-pick.sh
+++ b/t/t3501-revert-cherry-pick.sh
@@ -5,7 +5,6 @@ test_description='miscellaneous basic tests for cherry-pick and revert'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t3502-cherry-pick-merge.sh b/t/t3502-cherry-pick-merge.sh
index 1b2c0d6aca64e05a85ffd6568be17bb5897a297e..5495eacfec11a904ba24d69439cb1b98b5a353ec 100755
--- a/t/t3502-cherry-pick-merge.sh
+++ b/t/t3502-cherry-pick-merge.sh
@@ -11,7 +11,6 @@ test_description='cherry picking and reverting a merge
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t3503-cherry-pick-root.sh b/t/t3503-cherry-pick-root.sh
index 76d393dc8a307ebef13dfab5e4eb3d88a7a7cd69..95fe4feaeee98f6432b39ee3a4817f05da5d649b 100755
--- a/t/t3503-cherry-pick-root.sh
+++ b/t/t3503-cherry-pick-root.sh
@@ -5,7 +5,6 @@ test_description='test cherry-picking (and reverting) a root commit'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t3504-cherry-pick-rerere.sh b/t/t3504-cherry-pick-rerere.sh
index 109016eba92ac8d296edfbaf28ecf9b1a4fc32f7..18aeba161c0ae4821e0496269ed251763c245e6b 100755
--- a/t/t3504-cherry-pick-rerere.sh
+++ b/t/t3504-cherry-pick-rerere.sh
@@ -5,7 +5,6 @@ test_description='cherry-pick should rerere for conflicts'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t3505-cherry-pick-empty.sh b/t/t3505-cherry-pick-empty.sh
index ead3fb46807ef33427172dde75a45f5cfa01bfb0..9748443530cd713c8c9d06e6eaa67552a69e978b 100755
--- a/t/t3505-cherry-pick-empty.sh
+++ b/t/t3505-cherry-pick-empty.sh
@@ -5,7 +5,6 @@ test_description='test cherry-picking an empty commit'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t3506-cherry-pick-ff.sh b/t/t3506-cherry-pick-ff.sh
index b71bad17b853c566caac5828c19453da9c862647..7e11bd4a4c5c41c9e326244f598bdc9bb4e4e3ba 100755
--- a/t/t3506-cherry-pick-ff.sh
+++ b/t/t3506-cherry-pick-ff.sh
@@ -5,7 +5,6 @@ test_description='test cherry-picking with --ff option'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t3507-cherry-pick-conflict.sh b/t/t3507-cherry-pick-conflict.sh
index 10e9c91dbbd0f0f2655a5f35c769ba2fa5a10444..f3947b400a3a89970e400d3c3f5dc5d690292d83 100755
--- a/t/t3507-cherry-pick-conflict.sh
+++ b/t/t3507-cherry-pick-conflict.sh
@@ -13,7 +13,6 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
 TEST_CREATE_REPO_NO_TEMPLATE=1
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 pristine_detach () {
diff --git a/t/t3508-cherry-pick-many-commits.sh b/t/t3508-cherry-pick-many-commits.sh
index afa7727a4af8e489b8b3f36213a15ed83dc9e561..2d53ce754c5fb75ceeaa43dc1ba2f748fd58f43e 100755
--- a/t/t3508-cherry-pick-many-commits.sh
+++ b/t/t3508-cherry-pick-many-commits.sh
@@ -5,7 +5,6 @@ test_description='test cherry-picking many commits'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 check_head_differs_from() {
diff --git a/t/t3509-cherry-pick-merge-df.sh b/t/t3509-cherry-pick-merge-df.sh
index 171cc6d76b797c99638bda0d63083aecfd7a5a2d..f4159246e1e35d615bca2191393ea19427088dc0 100755
--- a/t/t3509-cherry-pick-merge-df.sh
+++ b/t/t3509-cherry-pick-merge-df.sh
@@ -4,7 +4,6 @@ test_description='Test cherry-pick with directory/file conflicts'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'Initialize repository' '
diff --git a/t/t3510-cherry-pick-sequence.sh b/t/t3510-cherry-pick-sequence.sh
index 93c725bac3cb3edd9fdaab7f0ecf9985fd7f848e..7eb52b12edc55702f48812725bfddc282297f9a5 100755
--- a/t/t3510-cherry-pick-sequence.sh
+++ b/t/t3510-cherry-pick-sequence.sh
@@ -12,7 +12,6 @@ test_description='Test cherry-pick continuation features
 
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # Repeat first match 10 times
diff --git a/t/t3511-cherry-pick-x.sh b/t/t3511-cherry-pick-x.sh
index dd5d92ef302124aeb9d6fe02642489875a9e1b22..84a587daf3af0356244c58c6472e202875679200 100755
--- a/t/t3511-cherry-pick-x.sh
+++ b/t/t3511-cherry-pick-x.sh
@@ -2,7 +2,6 @@
 
 test_description='Test cherry-pick -x and -s'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 pristine_detach () {
diff --git a/t/t3512-cherry-pick-submodule.sh b/t/t3512-cherry-pick-submodule.sh
index 9387a22a9e7100335208713fcb069b31c69f7e80..f22d1ddead1ac94de714f61fc10b87cc4bae3aec 100755
--- a/t/t3512-cherry-pick-submodule.sh
+++ b/t/t3512-cherry-pick-submodule.sh
@@ -5,7 +5,6 @@ test_description='cherry-pick can handle submodules'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-submodule-update.sh
 
diff --git a/t/t3513-revert-submodule.sh b/t/t3513-revert-submodule.sh
index e178968b408f4b9068bcc07055ffacf781154181..8bfe3ed2467fa17d9f1910cd76c721c73776d4ab 100755
--- a/t/t3513-revert-submodule.sh
+++ b/t/t3513-revert-submodule.sh
@@ -2,7 +2,6 @@
 
 test_description='revert can handle submodules'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-submodule-update.sh
 
diff --git a/t/t3514-cherry-pick-revert-gpg.sh b/t/t3514-cherry-pick-revert-gpg.sh
index 133dc072178a161a33b05ca02f8872b5286a943a..5b2e250eaa509458d89d13f4a3728276525fa746 100755
--- a/t/t3514-cherry-pick-revert-gpg.sh
+++ b/t/t3514-cherry-pick-revert-gpg.sh
@@ -5,7 +5,6 @@
 
 test_description='test {cherry-pick,revert} --[no-]gpg-sign'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY/lib-gpg.sh"
 
diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh
index 31ac31d4bcd3bbef54f10234cb5c437d3f97fc35..98259e2adaa9dba9fa6bbcb79e50948e69a6b9e6 100755
--- a/t/t3600-rm.sh
+++ b/t/t3600-rm.sh
@@ -8,7 +8,6 @@ test_description='Test of the various options to git rm.'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # Setup some files to be removed, some with funny characters
diff --git a/t/t3601-rm-pathspec-file.sh b/t/t3601-rm-pathspec-file.sh
index 7cef12981c4be0b611f70fe021d5960f1ad4e5a8..31bd9960fcde39a6d30095f05320a4e3d1fb1c9c 100755
--- a/t/t3601-rm-pathspec-file.sh
+++ b/t/t3601-rm-pathspec-file.sh
@@ -2,7 +2,6 @@
 
 test_description='rm --pathspec-from-file'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_tick
diff --git a/t/t3602-rm-sparse-checkout.sh b/t/t3602-rm-sparse-checkout.sh
index fcdefba48cc76b9a86c8136342c828e30cd9e811..08580fd3dccb73bea98c787271ba49c362a55b6b 100755
--- a/t/t3602-rm-sparse-checkout.sh
+++ b/t/t3602-rm-sparse-checkout.sh
@@ -2,7 +2,6 @@
 
 test_description='git rm in sparse checked out working trees'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' "
diff --git a/t/t3650-replay-basics.sh b/t/t3650-replay-basics.sh
index 12bd3db4cb74635ff1a939c80897e9fb98a208a7..389670262e458eadb7029251aa44b52be8ae5350 100755
--- a/t/t3650-replay-basics.sh
+++ b/t/t3650-replay-basics.sh
@@ -5,7 +5,6 @@ test_description='basic git replay tests'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 GIT_AUTHOR_NAME=author@name
diff --git a/t/t3700-add.sh b/t/t3700-add.sh
index 839c904745a2861487e04363060a951aaeb902c9..4c543a1a7e8f416acf58ac32ddf2b7394f159abd 100755
--- a/t/t3700-add.sh
+++ b/t/t3700-add.sh
@@ -5,7 +5,6 @@
 
 test_description='Test of git add, including the -- option.'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 . "$TEST_DIRECTORY"/lib-unique-files.sh
diff --git a/t/t3701-add-interactive.sh b/t/t3701-add-interactive.sh
index 718438ffc7d2a8d3482544378749b0d4dfe6313b..b8a05d95f3f1304ac82618d8847cad026c6c44f4 100755
--- a/t/t3701-add-interactive.sh
+++ b/t/t3701-add-interactive.sh
@@ -4,7 +4,6 @@ test_description='add -i basic tests'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-terminal.sh
 
diff --git a/t/t3702-add-edit.sh b/t/t3702-add-edit.sh
index 82bfb2fd2aca9eae78af33fa67620e76458b3ac6..8bacacbac6807c1ddab20aeca87ac34dbdd05bfb 100755
--- a/t/t3702-add-edit.sh
+++ b/t/t3702-add-edit.sh
@@ -5,7 +5,6 @@
 
 test_description='add -e basic tests'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 
diff --git a/t/t3703-add-magic-pathspec.sh b/t/t3703-add-magic-pathspec.sh
index d84071038e051552f5676c5c687e4e5e2646a39a..3ef525a559d91b115a3dbe4a1373c8c51fb1fc98 100755
--- a/t/t3703-add-magic-pathspec.sh
+++ b/t/t3703-add-magic-pathspec.sh
@@ -2,7 +2,6 @@
 
 test_description='magic pathspec tests using git-add'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t3704-add-pathspec-file.sh b/t/t3704-add-pathspec-file.sh
index 3aa59f6f639b5bfc79ab048f594cb2512755be73..b9c96e273fb71af8b4ee3cf376a53433d3fea5d7 100755
--- a/t/t3704-add-pathspec-file.sh
+++ b/t/t3704-add-pathspec-file.sh
@@ -2,7 +2,6 @@
 
 test_description='add --pathspec-from-file'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_tick
diff --git a/t/t3705-add-sparse-checkout.sh b/t/t3705-add-sparse-checkout.sh
index 6ae45a788d1a97e04bf504a25efbd98a6ab5e41a..2bade9e804fcfc74df7d5629bbd409fda1c4a302 100755
--- a/t/t3705-add-sparse-checkout.sh
+++ b/t/t3705-add-sparse-checkout.sh
@@ -2,7 +2,6 @@
 
 test_description='git add in sparse checked out working trees'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 SPARSE_ENTRY_BLOB=""
diff --git a/t/t3800-mktag.sh b/t/t3800-mktag.sh
index d3e428ff46eb5c99d98a8fe27b54cf98d6d2a936..e3cf0ffbe59c449b218cafedd74bd3cf07e82ff1 100755
--- a/t/t3800-mktag.sh
+++ b/t/t3800-mktag.sh
@@ -4,7 +4,6 @@
 
 test_description='git mktag: tag object verify test'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 ###########################################################
diff --git a/t/t3900-i18n-commit.sh b/t/t3900-i18n-commit.sh
index 9d4b5ab1f9520f3892a32e17239ae6cb34184269..3c930ec202d682d26b76a90b3ba80e3574331e19 100755
--- a/t/t3900-i18n-commit.sh
+++ b/t/t3900-i18n-commit.sh
@@ -5,7 +5,6 @@
 
 test_description='commit and log output encodings'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 if ! test_have_prereq ICONV
diff --git a/t/t3901-i18n-patch.sh b/t/t3901-i18n-patch.sh
index e0659c92935e7f7582e03fd1121df7488e0e2b4a..f03601b49a93970eeb0d0393f9979fc71dbe9ce1 100755
--- a/t/t3901-i18n-patch.sh
+++ b/t/t3901-i18n-patch.sh
@@ -8,7 +8,6 @@ test_description='i18n settings and format-patch | am pipe'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 if ! test_have_prereq ICONV
diff --git a/t/t3902-quoted.sh b/t/t3902-quoted.sh
index 72a5a565e973ad634ecfa4418d8934d3c7b85ae1..f528008c363c68f40da3b88a34ae8ec931d0c1ac 100755
--- a/t/t3902-quoted.sh
+++ b/t/t3902-quoted.sh
@@ -5,7 +5,6 @@
 
 test_description='quoted output'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 FN='濱野'
diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh
index c87592ee2f39fe3568fe98955d0df24bd2180f68..74666ff3e4b2b8fa5aa9651e85dc7c82621bd304 100755
--- a/t/t3903-stash.sh
+++ b/t/t3903-stash.sh
@@ -8,7 +8,6 @@ test_description='Test git stash'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-unique-files.sh
 
diff --git a/t/t3904-stash-patch.sh b/t/t3904-stash-patch.sh
index aa5019fd6c3d59cc4f3ad870607c7e6e531e628b..ae313e3c705e460f2f905e4cbdd25b694f0417a0 100755
--- a/t/t3904-stash-patch.sh
+++ b/t/t3904-stash-patch.sh
@@ -2,7 +2,6 @@
 
 test_description='stash -p'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./lib-patch-mode.sh
 
 test_expect_success 'setup' '
diff --git a/t/t3905-stash-include-untracked.sh b/t/t3905-stash-include-untracked.sh
index a1733f45c3aa13e642fe7aeb808391dbd10e6fab..1289ae3e07c635d30930067022969247b2b63f1f 100755
--- a/t/t3905-stash-include-untracked.sh
+++ b/t/t3905-stash-include-untracked.sh
@@ -5,7 +5,6 @@
 
 test_description='Test git stash --include-untracked'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'stash save --include-untracked some dirty working directory' '
diff --git a/t/t3906-stash-submodule.sh b/t/t3906-stash-submodule.sh
index 0f61f01ef43b2c889bd2850fbd41c4a42f52c6e6..0f7348ec21b8821cb6b7594919bbc637ec0a7236 100755
--- a/t/t3906-stash-submodule.sh
+++ b/t/t3906-stash-submodule.sh
@@ -2,7 +2,6 @@
 
 test_description='stash can handle submodules'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-submodule-update.sh
 
diff --git a/t/t3907-stash-show-config.sh b/t/t3907-stash-show-config.sh
index 7a2eb98b86426ea7657fdce73cb8c0cb3a6d2848..10914bba7b3737ea89af320f93371e44b4694a11 100755
--- a/t/t3907-stash-show-config.sh
+++ b/t/t3907-stash-show-config.sh
@@ -2,7 +2,6 @@
 
 test_description='Test git stash show configuration.'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t3908-stash-in-worktree.sh b/t/t3908-stash-in-worktree.sh
index 347a89b030b68dc87ecea8f40dfe9d1b0ca8db16..2b2b366ef94b7ca429416d81cc4858201658d3cb 100755
--- a/t/t3908-stash-in-worktree.sh
+++ b/t/t3908-stash-in-worktree.sh
@@ -5,7 +5,6 @@
 
 test_description='Test git stash in a worktree'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t3909-stash-pathspec-file.sh b/t/t3909-stash-pathspec-file.sh
index 83269d0eb4cc42f21f58cb77043aae97f8644f94..73f2dbdeb022ee71d04e9961da959f60d6eabd5c 100755
--- a/t/t3909-stash-pathspec-file.sh
+++ b/t/t3909-stash-pathspec-file.sh
@@ -2,7 +2,6 @@
 
 test_description='stash --pathspec-from-file'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_tick
diff --git a/t/t3920-crlf-messages.sh b/t/t3920-crlf-messages.sh
index 31877f00c77d81da8847164228a9ac58573a850d..e2e1251a057f245eebcfd0fecebec712aef48694 100755
--- a/t/t3920-crlf-messages.sh
+++ b/t/t3920-crlf-messages.sh
@@ -2,7 +2,6 @@
 
 test_description='Test ref-filter and pretty APIs for commit and tag messages using CRLF'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 LIB_CRLF_BRANCHES=""
diff --git a/t/t4000-d
Toon Claes· Nov 20, 2024, 10:40 UTC · re: Patrick Steinhardt · lore

Re: [PATCH v2 27/27] t: remove TEST_PASSES_SANITIZE_LEAK annotations

Patrick Steinhardt <ps@pks.im> writes:
> Now that the default value for TEST_PASSES_SANITIZE_LEAK is `true` there
> is no longer a need to have that variable declared in all of our tests.
> Drop it.

Amazing to see this finally fall into place. Thanks for all the hard work. I've sent you some comments on some of the patches, and the other look good to me.

-- Toon

Patrick Steinhardt· Nov 20, 2024, 12:41 UTC · re: Toon Claes · lore

Re: [PATCH v2 27/27] t: remove TEST_PASSES_SANITIZE_LEAK annotations

On Wed, Nov 20, 2024 at 11:40:15AM +0100, Toon Claes wrote:
Show 9 quoted lines
> Patrick Steinhardt <ps@pks.im> writes:
> 
> > Now that the default value for TEST_PASSES_SANITIZE_LEAK is `true` there
> > is no longer a need to have that variable declared in all of our tests.
> > Drop it.
> 
> Amazing to see this finally fall into place. Thanks for all the hard
> work. I've sent you some comments on some of the patches, and the other
> look good to me.
Thanks for your review!
Patrick
Rubén Justo· Nov 11, 2024, 23:33 UTC · re: Patrick Steinhardt · lore

Re: [PATCH v2 00/27] Memory leak fixes (pt.10, final)

On Mon, Nov 11, 2024 at 11:38:29AM +0100, Patrick Steinhardt wrote:
Show 1172 quoted lines
> Hi,
> 
> this is the last part of my series of memory leak fixes. This series
> goes a bit further than past series:
> 
>   - Patches 1 to 16 plug remaining memory leaks exposed by our test
>     suite.
> 
>   - Patches 17 to 22 remove the last remaining `UNLEAK()` annotations
>     and ultimately remove the macro itself.
> 
>   - Patch 23 works around a bug in the leak sanitizer itself.
> 
>   - Patches 24 and 25 drop annotations where leak-free tests pass with
>     the leak sanitizer.
> 
>   - Patches 26 and 27 unconditionally enable leak checking in all newly
>     added tests and then drop the `TEST_PASSES_SANITIZE_LEAK`
>     annotation.
> 
> So once this series lands, the expectation is that any newly added test
> needs to be leak free by default. We still have an escape hatch in the
> form of the SANITIZE_LEAK prerequisite, but patch authors are expected
> to provide good arguments why their test cannot be made leak free.
> 
> Changes in v2:
> 
>   - Some fixes to code formatting.
> 
>   - Simplify the memory leak fixes in "help.c".
> 
>   - Split out the removal of `UNLEAK()` into its own commit.
> 
> Link to v1: https://lore.kernel.org/r/cover.1730901926.git.ps@pks.im
> 
> Thanks!
> 
> Patrick
> 
> To: git@vger.kernel.org
> Cc: Rubén Justo <rjusto@gmail.com>
> 
> Patrick Steinhardt (27):
>       builtin/blame: fix leaking blame entries with `--incremental`
>       bisect: fix leaking good/bad terms when reading multipe times
>       bisect: fix leaking string in `handle_bad_merge_base()`
>       bisect: fix leaking `current_bad_oid`
>       bisect: fix multiple leaks in `bisect_next_all()`
>       bisect: fix leaking commit list items in `check_merge_base()`
>       bisect: fix various cases where we leak commit list items
>       line-log: fix leak when rewriting commit parents
>       strvec: introduce new `strvec_splice()` function
>       git: refactor alias handling to use a `struct strvec`
>       git: refactor builtin handling to use a `struct strvec`
>       split-index: fix memory leak in `move_cache_to_base_index()`
>       builtin/sparse-checkout: fix leaking sanitized patterns
>       help: refactor to not use globals for reading config
>       help: fix leaking `struct cmdnames`
>       help: fix leaking return value from `help_unknown_cmd()`
>       builtin/help: fix leaks in `check_git_cmd()`
>       builtin/init-db: fix leaking directory paths
>       builtin/branch: fix leaking sorting options
>       t/helper: fix leaking commit graph in "read-graph" subcommand
>       global: drop `UNLEAK()` annotation
>       git-compat-util: drop now-unused `UNLEAK()` macro
>       t5601: work around leak sanitizer issue
>       t: mark some tests as leak free
>       t: remove unneeded !SANITIZE_LEAK prerequisites
>       test-lib: unconditionally enable leak checking
>       t: remove TEST_PASSES_SANITIZE_LEAK annotations
> 
>  bisect.c                                           |  61 +++++++---
>  bisect.h                                           |   2 +-
>  blame.c                                            |   1 +
>  blame.h                                            |   2 +-
>  builtin/blame.c                                    |  12 +-
>  builtin/branch.c                                   |  33 ++++--
>  builtin/clone.c                                    |   1 -
>  builtin/diff.c                                     |   1 -
>  builtin/help.c                                     |  13 ++-
>  builtin/init-db.c                                  |  34 +++---
>  builtin/sparse-checkout.c                          |  61 ++++++----
>  ci/lib.sh                                          |   1 -
>  git-compat-util.h                                  |  20 ----
>  git.c                                              | 124 +++++++++++----------
>  help.c                                             |  58 +++++-----
>  help.h                                             |   2 +-
>  line-log.c                                         |   1 +
>  revision.c                                         |   4 +-
>  split-index.c                                      |   6 +-
>  strvec.c                                           |  19 ++++
>  strvec.h                                           |   9 ++
>  t/README                                           |  21 ----
>  t/helper/test-read-graph.c                         |   3 +-
>  t/lib-git-svn.sh                                   |   4 -
>  t/t0001-init.sh                                    |   1 -
>  t/t0002-gitfile.sh                                 |   1 -
>  t/t0003-attributes.sh                              |   1 -
>  t/t0004-unwritable.sh                              |   1 -
>  t/t0005-signals.sh                                 |   1 -
>  t/t0006-date.sh                                    |   1 -
>  t/t0007-git-var.sh                                 |   1 -
>  t/t0008-ignores.sh                                 |   1 -
>  t/t0010-racy-git.sh                                |   1 -
>  t/t0012-help.sh                                    |   1 -
>  t/t0013-sha1dc.sh                                  |   1 -
>  t/t0017-env-helper.sh                              |   1 -
>  t/t0018-advice.sh                                  |   1 -
>  t/t0019-json-writer.sh                             |   1 -
>  t/t0020-crlf.sh                                    |   1 -
>  t/t0021-conversion.sh                              |   1 -
>  t/t0022-crlf-rename.sh                             |   1 -
>  t/t0023-crlf-am.sh                                 |   1 -
>  t/t0024-crlf-archive.sh                            |   1 -
>  t/t0025-crlf-renormalize.sh                        |   1 -
>  t/t0026-eol-config.sh                              |   1 -
>  t/t0027-auto-crlf.sh                               |   1 -
>  t/t0028-working-tree-encoding.sh                   |   1 -
>  t/t0029-core-unsetenvvars.sh                       |   1 -
>  t/t0030-stripspace.sh                              |   1 -
>  t/t0033-safe-directory.sh                          |   1 -
>  t/t0035-safe-bare-repository.sh                    |   1 -
>  t/t0040-parse-options.sh                           |   1 -
>  t/t0041-usage.sh                                   |   1 -
>  t/t0050-filesystem.sh                              |   1 -
>  t/t0052-simple-ipc.sh                              |   1 -
>  t/t0055-beyond-symlinks.sh                         |   1 -
>  t/t0056-git-C.sh                                   |   1 -
>  t/t0060-path-utils.sh                              |   1 -
>  t/t0061-run-command.sh                             |   1 -
>  t/t0062-revision-walking.sh                        |   1 -
>  t/t0063-string-list.sh                             |   1 -
>  t/t0066-dir-iterator.sh                            |   1 -
>  t/t0067-parse_pathspec_file.sh                     |   1 -
>  t/t0068-for-each-repo.sh                           |   1 -
>  t/t0070-fundamental.sh                             |   1 -
>  t/t0071-sort.sh                                    |   1 -
>  t/t0080-unit-test-output.sh                        |   1 -
>  t/t0081-find-pack.sh                               |   1 -
>  t/t0090-cache-tree.sh                              |   1 -
>  t/t0091-bugreport.sh                               |   1 -
>  t/t0092-diagnose.sh                                |   1 -
>  t/t0095-bloom.sh                                   |   3 +-
>  t/t0100-previous.sh                                |   1 -
>  t/t0101-at-syntax.sh                               |   1 -
>  t/t0200-gettext-basic.sh                           |   1 -
>  t/t0201-gettext-fallbacks.sh                       |   1 -
>  t/t0202-gettext-perl.sh                            |   1 -
>  t/t0203-gettext-setlocale-sanity.sh                |   1 -
>  t/t0204-gettext-reencode-sanity.sh                 |   1 -
>  t/t0210-trace2-normal.sh                           |   1 -
>  t/t0211-trace2-perf.sh                             |   1 -
>  t/t0212-trace2-event.sh                            |   1 -
>  t/t0300-credentials.sh                             |   1 -
>  t/t0301-credential-cache.sh                        |   1 -
>  t/t0302-credential-store.sh                        |   1 -
>  t/t0303-credential-external.sh                     |   1 -
>  t/t0410-partial-clone.sh                           |   1 -
>  t/t0411-clone-from-partial.sh                      |   1 -
>  t/t0450-txt-doc-vs-help.sh                         |   1 -
>  t/t0500-progress-display.sh                        |   1 -
>  t/t0600-reffiles-backend.sh                        |   1 -
>  t/t0601-reffiles-pack-refs.sh                      |   1 -
>  t/t0602-reffiles-fsck.sh                           |   1 -
>  t/t0610-reftable-basics.sh                         |   1 -
>  t/t0611-reftable-httpd.sh                          |   1 -
>  t/t0612-reftable-jgit-compatibility.sh             |   1 -
>  t/t0613-reftable-write-options.sh                  |   1 -
>  t/t1000-read-tree-m-3way.sh                        |   1 -
>  t/t1001-read-tree-m-2way.sh                        |   1 -
>  t/t1002-read-tree-m-u-2way.sh                      |   1 -
>  t/t1003-read-tree-prefix.sh                        |   1 -
>  t/t1004-read-tree-m-u-wf.sh                        |   1 -
>  t/t1005-read-tree-reset.sh                         |   1 -
>  t/t1006-cat-file.sh                                |   1 -
>  t/t1007-hash-object.sh                             |   1 -
>  t/t1008-read-tree-overlay.sh                       |   1 -
>  t/t1009-read-tree-new-index.sh                     |   1 -
>  t/t1010-mktree.sh                                  |   1 -
>  t/t1011-read-tree-sparse-checkout.sh               |   1 -
>  t/t1012-read-tree-df.sh                            |   1 -
>  t/t1013-read-tree-submodule.sh                     |   1 -
>  t/t1014-read-tree-confusing.sh                     |   1 -
>  t/t1015-read-index-unmerged.sh                     |   1 -
>  t/t1016-compatObjectFormat.sh                      |   1 -
>  t/t1020-subdirectory.sh                            |   1 -
>  t/t1021-rerere-in-workdir.sh                       |   1 -
>  t/t1022-read-tree-partial-clone.sh                 |   1 -
>  t/t1050-large.sh                                   |   1 -
>  t/t1051-large-conversion.sh                        |   1 -
>  t/t1060-object-corruption.sh                       |   1 -
>  t/t1090-sparse-checkout-scope.sh                   |   1 -
>  t/t1091-sparse-checkout-builtin.sh                 |   1 -
>  t/t1092-sparse-checkout-compatibility.sh           |   1 -
>  t/t1100-commit-tree-options.sh                     |   1 -
>  t/t1300-config.sh                                  |   1 -
>  t/t1301-shared-repo.sh                             |   1 -
>  t/t1302-repo-version.sh                            |   1 -
>  t/t1303-wacky-config.sh                            |   1 -
>  t/t1304-default-acl.sh                             |   1 -
>  t/t1305-config-include.sh                          |   1 -
>  t/t1306-xdg-files.sh                               |   1 -
>  t/t1307-config-blob.sh                             |   1 -
>  t/t1308-config-set.sh                              |   1 -
>  t/t1309-early-config.sh                            |   1 -
>  t/t1310-config-default.sh                          |   1 -
>  t/t1350-config-hooks-path.sh                       |   1 -
>  t/t1400-update-ref.sh                              |   1 -
>  t/t1401-symbolic-ref.sh                            |   1 -
>  t/t1402-check-ref-format.sh                        |   1 -
>  t/t1403-show-ref.sh                                |   1 -
>  t/t1404-update-ref-errors.sh                       |   1 -
>  t/t1405-main-ref-store.sh                          |   1 -
>  t/t1406-submodule-ref-store.sh                     |   1 -
>  t/t1407-worktree-ref-store.sh                      |   1 -
>  t/t1408-packed-refs.sh                             |   1 -
>  t/t1409-avoid-packing-refs.sh                      |   1 -
>  t/t1410-reflog.sh                                  |   1 -
>  t/t1411-reflog-show.sh                             |   1 -
>  t/t1412-reflog-loop.sh                             |   1 -
>  t/t1413-reflog-detach.sh                           |   1 -
>  t/t1414-reflog-walk.sh                             |   1 -
>  t/t1415-worktree-refs.sh                           |   1 -
>  t/t1416-ref-transaction-hooks.sh                   |   1 -
>  t/t1417-reflog-updateref.sh                        |   1 -
>  t/t1418-reflog-exists.sh                           |   1 -
>  t/t1419-exclude-refs.sh                            |   1 -
>  t/t1420-lost-found.sh                              |   1 -
>  t/t1430-bad-ref-name.sh                            |   1 -
>  t/t1450-fsck.sh                                    |   1 -
>  t/t1451-fsck-buffer.sh                             |   1 -
>  t/t1460-refs-migrate.sh                            |   1 -
>  t/t1500-rev-parse.sh                               |   1 -
>  t/t1501-work-tree.sh                               |   1 -
>  t/t1502-rev-parse-parseopt.sh                      |   1 -
>  t/t1503-rev-parse-verify.sh                        |   1 -
>  t/t1504-ceiling-dirs.sh                            |   1 -
>  t/t1505-rev-parse-last.sh                          |   1 -
>  t/t1506-rev-parse-diagnosis.sh                     |   1 -
>  t/t1507-rev-parse-upstream.sh                      |   1 -
>  t/t1508-at-combinations.sh                         |   1 -
>  t/t1510-repo-setup.sh                              |   1 -
>  t/t1511-rev-parse-caret.sh                         |   1 -
>  t/t1512-rev-parse-disambiguation.sh                |   1 -
>  t/t1513-rev-parse-prefix.sh                        |   1 -
>  t/t1514-rev-parse-push.sh                          |   1 -
>  t/t1515-rev-parse-outside-repo.sh                  |   1 -
>  t/t1517-outside-repo.sh                            |   1 -
>  t/t1600-index.sh                                   |   1 -
>  t/t1601-index-bogus.sh                             |   1 -
>  t/t1701-racy-split-index.sh                        |   1 -
>  t/t1800-hook.sh                                    |   1 -
>  t/t2000-conflict-when-checking-files-out.sh        |   1 -
>  t/t2002-checkout-cache-u.sh                        |   1 -
>  t/t2003-checkout-cache-mkdir.sh                    |   1 -
>  t/t2004-checkout-cache-temp.sh                     |   1 -
>  t/t2005-checkout-index-symlinks.sh                 |   1 -
>  t/t2006-checkout-index-basic.sh                    |   1 -
>  t/t2007-checkout-symlink.sh                        |   1 -
>  t/t2008-checkout-subdir.sh                         |   1 -
>  t/t2009-checkout-statinfo.sh                       |   1 -
>  t/t2010-checkout-ambiguous.sh                      |   1 -
>  t/t2011-checkout-invalid-head.sh                   |   1 -
>  t/t2012-checkout-last.sh                           |   1 -
>  t/t2013-checkout-submodule.sh                      |   1 -
>  t/t2014-checkout-switch.sh                         |   1 -
>  t/t2015-checkout-unborn.sh                         |   1 -
>  t/t2016-checkout-patch.sh                          |   1 -
>  t/t2017-checkout-orphan.sh                         |   1 -
>  t/t2018-checkout-branch.sh                         |   1 -
>  t/t2019-checkout-ambiguous-ref.sh                  |   1 -
>  t/t2020-checkout-detach.sh                         |   1 -
>  t/t2021-checkout-overwrite.sh                      |   1 -
>  t/t2022-checkout-paths.sh                          |   1 -
>  t/t2023-checkout-m.sh                              |   1 -
>  t/t2024-checkout-dwim.sh                           |   1 -
>  t/t2025-checkout-no-overlay.sh                     |   1 -
>  t/t2026-checkout-pathspec-file.sh                  |   1 -
>  t/t2027-checkout-track.sh                          |   1 -
>  t/t2030-unresolve-info.sh                          |   1 -
>  t/t2050-git-dir-relative.sh                        |   1 -
>  t/t2060-switch.sh                                  |   1 -
>  t/t2070-restore.sh                                 |   1 -
>  t/t2071-restore-patch.sh                           |   1 -
>  t/t2072-restore-pathspec-file.sh                   |   1 -
>  t/t2080-parallel-checkout-basics.sh                |   1 -
>  t/t2081-parallel-checkout-collisions.sh            |   1 -
>  t/t2082-parallel-checkout-attributes.sh            |   1 -
>  t/t2100-update-cache-badpath.sh                    |   1 -
>  t/t2101-update-index-reupdate.sh                   |   1 -
>  t/t2102-update-index-symlinks.sh                   |   1 -
>  t/t2103-update-index-ignore-missing.sh             |   1 -
>  t/t2104-update-index-skip-worktree.sh              |   1 -
>  t/t2105-update-index-gitfile.sh                    |   1 -
>  t/t2106-update-index-assume-unchanged.sh           |   1 -
>  t/t2107-update-index-basic.sh                      |   1 -
>  t/t2108-update-index-refresh-racy.sh               |   1 -
>  t/t2200-add-update.sh                              |   1 -
>  t/t2201-add-update-typechange.sh                   |   1 -
>  t/t2202-add-addremove.sh                           |   1 -
>  t/t2203-add-intent.sh                              |   1 -
>  t/t2204-add-ignored.sh                             |   1 -
>  t/t2205-add-worktree-config.sh                     |   1 -
>  t/t2300-cd-to-toplevel.sh                          |   1 -
>  t/t2400-worktree-add.sh                            |   1 -
>  t/t2401-worktree-prune.sh                          |   1 -
>  t/t2402-worktree-list.sh                           |   1 -
>  t/t2403-worktree-move.sh                           |   1 -
>  t/t2404-worktree-config.sh                         |   1 -
>  t/t2405-worktree-submodule.sh                      |   1 -
>  t/t2406-worktree-repair.sh                         |   1 -
>  t/t2407-worktree-heads.sh                          |  17 ++-
>  t/t2408-worktree-relative.sh                       |   1 -
>  t/t2500-untracked-overwriting.sh                   |   1 -
>  t/t2501-cwd-empty.sh                               |   1 -
>  t/t3000-ls-files-others.sh                         |   1 -
>  t/t3001-ls-files-others-exclude.sh                 |   1 -
>  t/t3002-ls-files-dashpath.sh                       |   1 -
>  t/t3003-ls-files-exclude.sh                        |   1 -
>  t/t3004-ls-files-basic.sh                          |   1 -
>  t/t3005-ls-files-relative.sh                       |   1 -
>  t/t3006-ls-files-long.sh                           |   1 -
>  t/t3007-ls-files-recurse-submodules.sh             |   1 -
>  t/t3008-ls-files-lazy-init-name-hash.sh            |   1 -
>  t/t3009-ls-files-others-nonsubmodule.sh            |   1 -
>  t/t3010-ls-files-killed-modified.sh                |   1 -
>  t/t3011-common-prefixes-and-directory-traversal.sh |   1 -
>  t/t3012-ls-files-dedup.sh                          |   1 -
>  t/t3013-ls-files-format.sh                         |   1 -
>  t/t3020-ls-files-error-unmatch.sh                  |   1 -
>  t/t3040-subprojects-basic.sh                       |   1 -
>  t/t3050-subprojects-fetch.sh                       |   1 -
>  t/t3060-ls-files-with-tree.sh                      |   1 -
>  t/t3070-wildmatch.sh                               |   1 -
>  t/t3100-ls-tree-restrict.sh                        |   1 -
>  t/t3101-ls-tree-dirname.sh                         |   1 -
>  t/t3102-ls-tree-wildcards.sh                       |   1 -
>  t/t3103-ls-tree-misc.sh                            |   1 -
>  t/t3104-ls-tree-format.sh                          |   1 -
>  t/t3105-ls-tree-output.sh                          |   1 -
>  t/t3200-branch.sh                                  |   1 -
>  t/t3201-branch-contains.sh                         |   1 -
>  t/t3202-show-branch.sh                             |   1 -
>  t/t3203-branch-output.sh                           |   1 -
>  t/t3204-branch-name-interpretation.sh              |   1 -
>  t/t3205-branch-color.sh                            |   1 -
>  t/t3206-range-diff.sh                              |   1 -
>  t/t3207-branch-submodule.sh                        |   1 -
>  t/t3211-peel-ref.sh                                |   1 -
>  t/t3300-funny-names.sh                             |   1 -
>  t/t3301-notes.sh                                   |   1 -
>  t/t3302-notes-index-expensive.sh                   |   1 -
>  t/t3303-notes-subtrees.sh                          |   1 -
>  t/t3304-notes-mixed.sh                             |   1 -
>  t/t3305-notes-fanout.sh                            |   1 -
>  t/t3306-notes-prune.sh                             |   1 -
>  t/t3307-notes-man.sh                               |   1 -
>  t/t3308-notes-merge.sh                             |   1 -
>  t/t3309-notes-merge-auto-resolve.sh                |   1 -
>  t/t3310-notes-merge-manual-resolve.sh              |   1 -
>  t/t3311-notes-merge-fanout.sh                      |   1 -
>  t/t3320-notes-merge-worktrees.sh                   |   1 -
>  t/t3321-notes-stripspace.sh                        |   1 -
>  t/t3400-rebase.sh                                  |   1 -
>  t/t3401-rebase-and-am-rename.sh                    |   1 -
>  t/t3402-rebase-merge.sh                            |   1 -
>  t/t3403-rebase-skip.sh                             |   1 -
>  t/t3404-rebase-interactive.sh                      |   1 -
>  t/t3405-rebase-malformed.sh                        |   1 -
>  t/t3406-rebase-message.sh                          |   1 -
>  t/t3407-rebase-abort.sh                            |   1 -
>  t/t3408-rebase-multi-line.sh                       |   1 -
>  t/t3409-rebase-environ.sh                          |   1 -
>  t/t3412-rebase-root.sh                             |   1 -
>  t/t3413-rebase-hook.sh                             |   1 -
>  t/t3415-rebase-autosquash.sh                       |   1 -
>  t/t3416-rebase-onto-threedots.sh                   |   1 -
>  t/t3417-rebase-whitespace-fix.sh                   |   1 -
>  t/t3418-rebase-continue.sh                         |   1 -
>  t/t3419-rebase-patch-id.sh                         |   1 -
>  t/t3420-rebase-autostash.sh                        |   1 -
>  t/t3421-rebase-topology-linear.sh                  |   1 -
>  t/t3422-rebase-incompatible-options.sh             |   1 -
>  t/t3423-rebase-reword.sh                           |   1 -
>  t/t3424-rebase-empty.sh                            |   1 -
>  t/t3425-rebase-topology-merges.sh                  |   1 -
>  t/t3426-rebase-submodule.sh                        |   1 -
>  t/t3427-rebase-subtree.sh                          |   1 -
>  t/t3428-rebase-signoff.sh                          |   1 -
>  t/t3429-rebase-edit-todo.sh                        |   1 -
>  t/t3430-rebase-merges.sh                           |   1 -
>  t/t3431-rebase-fork-point.sh                       |   1 -
>  t/t3432-rebase-fast-forward.sh                     |   1 -
>  t/t3433-rebase-across-mode-change.sh               |   1 -
>  t/t3434-rebase-i18n.sh                             |   1 -
>  t/t3435-rebase-gpg-sign.sh                         |   1 -
>  t/t3436-rebase-more-options.sh                     |   1 -
>  t/t3437-rebase-fixup-options.sh                    |   1 -
>  t/t3438-rebase-broken-files.sh                     |   1 -
>  t/t3500-cherry.sh                                  |   1 -
>  t/t3501-revert-cherry-pick.sh                      |   1 -
>  t/t3502-cherry-pick-merge.sh                       |   1 -
>  t/t3503-cherry-pick-root.sh                        |   1 -
>  t/t3504-cherry-pick-rerere.sh                      |   1 -
>  t/t3505-cherry-pick-empty.sh                       |   1 -
>  t/t3506-cherry-pick-ff.sh                          |   1 -
>  t/t3507-cherry-pick-conflict.sh                    |   1 -
>  t/t3508-cherry-pick-many-commits.sh                |   1 -
>  t/t3509-cherry-pick-merge-df.sh                    |   1 -
>  t/t3510-cherry-pick-sequence.sh                    |   1 -
>  t/t3511-cherry-pick-x.sh                           |   1 -
>  t/t3512-cherry-pick-submodule.sh                   |   1 -
>  t/t3513-revert-submodule.sh                        |   1 -
>  t/t3514-cherry-pick-revert-gpg.sh                  |   1 -
>  t/t3600-rm.sh                                      |   1 -
>  t/t3601-rm-pathspec-file.sh                        |   1 -
>  t/t3602-rm-sparse-checkout.sh                      |   1 -
>  t/t3650-replay-basics.sh                           |   1 -
>  t/t3700-add.sh                                     |   1 -
>  t/t3701-add-interactive.sh                         |   1 -
>  t/t3702-add-edit.sh                                |   1 -
>  t/t3703-add-magic-pathspec.sh                      |   1 -
>  t/t3704-add-pathspec-file.sh                       |   1 -
>  t/t3705-add-sparse-checkout.sh                     |   1 -
>  t/t3800-mktag.sh                                   |   1 -
>  t/t3900-i18n-commit.sh                             |   1 -
>  t/t3901-i18n-patch.sh                              |   1 -
>  t/t3902-quoted.sh                                  |   1 -
>  t/t3903-stash.sh                                   |   1 -
>  t/t3904-stash-patch.sh                             |   1 -
>  t/t3905-stash-include-untracked.sh                 |   1 -
>  t/t3906-stash-submodule.sh                         |   1 -
>  t/t3907-stash-show-config.sh                       |   1 -
>  t/t3908-stash-in-worktree.sh                       |   1 -
>  t/t3909-stash-pathspec-file.sh                     |   1 -
>  t/t3920-crlf-messages.sh                           |   1 -
>  t/t4000-diff-format.sh                             |   1 -
>  t/t4001-diff-rename.sh                             |   1 -
>  t/t4002-diff-basic.sh                              |   1 -
>  t/t4003-diff-rename-1.sh                           |   1 -
>  t/t4004-diff-rename-symlink.sh                     |   1 -
>  t/t4005-diff-rename-2.sh                           |   1 -
>  t/t4006-diff-mode.sh                               |   1 -
>  t/t4007-rename-3.sh                                |   1 -
>  t/t4008-diff-break-rewrite.sh                      |   1 -
>  t/t4009-diff-rename-4.sh                           |   1 -
>  t/t4010-diff-pathspec.sh                           |   1 -
>  t/t4011-diff-symlink.sh                            |   1 -
>  t/t4012-diff-binary.sh                             |   1 -
>  t/t4013-diff-various.sh                            |   1 -
>  t/t4014-format-patch.sh                            |   1 -
>  t/t4015-diff-whitespace.sh                         |   1 -
>  t/t4016-diff-quote.sh                              |   1 -
>  t/t4017-diff-retval.sh                             |   1 -
>  t/t4018-diff-funcname.sh                           |   1 -
>  t/t4019-diff-wserror.sh                            |   1 -
>  t/t4020-diff-external.sh                           |   5 +-
>  t/t4021-format-patch-numbered.sh                   |   1 -
>  t/t4022-diff-rewrite.sh                            |   1 -
>  t/t4023-diff-rename-typechange.sh                  |   1 -
>  t/t4024-diff-optimize-common.sh                    |   1 -
>  t/t4025-hunk-header.sh                             |   1 -
>  t/t4026-color.sh                                   |   1 -
>  t/t4027-diff-submodule.sh                          |   1 -
>  t/t4028-format-patch-mime-headers.sh               |   1 -
>  t/t4029-diff-trailing-space.sh                     |   1 -
>  t/t4030-diff-textconv.sh                           |   1 -
>  t/t4031-diff-rewrite-binary.sh                     |   1 -
>  t/t4032-diff-inter-hunk-context.sh                 |   1 -
>  t/t4033-diff-patience.sh                           |   1 -
>  t/t4034-diff-words.sh                              |   1 -
>  t/t4035-diff-quiet.sh                              |   1 -
>  t/t4036-format-patch-signer-mime.sh                |   1 -
>  t/t4037-diff-r-t-dirs.sh                           |   1 -
>  t/t4038-diff-combined.sh                           |   1 -
>  t/t4039-diff-assume-unchanged.sh                   |   1 -
>  t/t4040-whitespace-status.sh                       |   1 -
>  t/t4041-diff-submodule-option.sh                   |   1 -
>  t/t4042-diff-textconv-caching.sh                   |   1 -
>  t/t4043-diff-rename-binary.sh                      |   1 -
>  t/t4044-diff-index-unique-abbrev.sh                |   1 -
>  t/t4045-diff-relative.sh                           |   1 -
>  t/t4046-diff-unmerged.sh                           |   1 -
>  t/t4047-diff-dirstat.sh                            |   1 -
>  t/t4048-diff-combined-binary.sh                    |   1 -
>  t/t4049-diff-stat-count.sh                         |   1 -
>  t/t4050-diff-histogram.sh                          |   1 -
>  t/t4051-diff-function-context.sh                   |   1 -
>  t/t4052-stat-output.sh                             |   1 -
>  t/t4053-diff-no-index.sh                           |   1 -
>  t/t4054-diff-bogus-tree.sh                         |   1 -
>  t/t4055-diff-context.sh                            |   1 -
>  t/t4056-diff-order.sh                              |   1 -
>  t/t4057-diff-combined-paths.sh                     |   1 -
>  t/t4058-diff-duplicates.sh                         |   1 -
>  t/t4059-diff-submodule-not-initialized.sh          |   1 -
>  t/t4060-diff-submodule-option-diff-format.sh       |   1 -
>  t/t4061-diff-indent.sh                             |   1 -
>  t/t4062-diff-pickaxe.sh                            |   1 -
>  t/t4063-diff-blobs.sh                              |   1 -
>  t/t4064-diff-oidfind.sh                            |   1 -
>  t/t4065-diff-anchored.sh                           |   1 -
>  t/t4066-diff-emit-delay.sh                         |   1 -
>  t/t4067-diff-partial-clone.sh                      |   1 -
>  t/t4068-diff-symmetric-merge-base.sh               |   1 -
>  t/t4069-remerge-diff.sh                            |   1 -
>  t/t4100-apply-stat.sh                              |   1 -
>  t/t4101-apply-nonl.sh                              |   1 -
>  t/t4102-apply-rename.sh                            |   1 -
>  t/t4103-apply-binary.sh                            |   1 -
>  t/t4104-apply-boundary.sh                          |   1 -
>  t/t4105-apply-fuzz.sh                              |   1 -
>  t/t4106-apply-stdin.sh                             |   1 -
>  t/t4107-apply-ignore-whitespace.sh                 |   1 -
>  t/t4108-apply-threeway.sh                          |   1 -
>  t/t4109-apply-multifrag.sh                         |   1 -
>  t/t4110-apply-scan.sh                              |   1 -
>  t/t4111-apply-subdir.sh                            |   1 -
>  t/t4112-apply-renames.sh                           |   1 -
>  t/t4113-apply-ending.sh                            |   1 -
>  t/t4114-apply-typechange.sh                        |   1 -
>  t/t4115-apply-symlink.sh                           |   1 -
>  t/t4116-apply-reverse.sh                           |   1 -
>  t/t4117-apply-reject.sh                            |   1 -
>  t/t4118-apply-empty-context.sh                     |   1 -
>  t/t4119-apply-config.sh                            |   1 -
>  t/t4120-apply-popt.sh                              |   1 -
>  t/t4121-apply-diffs.sh                             |   1 -
>  t/t4122-apply-symlink-inside.sh                    |   1 -
>  t/t4123-apply-shrink.sh                            |   1 -
>  t/t4124-apply-ws-rule.sh                           |   1 -
>  t/t4125-apply-ws-fuzz.sh                           |   1 -
>  t/t4126-apply-empty.sh                             |   1 -
>  t/t4127-apply-same-fn.sh                           |   1 -
>  t/t4128-apply-root.sh                              |   1 -
>  t/t4129-apply-samemode.sh                          |   1 -
>  t/t4130-apply-criss-cross-rename.sh                |   1 -
>  t/t4131-apply-fake-ancestor.sh                     |   1 -
>  t/t4132-apply-removal.sh                           |   1 -
>  t/t4133-apply-filenames.sh                         |   1 -
>  t/t4134-apply-submodule.sh                         |   1 -
>  t/t4135-apply-weird-filenames.sh                   |   1 -
>  t/t4136-apply-check.sh                             |   1 -
>  t/t4137-apply-submodule.sh                         |   1 -
>  t/t4138-apply-ws-expansion.sh                      |   1 -
>  t/t4139-apply-escape.sh                            |   1 -
>  t/t4140-apply-ita.sh                               |   1 -
>  t/t4141-apply-too-large.sh                         |   1 -
>  t/t4150-am.sh                                      |   1 -
>  t/t4151-am-abort.sh                                |   1 -
>  t/t4152-am-subjects.sh                             |   1 -
>  t/t4153-am-resume-override-opts.sh                 |   1 -
>  t/t4200-rerere.sh                                  |   1 -
>  t/t4201-shortlog.sh                                |   1 -
>  t/t4202-log.sh                                     |   1 -
>  t/t4203-mailmap.sh                                 |   1 -
>  t/t4204-patch-id.sh                                |   1 -
>  t/t4205-log-pretty-formats.sh                      |   1 -
>  t/t4206-log-follow-harder-copies.sh                |   1 -
>  t/t4207-log-decoration-colors.sh                   |   1 -
>  t/t4208-log-magic-pathspec.sh                      |   1 -
>  t/t4209-log-pickaxe.sh                             |   1 -
>  t/t4210-log-i18n.sh                                |   1 -
>  t/t4212-log-corrupt.sh                             |   1 -
>  t/t4213-log-tabexpand.sh                           |   1 -
>  t/t4214-log-graph-octopus.sh                       |   1 -
>  t/t4215-log-skewed-merges.sh                       |   1 -
>  t/t4216-log-bloom.sh                               |   1 -
>  t/t4217-log-limit.sh                               |   1 -
>  t/t4252-am-options.sh                              |   1 -
>  t/t4253-am-keep-cr-dos.sh                          |   1 -
>  t/t4254-am-corrupt.sh                              |   1 -
>  t/t4255-am-submodule.sh                            |   1 -
>  t/t4256-am-format-flowed.sh                        |   1 -
>  t/t4257-am-interactive.sh                          |   1 -
>  t/t4258-am-quoted-cr.sh                            |   1 -
>  t/t4300-merge-tree.sh                              |   1 -
>  t/t4301-merge-tree-write-tree.sh                   |   1 -
>  t/t5000-tar-tree.sh                                |   1 -
>  t/t5001-archive-attr.sh                            |   1 -
>  t/t5002-archive-attr-pattern.sh                    |   1 -
>  t/t5003-archive-zip.sh                             |   1 -
>  t/t5004-archive-corner-cases.sh                    |   1 -
>  t/t5100-mailinfo.sh                                |   1 -
>  t/t5150-request-pull.sh                            |   1 -
>  t/t5200-update-server-info.sh                      |   1 -
>  t/t5300-pack-object.sh                             |   1 -
>  t/t5301-sliding-window.sh                          |   1 -
>  t/t5302-pack-index.sh                              |   1 -
>  t/t5303-pack-corruption-resilience.sh              |   1 -
>  t/t5304-prune.sh                                   |   1 -
>  t/t5305-include-tag.sh                             |   1 -
>  t/t5306-pack-nobase.sh                             |   1 -
>  t/t5307-pack-missing-commit.sh                     |   1 -
>  t/t5308-pack-detect-duplicates.sh                  |   1 -
>  t/t5309-pack-delta-cycles.sh                       |   1 -
>  t/t5310-pack-bitmaps.sh                            |   1 -
>  t/t5311-pack-bitmaps-shallow.sh                    |   1 -
>  t/t5312-prune-corruption.sh                        |   1 -
>  t/t5313-pack-bounds-checks.sh                      |   1 -
>  t/t5314-pack-cycle-detection.sh                    |   1 -
>  t/t5315-pack-objects-compression.sh                |   1 -
>  t/t5316-pack-delta-depth.sh                        |   1 -
>  t/t5317-pack-objects-filter-objects.sh             |   1 -
>  t/t5318-commit-graph.sh                            |   1 -
>  t/t5319-multi-pack-index.sh                        |   1 -
>  t/t5320-delta-islands.sh                           |   1 -
>  t/t5321-pack-large-objects.sh                      |   1 -
>  t/t5322-pack-objects-sparse.sh                     |   1 -
>  t/t5323-pack-redundant.sh                          |   1 -
>  t/t5324-split-commit-graph.sh                      |   1 -
>  t/t5325-reverse-index.sh                           |   1 -
>  t/t5326-multi-pack-bitmaps.sh                      |   1 -
>  t/t5327-multi-pack-bitmaps-rev.sh                  |   1 -
>  t/t5328-commit-graph-64bit-time.sh                 |   1 -
>  t/t5329-pack-objects-cruft.sh                      |   1 -
>  t/t5330-no-lazy-fetch-with-commit-graph.sh         |   1 -
>  t/t5331-pack-objects-stdin.sh                      |   1 -
>  t/t5332-multi-pack-reuse.sh                        |   1 -
>  t/t5333-pseudo-merge-bitmaps.sh                    |   1 -
>  t/t5334-incremental-multi-pack-index.sh            |   1 -
>  t/t5351-unpack-large-objects.sh                    |   1 -
>  t/t5400-send-pack.sh                               |   1 -
>  t/t5401-update-hooks.sh                            |   1 -
>  t/t5402-post-merge-hook.sh                         |   1 -
>  t/t5403-post-checkout-hook.sh                      |   1 -
>  t/t5404-tracking-branches.sh                       |   1 -
>  t/t5405-send-pack-rewind.sh                        |   1 -
>  t/t5406-remote-rejects.sh                          |   1 -
>  t/t5407-post-rewrite-hook.sh                       |   1 -
>  t/t5408-send-pack-stdin.sh                         |   1 -
>  t/t5409-colorize-remote-messages.sh                |   1 -
>  t/t5410-receive-pack-alternates.sh                 |   1 -
>  t/t5411-proc-receive-hook.sh                       |   1 -
>  t/t5500-fetch-pack.sh                              |   1 -
>  t/t5501-fetch-push-alternates.sh                   |   1 -
>  t/t5502-quickfetch.sh                              |   1 -
>  t/t5503-tagfollow.sh                               |   1 -
>  t/t5504-fetch-receive-strict.sh                    |   1 -
>  t/t5505-remote.sh                                  |   1 -
>  t/t5506-remote-groups.sh                           |   1 -
>  t/t5507-remote-environment.sh                      |   1 -
>  t/t5509-fetch-push-namespaces.sh                   |   1 -
>  t/t5510-fetch.sh                                   |   1 -
>  t/t5511-refspec.sh                                 |   1 -
>  t/t5512-ls-remote.sh                               |   1 -
>  t/t5513-fetch-track.sh                             |   1 -
>  t/t5514-fetch-multiple.sh                          |   1 -
>  t/t5515-fetch-merge-logic.sh                       |   1 -
>  t/t5516-fetch-push.sh                              |   1 -
>  t/t5517-push-mirror.sh                             |   1 -
>  t/t5518-fetch-exit-status.sh                       |   1 -
>  t/t5519-push-alternates.sh                         |   1 -
>  t/t5520-pull.sh                                    |   1 -
>  t/t5521-pull-options.sh                            |   1 -
>  t/t5522-pull-symlink.sh                            |   1 -
>  t/t5523-push-upstream.sh                           |   1 -
>  t/t5524-pull-msg.sh                                |   1 -
>  t/t5525-fetch-tagopt.sh                            |   1 -
>  t/t5526-fetch-submodules.sh                        |   1 -
>  t/t5527-fetch-odd-refs.sh                          |   1 -
>  t/t5528-push-default.sh                            |   1 -
>  t/t5529-push-errors.sh                             |   1 -
>  t/t5530-upload-pack-error.sh                       |   1 -
>  t/t5531-deep-submodule-push.sh                     |   1 -
>  t/t5532-fetch-proxy.sh                             |   1 -
>  t/t5533-push-cas.sh                                |   1 -
>  t/t5534-push-signed.sh                             |   1 -
>  t/t5535-fetch-push-symref.sh                       |   1 -
>  t/t5536-fetch-conflicts.sh                         |   1 -
>  t/t5537-fetch-shallow.sh                           |   1 -
>  t/t5538-push-shallow.sh                            |   1 -
>  t/t5539-fetch-http-shallow.sh                      |   1 -
>  t/t5540-http-push-webdav.sh                        |   1 -
>  t/t5541-http-push-smart.sh                         |   1 -
>  t/t5542-push-http-shallow.sh                       |   1 -
>  t/t5543-atomic-push.sh                             |   1 -
>  t/t5544-pack-objects-hook.sh                       |   1 -
>  t/t5545-push-options.sh                            |   1 -
>  t/t5546-receive-limits.sh                          |   1 -
>  t/t5547-push-quarantine.sh                         |   1 -
>  t/t5548-push-porcelain.sh                          |   1 -
>  t/t5549-fetch-push-http.sh                         |   1 -
>  t/t5550-http-fetch-dumb.sh                         |   1 -
>  t/t5551-http-fetch-smart.sh                        |   1 -
>  t/t5552-skipping-fetch-negotiator.sh               |   1 -
>  t/t5553-set-upstream.sh                            |   1 -
>  t/t5554-noop-fetch-negotiator.sh                   |   1 -
>  t/t5555-http-smart-common.sh                       |   1 -
>  t/t5557-http-get.sh                                |   1 -
>  t/t5560-http-backend-noserver.sh                   |   1 -
>  t/t5561-http-backend.sh                            |   1 -
>  t/t5562-http-backend-content-length.sh             |   1 -
>  t/t5563-simple-http-auth.sh                        |   1 -
>  t/t5564-http-proxy.sh                              |   1 -
>  t/t5570-git-daemon.sh                              |   1 -
>  t/t5571-pre-push-hook.sh                           |   1 -
>  t/t5572-pull-submodule.sh                          |   1 -
>  t/t5573-pull-verify-signatures.sh                  |   1 -
>  t/t5574-fetch-output.sh                            |   1 -
>  t/t5580-unc-paths.sh                               |   1 -
>  t/t5581-http-curl-verbose.sh                       |   1 -
>  t/t5582-fetch-negative-refspec.sh                  |   1 -
>  t/t5583-push-branches.sh                           |   1 -
>  t/t5600-clone-fail-cleanup.sh                      |   1 -
>  t/t5601-clone.sh                                   |  26 +++--
>  t/t5602-clone-remote-exec.sh                       |   1 -
>  t/t5603-clone-dirname.sh                           |   1 -
>  t/t5604-clone-reference.sh                         |   1 -
>  t/t5605-clone-local.sh                             |   1 -
>  t/t5606-clone-options.sh                           |   1 -
>  t/t5607-clone-bundle.sh                            |   1 -
>  t/t5609-clone-branch.sh                            |   1 -
>  t/t5610-clone-detached.sh                          |   1 -
>  t/t5611-clone-config.sh                            |   1 -
>  t/t5612-clone-refspec.sh                           |   1 -
>  t/t5613-info-alternate.sh                          |   1 -
>  t/t5614-clone-submodules-shallow.sh                |   1 -
>  t/t5615-alternate-env.sh                           |   1 -
>  t/t5616-partial-clone.sh                           |   1 -
>  t/t5617-clone-submodules-remote.sh                 |   1 -
>  t/t5618-alternate-refs.sh                          |   1 -
>  t/t5619-clone-local-ambiguous-transport.sh         |   1 -
>  t/t5700-protocol-v1.sh                             |   1 -
>  t/t5701-git-serve.sh                               |   1 -
>  t/t5702-protocol-v2.sh                             |   1 -
>  t/t5703-upload-pack-ref-in-want.sh                 |   1 -
>  t/t5704-protocol-violations.sh                     |   1 -
>  t/t5705-session-id-in-capabilities.sh              |   1 -
>  t/t5730-protocol-v2-bundle-uri-file.sh             |   1 -
>  t/t5731-protocol-v2-bundle-uri-git.sh              |   1 -
>  t/t5732-protocol-v2-bundle-uri-http.sh             |   1 -
>  t/t5750-bundle-uri-parse.sh                        |   1 -
>  t/t5801-remote-helpers.sh                          |   1 -
>  t/t5802-connect-helper.sh                          |   1 -
>  t/t5810-proto-disable-local.sh                     |   1 -
>  t/t5811-proto-disable-git.sh                       |   1 -
>  t/t5812-proto-disable-http.sh                      |   1 -
>  t/t5813-proto-disable-ssh.sh                       |   1 -
>  t/t5814-proto-disable-ext.sh                       |   1 -
>  t/t5815-submodule-protos.sh                        |   1 -
>  t/t5900-repo-selection.sh                          |   1 -
>  t/t6000-rev-list-misc.sh                           |   1 -
>  t/t6001-rev-list-graft.sh                          |   1 -
>  t/t6002-rev-list-bisect.sh                         |   1 -
>  t/t6003-rev-list-topo-order.sh                     |   1 -
>  t/t6004-rev-list-path-optim.sh                     |   1 -
>  t/t6005-rev-list-count.sh                          |   1 -
>  t/t6006-rev-list-format.sh                         |   1 -
>  t/t6007-rev-list-cherry-pick-file.sh               |   1 -
>  t/t6008-rev-list-submodule.sh                      |   1 -
>  t/t6009-rev-list-parent.sh                         |   1 -
>  t/t6010-merge-base.sh                              |   1 -
>  t/t6011-rev-list-with-bad-commit.sh                |   1 -
>  t/t6012-rev-list-simplify.sh                       |   1 -
>  t/t6013-rev-list-reverse-parents.sh                |   1 -
>  t/t6014-rev-list-all.sh                            |   1 -
>  t/t6016-rev-list-graph-simplify-history.sh         |   1 -
>  t/t6017-rev-list-stdin.sh                          |   1 -
>  t/t6018-rev-list-glob.sh                           |   1 -
>  t/t6019-rev-list-ancestry-path.sh                  |   1 -
>  t/t6020-bundle-misc.sh                             |   1 -
>  t/t6021-rev-list-exclude-hidden.sh                 |   1 -
>  t/t6022-rev-list-missing.sh                        |   1 -
>  t/t6040-tracking-info.sh                           |   1 -
>  t/t6041-bisect-submodule.sh                        |   1 -
>  t/t6050-replace.sh                                 |   1 -
>  t/t6060-merge-index.sh                             |   1 -
>  t/t6100-rev-list-in-order.sh                       |   1 -
>  t/t6101-rev-parse-parents.sh                       |   1 -
>  t/t6102-rev-list-unexpected-objects.sh             |   1 -
>  t/t6110-rev-list-sparse.sh                         |   1 -
>  t/t6111-rev-list-treesame.sh                       |   1 -
>  t/t6112-rev-list-filters-objects.sh                |   1 -
>  t/t6113-rev-list-bitmap-filters.sh                 |   1 -
>  t/t6114-keep-packs.sh                              |   1 -
>  t/t6115-rev-list-du.sh                             |   1 -
>  t/t6120-describe.sh                                |   1 -
>  t/t6130-pathspec-noglob.sh                         |   1 -
>  t/t6131-pathspec-icase.sh                          |   1 -
>  t/t6132-pathspec-exclude.sh                        |   1 -
>  t/t6133-pathspec-rev-dwim.sh                       |   1 -
>  t/t6134-pathspec-in-submodule.sh                   |   1 -
>  t/t6135-pathspec-with-attrs.sh                     |   1 -
>  t/t6136-pathspec-in-bare.sh                        |   1 -
>  t/t6200-fmt-merge-msg.sh                           |   1 -
>  t/t6300-for-each-ref.sh                            |   1 -
>  t/t6301-for-each-ref-errors.sh                     |   1 -
>  t/t6302-for-each-ref-filter.sh                     |   1 -
>  t/t6400-merge-df.sh                                |   1 -
>  t/t6401-merge-criss-cross.sh                       |   1 -
>  t/t6402-merge-rename.sh                            |   1 -
>  t/t6403-merge-file.sh                              |   1 -
>  t/t6404-recursive-merge.sh                         |   1 -
>  t/t6405-merge-symlinks.sh                          |   1 -
>  t/t6406-merge-attr.sh                              |   1 -
>  t/t6407-merge-binary.sh                            |   1 -
>  t/t6408-merge-up-to-date.sh                        |   1 -
>  t/t6409-merge-subtree.sh                           |   1 -
>  t/t6411-merge-filemode.sh                          |   1 -
>  t/t6412-merge-large-rename.sh                      |   1 -
>  t/t6413-merge-crlf.sh                              |   1 -
>  t/t6414-merge-rename-nocruft.sh                    |   1 -
>  t/t6415-merge-dir-to-symlink.sh                    |   1 -
>  t/t6416-recursive-corner-cases.sh                  |   1 -
>  t/t6417-merge-ours-theirs.sh                       |   1 -
>  t/t6418-merge-text-auto.sh                         |   1 -
>  t/t6421-merge-partial-clone.sh                     |   1 -
>  t/t6422-merge-rename-corner-cases.sh               |   1 -
>  t/t6423-merge-rename-directories.sh                |   1 -
>  t/t6424-merge-unrelated-index-changes.sh           |   1 -
>  t/t6425-merge-rename-delete.sh                     |   1 -
>  t/t6426-merge-skip-unneeded-updates.sh             |   1 -
>  t/t6427-diff3-conflict-markers.sh                  |   1 -
>  t/t6428-merge-conflicts-sparse.sh                  |   1 -
>  t/t6429-merge-sequence-rename-caching.sh           |   1 -
>  t/t6430-merge-recursive.sh                         |   1 -
>  t/t6431-merge-criscross.sh                         |   1 -
>  t/t6432-merge-recursive-space-options.sh           |   1 -
>  t/t6433-merge-toplevel.sh                          |   1 -
>  t/t6434-merge-recursive-rename-options.sh          |   1 -
>  t/t6435-merge-sparse.sh                            |   1 -
>  t/t6436-merge-overwrite.sh                         |   1 -
>  t/t6437-submodule-merge.sh                         |   1 -
>  t/t6438-submodule-directory-file-conflicts.sh      |   1 -
>  t/t6439-merge-co-error-msgs.sh                     |   1 -
>  t/t6500-gc.sh                                      |   1 -
>  t/t6501-freshen-objects.sh                         |   1 -
>  t/t6600-test-reach.sh                              |   1 -
>  t/t6700-tree-depth.sh                              |   1 -
>  t/t7001-mv.sh                                      |   1 -
>  t/t7002-mv-sparse-checkout.sh                      |   1 -
>  t/t7003-filter-branch.sh                           |   1 -
>  t/t7004-tag.sh                                     |   1 -
>  t/t7005-editor.sh                                  |   1 -
>  t/t7006-pager.sh                                   |   1 -
>  t/t7007-show.sh                                    |   1 -
>  t/t7008-filter-branch-null-sha1.sh                 |   1 -
>  t/t7010-setup.sh                                   |   1 -
>  t/t7011-skip-worktree-reading.sh                   |   1 -
>  t/t7012-skip-worktree-writing.sh                   |   1 -
>  t/t7030-verify-tag.sh                              |   1 -
>  t/t7031-verify-tag-signed-ssh.sh                   |   1 -
>  t/t7060-wtstatus.sh                                |   1 -
>  t/t7061-wtstatus-ignore.sh                         |   1 -
>  t/t7062-wtstatus-ignorecase.sh                     |   1 -
>  t/t7063-status-untracked-cache.sh                  |   1 -
>  t/t7064-wtstatus-pv2.sh                            |   1 -
>  t/t7101-reset-empty-subdirs.sh                     |   1 -
>  t/t7102-reset.sh                                   |   1 -
>  t/t7103-reset-bare.sh                              |   1 -
>  t/t7104-reset-hard.sh                              |   1 -
>  t/t7105-reset-patch.sh                             |   1 -
>  t/t7106-reset-unborn-branch.sh                     |   1 -
>  t/t7107-reset-pathspec-file.sh                     |   1 -
>  t/t7110-reset-merge.sh                             |   1 -
>  t/t7111-reset-table.sh                             |   1 -
>  t/t7112-reset-submodule.sh                         |   1 -
>  t/t7113-post-index-change-hook.sh                  |   1 -
>  t/t7201-co.sh                                      |   1 -
>  t/t7300-clean.sh                                   |   1 -
>  t/t7301-clean-interactive.sh                       |   1 -
>  t/t7400-submodule-basic.sh                         |   1 -
>  t/t7401-submodule-summary.sh                       |   1 -
>  t/t7402-submodule-rebase.sh                        |   1 -
>  t/t7403-submodule-sync.sh                          |   1 -
>  t/t7406-submodule-update.sh                        |   1 -
>  t/t7407-submodule-foreach.sh                       |   1 -
>  t/t7408-submodule-reference.sh                     |   1 -
>  t/t7409-submodule-detached-work-tree.sh            |   1 -
>  t/t7411-submodule-config.sh                        |   1 -
>  t/t7412-submodule-absorbgitdirs.sh                 |   1 -
>  t/t7413-submodule-is-active.sh                     |   1 -
>  t/t7414-submodule-mistakes.sh                      |   1 -
>  t/t7416-submodule-dash-url.sh                      |   1 -
>  t/t7417-submodule-path-url.sh                      |   1 -
>  t/t7418-submodule-sparse-gitmodules.sh             |   1 -
>  t/t7419-submodule-set-branch.sh                    |   1 -
>  t/t7420-submodule-set-url.sh                       |   1 -
>  t/t7421-submodule-summary-add.sh                   |   1 -
>  t/t7422-submodule-output.sh                        |   1 -
>  t/t7423-submodule-symlinks.sh                      |   1 -
>  t/t7424-submodule-mixed-ref-formats.sh             |   1 -
>  t/t7450-bad-git-dotfiles.sh                        |   1 -
>  t/t7500-commit-template-squash-signoff.sh          |   1 -
>  t/t7501-commit-basic-functionality.sh              |   1 -
>  t/t7502-commit-porcelain.sh                        |   1 -
>  t/t7503-pre-commit-and-pre-merge-commit-hooks.sh   |   1 -
>  t/t7504-commit-msg-hook.sh                         |   1 -
>  t/t7505-prepare-commit-msg-hook.sh                 |   1 -
>  t/t7506-status-submodule.sh                        |   1 -
>  t/t7507-commit-verbose.sh                          |   1 -
>  t/t7508-status.sh                                  |   1 -
>  t/t7509-commit-authorship.sh                       |   1 -
>  t/t7510-signed-commit.sh                           |   1 -
>  t/t7511-status-index.sh                            |   1 -
>  t/t7512-status-help.sh                             |   1 -
>  t/t7513-interpret-trailers.sh                      |   1 -
>  t/t7514-commit-patch.sh                            |   1 -
>  t/t7515-status-symlinks.sh                         |   1 -
>  t/t7516-commit-races.sh                            |   1 -
>  t/t7517-per-repo-email.sh                          |   1 -
>  t/t7518-ident-corner-cases.sh                      |   1 -
>  t/t7519-status-fsmonitor.sh                        |   1 -
>  t/t7520-ignored-hook-warning.sh                    |   1 -
>  t/t7521-ignored-mode.sh                            |   1 -
>  t/t7524-commit-summary.sh                          |   1 -
>  t/t7525-status-rename.sh                           |   1 -
>  t/t7526-commit-pathspec-file.sh                    |   1 -
>  t/t7528-signed-commit-ssh.sh                       |   1 -
>  t/t7600-merge.sh                                   |   1 -
>  t/t7601-merge-pull-config.sh                       |   1 -
>  t/t7602-merge-octopus-many.sh                      |   1 -
>  t/t7603-merge-reduce-heads.sh                      |   1 -
>  t/t7604-merge-custom-message.sh                    |   1 -
>  t/t7605-merge-resolve.sh                           |   1 -
>  t/t7606-merge-custom.sh                            |   1 -
>  t/t7607-merge-state.sh                             |   1 -
>  t/t7608-merge-messages.sh                          |   1 -
>  t/t7609-mergetool--lib.sh                          |   1 -
>  t/t7610-mergetool.sh                               |   1 -
>  t/t7611-merge-abort.sh                             |   1 -
>  t/t7612-merge-verify-signatures.sh                 |   1 -
>  t/t7614-merge-signoff.sh                           |   1 -
>  t/t7615-diff-algo-with-mergy-operations.sh         |   1 -
>  t/t7700-repack.sh                                  |   1 -
>  t/t7701-repack-unpack-unreachable.sh               |   1 -
>  t/t7702-repack-cyclic-alternate.sh                 |   1 -
>  t/t7703-repack-geometric.sh                        |   1 -
>  t/t7704-repack-cruft.sh                            |   1 -
>  t/t7800-difftool.sh                                |   1 -
>  t/t7810-grep.sh                                    |   1 -
>  t/t7811-grep-open.sh                               |   1 -
>  t/t7812-grep-icase-non-ascii.sh                    |   1 -
>  t/t7813-grep-icase-iso.sh                          |   1 -
>  t/t7814-grep-recurse-submodules.sh                 |   1 -
>  t/t7815-grep-binary.sh                             |   1 -
>  t/t7816-grep-binary-pattern.sh                     |   1 -
>  t/t7817-grep-sparse-checkout.sh                    |   1 -
>  t/t7900-maintenance.sh                             |   1 -
>  t/t8001-annotate.sh                                |   1 -
>  t/t8002-blame.sh                                   |   1 -
>  t/t8003-blame-corner-cases.sh                      |   1 -
>  t/t8004-blame-with-conflicts.sh                    |   1 -
>  t/t8005-blame-i18n.sh                              |   1 +
>  t/t8006-blame-textconv.sh                          |   1 -
>  t/t8007-cat-file-textconv.sh                       |   1 -
>  t/t8008-blame-formats.sh                           |   1 -
>  t/t8009-blame-vs-topicbranches.sh                  |   1 -
>  t/t8010-cat-file-filters.sh                        |   1 -
>  t/t8011-blame-split-file.sh                        |   1 -
>  t/t8012-blame-colors.sh                            |   1 -
>  t/t8013-blame-ignore-revs.sh                       |   1 -
>  t/t8014-blame-ignore-fuzzy.sh                      |   1 -
>  t/t9001-send-email.sh                              |   1 -
>  t/t9002-column.sh                                  |   1 -
>  t/t9003-help-autocorrect.sh                        |   1 -
>  t/t9200-git-cvsexportcommit.sh                     |   1 -
>  t/t9210-scalar.sh                                  |   1 -
>  t/t9211-scalar-clone.sh                            |   1 -
>  t/t9300-fast-import.sh                             |   1 -
>  t/t9301-fast-import-notes.sh                       |   1 -
>  t/t9302-fast-import-unpack-limit.sh                |   1 -
>  t/t9303-fast-import-compression.sh                 |   1 -
>  t/t9304-fast-import-marks.sh                       |   1 -
>  t/t9350-fast-export.sh                             |   1 -
>  t/t9351-fast-export-anonymize.sh                   |   1 -
>  t/t9400-git-cvsserver-server.sh                    |   1 -
>  t/t9401-git-cvsserver-crlf.sh                      |   1 -
>  t/t9402-git-cvsserver-refs.sh                      |   1 -
>  t/t9500-gitweb-standalone-no-errors.sh             |   1 -
>  t/t9501-gitweb-standalone-http-status.sh           |   1 -
>  t/t9502-gitweb-standalone-parse-output.sh          |   1 -
>  t/t9600-cvsimport.sh                               |   1 -
>  t/t9601-cvsimport-vendor-branch.sh                 |   1 -
>  t/t9602-cvsimport-branches-tags.sh                 |   1 -
>  t/t9603-cvsimport-patchsets.sh                     |   1 -
>  t/t9604-cvsimport-timestamps.sh                    |   1 -
>  t/t9700-perl-git.sh                                |   1 -
>  t/t9800-git-p4-basic.sh                            |   1 -
>  t/t9801-git-p4-branch.sh                           |   1 -
>  t/t9802-git-p4-filetype.sh                         |   1 -
>  t/t9803-git-p4-shell-metachars.sh                  |   1 -
>  t/t9804-git-p4-label.sh                            |   1 -
>  t/t9805-git-p4-skip-submit-edit.sh                 |   1 -
>  t/t9806-git-p4-options.sh                          |   1 -
>  t/t9808-git-p4-chdir.sh                            |   1 -
>  t/t9809-git-p4-client-view.sh                      |   1 -
>  t/t9810-git-p4-rcs.sh                              |   1 -
>  t/t9811-git-p4-label-import.sh                     |   1 -
>  t/t9812-git-p4-wildcards.sh                        |   1 -
>  t/t9813-git-p4-preserve-users.sh                   |   1 -
>  t/t9814-git-p4-rename.sh                           |   1 -
>  t/t9815-git-p4-submit-fail.sh                      |   1 -
>  t/t9816-git-p4-locked.sh                           |   1 -
>  t/t9817-git-p4-exclude.sh                          |   1 -
>  t/t9818-git-p4-block.sh                            |   1 -
>  t/t9819-git-p4-case-folding.sh                     |   1 -
>  t/t9820-git-p4-editor-handling.sh                  |   1 -
>  t/t9821-git-p4-path-variations.sh                  |   1 -
>  t/t9822-git-p4-path-encoding.sh                    |   1 -
>  t/t9823-git-p4-mock-lfs.sh                         |   1 -
>  t/t9825-git-p4-handle-utf16-without-bom.sh         |   1 -
>  t/t9826-git-p4-keep-empty-commits.sh               |   1 -
>  t/t9827-git-p4-change-filetype.sh                  |   1 -
>  t/t9828-git-p4-map-user.sh                         |   1 -
>  t/t9829-git-p4-jobs.sh                             |   1 -
>  t/t9830-git-p4-symlink-dir.sh                      |   1 -
>  t/t9831-git-p4-triggers.sh                         |   1 -
>  t/t9832-unshelve.sh                                |   1 -
>  t/t9833-errors.sh                                  |   1 -
>  t/t9834-git-p4-file-dir-bug.sh                     |   1 -
>  t/t9835-git-p4-metadata-encoding-python2.sh        |   1 -
>  t/t9836-git-p4-metadata-encoding-python3.sh        |   1 -
>  t/t9850-shell.sh                                   |   1 -
>  t/t9901-git-web--browse.sh                         |   1 -
>  t/t9902-completion.sh                              |   1 -
>  t/t9903-bash-prompt.sh                             |   1 -
>  t/test-lib.sh                                      |  72 +-----------
>  t/unit-tests/strvec.c                              |  65 +++++++++++
>  usage.c                                            |  15 ---
>  950 files changed, 366 insertions(+), 1249 deletions(-)
> 
> Range-diff versus v1:
> 
>  1:  09dbc39ffb =  1:  76daa9584b builtin/blame: fix leaking blame entries with `--incremental`
>  2:  15bbe539ea =  2:  6659f0d59b bisect: fix leaking good/bad terms when reading multipe times
>  3:  739e28c864 =  3:  5a9011e1ef bisect: fix leaking string in `handle_bad_merge_base()`
>  4:  fa91eb9dc6 =  4:  3afc0a7bfe bisect: fix leaking `current_bad_oid`
>  5:  4ca01afd9e =  5:  15577aaae6 bisect: fix multiple leaks in `bisect_next_all()`
>  6:  805b91ce20 =  6:  13ddfed4fc bisect: fix leaking commit list items in `check_merge_base()`
>  7:  0f183fb264 !  7:  0bc49ed3bb bisect: fix various cases where we leak commit list items
>     @@ bisect.c: static struct commit_list *skip_away(struct commit_list *list, int cou
>      +			else if (previous)
>      +				result = previous;
>      +			else
>     -+				result =  list;
>     ++				result = list;
>      +			break;
>       		}
>       		previous = cur;
>  8:  163c36c78e =  8:  addba1afce line-log: fix leak when rewriting commit parents
>  9:  c0bcfbd98b =  9:  6e501effad strvec: introduce new `strvec_splice()` function
> 10:  cf0ac084c5 = 10:  2271761621 git: refactor alias handling to use a `struct strvec`
> 11:  c4989aab86 = 11:  7bff5d167f git: refactor builtin handling to use a `struct strvec`
> 12:  483d2951cc = 12:  e93d461504 split-index: fix memory leak in `move_cache_to_base_index()`
> 13:  70b12d6347 = 13:  a0643da6f5 builtin/sparse-checkout: fix leaking sanitized patterns
> 14:  f57d967cd5 = 14:  881feffeb1 help: refactor to not use globals for reading config
> 15:  45aacddc8a <  -:  ---------- help: fix leaking `struct cmdnames`
>  -:  ---------- > 15:  f1bbb676f2 help: fix leaking `struct cmdnames`
> 16:  b61cc4da84 ! 16:  51c7ad993f help: fix leaking return value from `help_unknown_cmd()`
>     @@ help.c: static const char bad_interpreter_advice[] =
>       {
>       	struct help_unknown_cmd_config cfg = { 0 };
>       	int i, n, best_similarity = 0;
>     - 	struct cmdnames main_cmds = { 0 };
>     - 	struct cmdnames other_cmds = { 0 };
>     - 	struct cmdname_help *common_cmds;
>     --	const char *assumed = NULL;
>     -+	char *assumed = NULL;
>     - 
>     - 	read_early_config(the_repository, git_unknown_cmd_config, &cfg);
>     - 
>      @@ help.c: const char *help_unknown_cmd(const char *cmd)
>       			; /* still counting */
>       	}
>       	if (cfg.autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) {
>     --		assumed = main_cmds.names[0]->name;
>     +-		const char *assumed = main_cmds.names[0]->name;
>      -		main_cmds.names[0] = NULL;
>      -		cmdnames_release(&main_cmds);
>     -+		assumed = xstrdup(main_cmds.names[0]->name);
>     ++		char *assumed = xstrdup(main_cmds.names[0]->name);
>      +
>       		fprintf_ln(stderr,
>       			   _("WARNING: You called a Git command named '%s', "
>       			     "which does not exist."),
>     -@@ help.c: const char *help_unknown_cmd(const char *cmd)
>     - 			strbuf_release(&msg);
>     - 			if (!(starts_with(answer, "y") ||
>     - 			      starts_with(answer, "Y"))) {
>     --				assumed = NULL;
>     -+				FREE_AND_NULL(assumed);
>     - 				goto out;
>     - 			}
>     - 		} else {
>      
>       ## help.h ##
>      @@ help.h: void list_all_other_cmds(struct string_list *list);
> 17:  b38a39ef04 = 17:  38a25da315 builtin/help: fix leaks in `check_git_cmd()`
> 18:  cd5cde9acb ! 18:  462c9fc110 builtin/init-db: fix leaking directory paths
>     @@ builtin/init-db.c: int cmd_init_db(int argc,
>      -
>       	flags |= INIT_DB_EXIST_OK;
>      -	return init_db(git_dir, real_git_dir, template_dir, hash_algo,
>     -+	ret =  init_db(git_dir, real_git_dir, template_dir, hash_algo,
>     - 		       ref_storage_format, initial_branch,
>     - 		       init_shared_repository, flags);
>     +-		       ref_storage_format, initial_branch,
>     +-		       init_shared_repository, flags);
>     ++	ret = init_db(git_dir, real_git_dir, template_dir, hash_algo,
>     ++		      ref_storage_format, initial_branch,
>     ++		      init_shared_repository, flags);
>      +
>      +	free(template_dir_to_free);
>      +	free(real_git_dir_to_free);
> 19:  2c7b50461b = 19:  6eabeed343 builtin/branch: fix leaking sorting options
> 20:  6865dda344 = 20:  2a44bbfba3 t/helper: fix leaking commit graph in "read-graph" subcommand
>  -:  ---------- > 21:  fc8a96bac3 global: drop `UNLEAK()` annotation
> 21:  d7d8ece289 ! 22:  10e44976c2 git-compat-util: drop `UNLEAK()` annotation
>     @@ Metadata
>      Author: Patrick Steinhardt <ps@pks.im>
>      
>       ## Commit message ##
>     -    git-compat-util: drop `UNLEAK()` annotation
>     +    git-compat-util: drop now-unused `UNLEAK()` macro
>      
>     -    There are two users of `UNLEAK()` left in our codebase:
>     -
>     -      - In "builtin/clone.c", annotating the `repo` variable. That leak has
>     -        already been fixed though as you can see in the context, where we do
>     -        know to free `repo_to_free`.
>     -
>     -      - In "builtin/diff.c", to unleak entries of the `blob[]` array. That
>     -        leak has also been fixed, because the entries we assign to that
>     -        array come from `rev.pending.objects`, and we do eventually release
>     -        `rev`.
>     -
>     -    This neatly demonstrates one of the issues with `UNLEAK()`: it is quite
>     -    easy for the annotation to become stale. A second issue is that its
>     -    whole intent is to paper over leaks. And while that has been a necessary
>     -    evil in the past, because Git was leaking left and right, it isn't
>     -    really much of an issue nowadays where our test suite has no known leaks
>     +    The `UNLEAK()` macro has been introduced with 0e5bba53af (add UNLEAK
>     +    annotation for reducing leak false positives, 2017-09-08) to help us
>     +    reduce the amount of reported memory leaks in cases we don't care about,
>     +    e.g. when exiting immediately afterwards. We have since removed all of
>     +    its users in favor of freeing the memory and thus don't need the macro
>          anymore.
>      
>     -    Remove the last two users and drop the now-unused `UNLEAK()` annotation.
>     +    Remove it.
>      
>          Signed-off-by: Patrick Steinhardt <ps@pks.im>
>      
>     - ## builtin/clone.c ##
>     -@@ builtin/clone.c: int cmd_clone(int argc,
>     - 	free(dir);
>     - 	free(path);
>     - 	free(repo_to_free);
>     --	UNLEAK(repo);
>     - 	junk_mode = JUNK_LEAVE_ALL;
>     - 
>     - 	transport_ls_refs_options_release(&transport_ls_refs_options);
>     -
>     - ## builtin/diff.c ##
>     -@@ builtin/diff.c: int cmd_diff(int argc,
>     - 	release_revisions(&rev);
>     - 	object_array_clear(&ent);
>     - 	symdiff_release(&sdiff);
>     --	UNLEAK(blob);
>     - 	return result;
>     - }
>     -
>       ## git-compat-util.h ##
>      @@ git-compat-util.h: int cmd_main(int, const char **);
>       int common_exit(const char *file, int line, int code);
> 22:  d52ca35b05 = 23:  218132b7d5 t5601: work around leak sanitizer issue
> 23:  44b48929fb = 24:  832c87a045 t: mark some tests as leak free
> 24:  b1fdbe04be = 25:  5fc1319241 t: remove unneeded !SANITIZE_LEAK prerequisites
> 25:  2b752b71c6 = 26:  06a1e8b27c test-lib: unconditionally enable leak checking
> 26:  53bc5f7d75 = 27:  19428158c8 t: remove TEST_PASSES_SANITIZE_LEAK annotations
This iteration addresses all of my comments.

Thanks again for working on this. And congratulations, it's not even the end of the year and memory leak checks are opt-out.

Show 5 quoted lines
> 
> ---
> base-commit: b0c643d6a710e2b092902a3941655176b358bfd0
> change-id: 20241111-b4-pks-leak-fixes-pt10-a6fa657f4fac
> 
Rubén Justo· Nov 12, 2024, 08:06 UTC · re: Rubén Justo · lore

Re: [PATCH v2 00/27] Memory leak fixes (pt.10, final)

On Tue, Nov 12, 2024 at 12:33:16AM +0100, Rubén Justo wrote:
Show 154 quoted lines
>> Range-diff versus v1:
>>
>>  1:  09dbc39ffb =  1:  76daa9584b builtin/blame: fix leaking blame entries with `--incremental`
>>  2:  15bbe539ea =  2:  6659f0d59b bisect: fix leaking good/bad terms when reading multipe times
>>  3:  739e28c864 =  3:  5a9011e1ef bisect: fix leaking string in `handle_bad_merge_base()`
>>  4:  fa91eb9dc6 =  4:  3afc0a7bfe bisect: fix leaking `current_bad_oid`
>>  5:  4ca01afd9e =  5:  15577aaae6 bisect: fix multiple leaks in `bisect_next_all()`
>>  6:  805b91ce20 =  6:  13ddfed4fc bisect: fix leaking commit list items in `check_merge_base()`
>>  7:  0f183fb264 !  7:  0bc49ed3bb bisect: fix various cases where we leak commit list items
>>     @@ bisect.c: static struct commit_list *skip_away(struct commit_list *list, int cou
>>      +			else if (previous)
>>      +				result = previous;
>>      +			else
>>     -+				result =  list;
>>     ++				result = list;
>>      +			break;
>>       		}
>>       		previous = cur;
>>  8:  163c36c78e =  8:  addba1afce line-log: fix leak when rewriting commit parents
>>  9:  c0bcfbd98b =  9:  6e501effad strvec: introduce new `strvec_splice()` function
>> 10:  cf0ac084c5 = 10:  2271761621 git: refactor alias handling to use a `struct strvec`
>> 11:  c4989aab86 = 11:  7bff5d167f git: refactor builtin handling to use a `struct strvec`
>> 12:  483d2951cc = 12:  e93d461504 split-index: fix memory leak in `move_cache_to_base_index()`
>> 13:  70b12d6347 = 13:  a0643da6f5 builtin/sparse-checkout: fix leaking sanitized patterns
>> 14:  f57d967cd5 = 14:  881feffeb1 help: refactor to not use globals for reading config
>> 15:  45aacddc8a <  -:  ---------- help: fix leaking `struct cmdnames`
>>  -:  ---------- > 15:  f1bbb676f2 help: fix leaking `struct cmdnames`
>> 16:  b61cc4da84 ! 16:  51c7ad993f help: fix leaking return value from `help_unknown_cmd()`
>>     @@ help.c: static const char bad_interpreter_advice[] =
>>       {
>>       	struct help_unknown_cmd_config cfg = { 0 };
>>       	int i, n, best_similarity = 0;
>>     - 	struct cmdnames main_cmds = { 0 };
>>     - 	struct cmdnames other_cmds = { 0 };
>>     - 	struct cmdname_help *common_cmds;
>>     --	const char *assumed = NULL;
>>     -+	char *assumed = NULL;
>>     - 
>>     - 	read_early_config(the_repository, git_unknown_cmd_config, &cfg);
>>     - 
>>      @@ help.c: const char *help_unknown_cmd(const char *cmd)
>>       			; /* still counting */
>>       	}
>>       	if (cfg.autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) {
>>     --		assumed = main_cmds.names[0]->name;
>>     +-		const char *assumed = main_cmds.names[0]->name;
>>      -		main_cmds.names[0] = NULL;
>>      -		cmdnames_release(&main_cmds);
>>     -+		assumed = xstrdup(main_cmds.names[0]->name);
>>     ++		char *assumed = xstrdup(main_cmds.names[0]->name);
>>      +
>>       		fprintf_ln(stderr,
>>       			   _("WARNING: You called a Git command named '%s', "
>>       			     "which does not exist."),
>>     -@@ help.c: const char *help_unknown_cmd(const char *cmd)
>>     - 			strbuf_release(&msg);
>>     - 			if (!(starts_with(answer, "y") ||
>>     - 			      starts_with(answer, "Y"))) {
>>     --				assumed = NULL;
>>     -+				FREE_AND_NULL(assumed);
>>     - 				goto out;
>>     - 			}
>>     - 		} else {
>>      
>>       ## help.h ##
>>      @@ help.h: void list_all_other_cmds(struct string_list *list);
>> 17:  b38a39ef04 = 17:  38a25da315 builtin/help: fix leaks in `check_git_cmd()`
>> 18:  cd5cde9acb ! 18:  462c9fc110 builtin/init-db: fix leaking directory paths
>>     @@ builtin/init-db.c: int cmd_init_db(int argc,
>>      -
>>       	flags |= INIT_DB_EXIST_OK;
>>      -	return init_db(git_dir, real_git_dir, template_dir, hash_algo,
>>     -+	ret =  init_db(git_dir, real_git_dir, template_dir, hash_algo,
>>     - 		       ref_storage_format, initial_branch,
>>     - 		       init_shared_repository, flags);
>>     +-		       ref_storage_format, initial_branch,
>>     +-		       init_shared_repository, flags);
>>     ++	ret = init_db(git_dir, real_git_dir, template_dir, hash_algo,
>>     ++		      ref_storage_format, initial_branch,
>>     ++		      init_shared_repository, flags);
>>      +
>>      +	free(template_dir_to_free);
>>      +	free(real_git_dir_to_free);
>> 19:  2c7b50461b = 19:  6eabeed343 builtin/branch: fix leaking sorting options
>> 20:  6865dda344 = 20:  2a44bbfba3 t/helper: fix leaking commit graph in "read-graph" subcommand
>>  -:  ---------- > 21:  fc8a96bac3 global: drop `UNLEAK()` annotation
>> 21:  d7d8ece289 ! 22:  10e44976c2 git-compat-util: drop `UNLEAK()` annotation
>>     @@ Metadata
>>      Author: Patrick Steinhardt <ps@pks.im>
>>      
>>       ## Commit message ##
>>     -    git-compat-util: drop `UNLEAK()` annotation
>>     +    git-compat-util: drop now-unused `UNLEAK()` macro
>>      
>>     -    There are two users of `UNLEAK()` left in our codebase:
>>     -
>>     -      - In "builtin/clone.c", annotating the `repo` variable. That leak has
>>     -        already been fixed though as you can see in the context, where we do
>>     -        know to free `repo_to_free`.
>>     -
>>     -      - In "builtin/diff.c", to unleak entries of the `blob[]` array. That
>>     -        leak has also been fixed, because the entries we assign to that
>>     -        array come from `rev.pending.objects`, and we do eventually release
>>     -        `rev`.
>>     -
>>     -    This neatly demonstrates one of the issues with `UNLEAK()`: it is quite
>>     -    easy for the annotation to become stale. A second issue is that its
>>     -    whole intent is to paper over leaks. And while that has been a necessary
>>     -    evil in the past, because Git was leaking left and right, it isn't
>>     -    really much of an issue nowadays where our test suite has no known leaks
>>     +    The `UNLEAK()` macro has been introduced with 0e5bba53af (add UNLEAK
>>     +    annotation for reducing leak false positives, 2017-09-08) to help us
>>     +    reduce the amount of reported memory leaks in cases we don't care about,
>>     +    e.g. when exiting immediately afterwards. We have since removed all of
>>     +    its users in favor of freeing the memory and thus don't need the macro
>>          anymore.
>>      
>>     -    Remove the last two users and drop the now-unused `UNLEAK()` annotation.
>>     +    Remove it.
>>      
>>          Signed-off-by: Patrick Steinhardt <ps@pks.im>
>>      
>>     - ## builtin/clone.c ##
>>     -@@ builtin/clone.c: int cmd_clone(int argc,
>>     - 	free(dir);
>>     - 	free(path);
>>     - 	free(repo_to_free);
>>     --	UNLEAK(repo);
>>     - 	junk_mode = JUNK_LEAVE_ALL;
>>     - 
>>     - 	transport_ls_refs_options_release(&transport_ls_refs_options);
>>     -
>>     - ## builtin/diff.c ##
>>     -@@ builtin/diff.c: int cmd_diff(int argc,
>>     - 	release_revisions(&rev);
>>     - 	object_array_clear(&ent);
>>     - 	symdiff_release(&sdiff);
>>     --	UNLEAK(blob);
>>     - 	return result;
>>     - }
>>     -
>>       ## git-compat-util.h ##
>>      @@ git-compat-util.h: int cmd_main(int, const char **);
>>       int common_exit(const char *file, int line, int code);
>> 22:  d52ca35b05 = 23:  218132b7d5 t5601: work around leak sanitizer issue
>> 23:  44b48929fb = 24:  832c87a045 t: mark some tests as leak free
>> 24:  b1fdbe04be = 25:  5fc1319241 t: remove unneeded !SANITIZE_LEAK prerequisites
>> 25:  2b752b71c6 = 26:  06a1e8b27c test-lib: unconditionally enable leak checking
>> 26:  53bc5f7d75 = 27:  19428158c8 t: remove TEST_PASSES_SANITIZE_LEAK annotations
>
> This iteration addresses all of my comments.
>
> Thanks again for working on this.  And congratulations, it's not even
> the end of the year and memory leak checks are opt-out.

Junio, reviewing the range-diff again this morning with what has been queued I noticed this:

    $ git range-diff ea42eb76e7...a0c677023d
    [...]
    25:  67df655518 ! 26:  b2863b3f06 test-lib: unconditionally enable leak checking
        @@ Commit message
             finally fixed the last leak exposed by our test suite, which means that
             we are now basically leak free wherever we have branch coverage.
    
        -    From hereon, the Git test suite should ideally stay free of memory
        +    >From hereon, the Git test suite should ideally stay free of memory
             leaks. Most importantly, any test suite that is being added should
             automatically be subject to the leak checker, and if that test does not
             pass it is a strong signal that the added code introduced new memory
    26:  ea42eb76e7 = 27:  a0c677023d t: remove TEST_PASSES_SANITIZE_LEAK annotations
Show 6 quoted lines
>
>>
>> ---
>> base-commit: b0c643d6a710e2b092902a3941655176b358bfd0
>> change-id: 20241111-b4-pks-leak-fixes-pt10-a6fa657f4fac
>>

← back to recent threads