threads / patch / 62459

patch, 26 partsbuiltin/blame: fix leaking blame entries with `--incremental`

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

## tl;dr

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

replies: 38people: 2as markdown or json

Patrick Steinhardt· Nov 6, 2024, 15:10 UTC · lore

[PATCH 00/26] 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 21 remove the last remaining `UNLEAK()` annotations
    and ultimately remove the macro itself.
  - Patch 22 works around a bug in the leak sanitizer itself.
  - Patches 23 and 24 drop annotations where leak-free tests pass with
    the leak sanitizer.
  - Patches 25 and 26 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.

This series is built on top of 8f8d6eee53 (The seventh batch, 2024-11-01) with ps/leakfixes-part-9 at c810549be1 (list-objects-filter-options: work around reported leak on error, 2024-11-05) merged into it.

The series has some trivial conflicts with the removed test annotations when merging with `seen`. There are two topics in-flight that introduce new memory leaks (ds/path-walk and cc/promisor-remote-capability), both of which are fixed by the below patch. I've sent a message in response to the individual commits that introduce the leaks.

Thanks!
Patrick
Show changes to 2 files +3 −4

promisor-remote.c, t/helper/test-path-walk.c

diff --git a/promisor-remote.c b/promisor-remote.c
index 06507b2ee1..0a4f7f1188 100644
--- a/promisor-remote.c
+++ b/promisor-remote.c
@@ -424,12 +424,12 @@ static void filter_promisor_remote(struct repository *repo,
 				   const char *info)
 {
 	struct strbuf **remotes;
-	char *accept_str;
+	const char *accept_str;
 	enum accept_promisor accept = ACCEPT_NONE;
 	struct strvec names = STRVEC_INIT;
 	struct strvec urls = STRVEC_INIT;
 
-	if (!git_config_get_string("promisor.acceptfromserver", &accept_str)) {
+	if (!git_config_get_string_tmp("promisor.acceptfromserver", &accept_str)) {
 		if (!accept_str || !*accept_str || !strcasecmp("None", accept_str))
 			accept = ACCEPT_NONE;
 		else if (!strcasecmp("KnownUrl", accept_str))
@@ -486,7 +486,6 @@ static void filter_promisor_remote(struct repository *repo,
 		free(decoded_url);
 	}
 
-	free(accept_str);
 	strvec_clear(&names);
 	strvec_clear(&urls);
 	strbuf_list_free(remotes);
diff --git a/t/helper/test-path-walk.c b/t/helper/test-path-walk.c
index 06b103d876..fa3bfe46b5 100644
--- a/t/helper/test-path-walk.c
+++ b/t/helper/test-path-walk.c
@@ -85,7 +85,6 @@ int cmd__path_walk(int argc, const char **argv)
 		OPT_END(),
 	};
 
-	initialize_repository(the_repository);
 	setup_git_directory();
 	revs.repo = the_repository;
 
@@ -110,5 +109,6 @@ int cmd__path_walk(int argc, const char **argv)
 	       "tags:%" PRIuMAX "\n",
 	       data.commit_nr, data.tree_nr, data.blob_nr, data.tag_nr);
 
+	release_revisions(&revs);
 	return res;
 }

Patrick Steinhardt (26):
  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
  git-compat-util: drop `UNLEAK()` annotation
  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                             |  30 +++--
 builtin/sparse-checkout.c                     |  61 +++++----
 ci/lib.sh                                     |   1 -
 git-compat-util.h                             |  20 ---
 git.c                                         | 124 +++++++++---------
 help.c                                        |  76 ++++++-----
 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 -
 ...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 -
 ...3-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, 376 insertions(+), 1253 deletions(-)
-- 
2.47.0.229.g8f8d6eee53.dirty
Patrick Steinhardt· Nov 6, 2024, 15:10 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 90633380cd5..bf69768a7de 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 5b4e47d44c6..3b34be0e5c6 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 e407a22da3b..6a7bb3b0724 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 7a1f581c240..fa765aff99a 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 6, 2024, 15:10 UTC · re: Patrick Steinhardt · lore

[PATCH 02/26] 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 4713226fad4..9c52241050c 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 ee3fd65f3bd..944439bfac7 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 8df75b82249..347dabf7f9a 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 6, 2024, 15:10 UTC · re: Patrick Steinhardt · lore

[PATCH 03/26] 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 9c52241050c..e9e603877eb 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 6, 2024, 15:10 UTC · re: Patrick Steinhardt · lore

[PATCH 04/26] 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 e9e603877eb..6dbc22f84fc 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 6, 2024, 15:10 UTC · re: Patrick Steinhardt · lore

[PATCH 05/26] 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 6dbc22f84fc..04e9a63f11c 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 6, 2024, 15:10 UTC · re: Patrick Steinhardt · lore

[PATCH 06/26] 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 04e9a63f11c..12efcff2e3c 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 6, 2024, 15:10 UTC · re: Patrick Steinhardt · lore

[PATCH 07/26] 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 12efcff2e3c..518be70aa3f 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 cdc02706404..310affadebe 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
Patrick Steinhardt· Nov 6, 2024, 15:10 UTC · re: Patrick Steinhardt · lore

[PATCH 08/26] 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 bca9bd80407..bc67b75d10d 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 950451cf6a6..1d6dd982a2a 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 6, 2024, 15:10 UTC · re: Patrick Steinhardt · lore

[PATCH 09/26] 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 f712070f574..81075c50cca 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 4b73c1f092e..4e61cc93369 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 bf4c0cb172e..855b6023371 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
Rubén Justo· Nov 10, 2024, 21:39 UTC · re: Patrick Steinhardt · lore

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

On Wed, Nov 06, 2024 at 04:10:44PM +0100, Patrick Steinhardt wrote:
Show 21 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 f712070f574..81075c50cca 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)

There's nothing wrong with `replacement_len`, but it has caught my attention because in other strvec APIs we use null-terminated arrays.

Show 119 quoted lines
> +{
> +	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 4b73c1f092e..4e61cc93369 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 bf4c0cb172e..855b6023371 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
> 
Patrick Steinhardt· Nov 11, 2024, 09:09 UTC · re: Rubén Justo · lore

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

On Sun, Nov 10, 2024 at 10:39:08PM +0100, Rubén Justo wrote:
Show 25 quoted lines
> On Wed, Nov 06, 2024 at 04:10:44PM +0100, Patrick Steinhardt wrote:
> > 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 f712070f574..81075c50cca 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)
> 
> There's nothing wrong with `replacement_len`, but it has caught my
> attention because in other strvec APIs we use null-terminated arrays.

Fair enough, but we do end up using this in a subsequent patch, as you discovered in the next patch. So I'll leave this as-is.

Patrick
Patrick Steinhardt· Nov 6, 2024, 15:10 UTC · re: Patrick Steinhardt · lore

[PATCH 10/26] 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 c2c1b8e22c2..88356afe5fb 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 854d59ec58c..2a6f39ad9c8 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
Rubén Justo· Nov 10, 2024, 21:41 UTC · re: Patrick Steinhardt · lore

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

On Wed, Nov 06, 2024 at 04:10:47PM +0100, Patrick Steinhardt wrote:
Show 70 quoted lines
> 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(-)
> 
> diff --git a/git.c b/git.c
> index c2c1b8e22c2..88356afe5fb 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);

So, we take advantage here of the `replacement_len` argument for `strvec_splice()`. OK.

Show 135 quoted lines
> +
> +		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 854d59ec58c..2a6f39ad9c8 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 6, 2024, 15:10 UTC · re: Patrick Steinhardt · lore

[PATCH 11/26] 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 88356afe5fb..159dd45b082 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 dddc130560b..91260ce97e5 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
Patrick Steinhardt· Nov 6, 2024, 15:10 UTC · re: Patrick Steinhardt · lore

[PATCH 12/26] 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 120c8190b18..cfbc773e6cd 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 ac4a5b2734c..2625ac44889 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
Rubén Justo· Nov 10, 2024, 21:45 UTC · re: Patrick Steinhardt · lore

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

On Wed, Nov 06, 2024 at 04:10:52PM +0100, Patrick Steinhardt wrote:
Show 28 quoted lines
> 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(-)
> 
> diff --git a/split-index.c b/split-index.c
> index 120c8190b18..cfbc773e6cd 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);
This change sounded strange to me.  It's like:
   if (si-base) {
   	discard_index(si->base);
   } else {
   	ALLOC_ARRAY(si->base, 1);
   	index_state_init(si->base, istate->repo);
   }
OK.
Show 17 quoted lines
>  	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 ac4a5b2734c..2625ac44889 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 6, 2024, 15:10 UTC · re: Patrick Steinhardt · lore

[PATCH 13/26] 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 49aedc1de81..698d93a9ec5 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 6, 2024, 15:11 UTC · re: Patrick Steinhardt · lore

[PATCH 14/26] 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 4ad4ebdd2cf..8794f81db9b 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 6, 2024, 15:11 UTC · re: Patrick Steinhardt · lore

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

We're populating multiple `struct cmdnames`, but don't ever free them. Create a common exit path where we do so.

Note that this also requires us to use `FREE_AND_NULL()` when freeing `cmdnames::names`, as we may otherwise try to free it multiple times.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 help.c | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)
Show changes to help.c +17 −7
diff --git a/help.c b/help.c
index 8794f81db9b..51adc530d7a 100644
--- a/help.c
+++ b/help.c
@@ -169,7 +169,7 @@ void cmdnames_release(struct cmdnames *cmds)
 	int i;
 	for (i = 0; i < cmds->cnt; ++i)
 		free(cmds->names[i]);
-	free(cmds->names);
+	FREE_AND_NULL(cmds->names);
 	cmds->cnt = 0;
 	cmds->alloc = 0;
 }
@@ -619,6 +619,7 @@ const char *help_unknown_cmd(const char *cmd)
 	struct cmdnames main_cmds = { 0 };
 	struct cmdnames other_cmds = { 0 };
 	struct cmdname_help *common_cmds;
+	const char *assumed = NULL;
 
 	read_early_config(the_repository, git_unknown_cmd_config, &cfg);
 
@@ -630,7 +631,7 @@ const char *help_unknown_cmd(const char *cmd)
 
 	if (cfg.autocorrect == AUTOCORRECT_NEVER) {
 		fprintf_ln(stderr, _("git: '%s' is not a git command. See 'git --help'."), cmd);
-		exit(1);
+		goto out;
 	}
 
 	load_command_list("git-", &main_cmds, &other_cmds);
@@ -695,7 +696,7 @@ 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;
+		assumed = main_cmds.names[0]->name;
 		main_cmds.names[0] = NULL;
 		cmdnames_release(&main_cmds);
 		fprintf_ln(stderr,
@@ -714,8 +715,10 @@ const char *help_unknown_cmd(const char *cmd)
 			answer = git_prompt(msg.buf, PROMPT_ECHO);
 			strbuf_release(&msg);
 			if (!(starts_with(answer, "y") ||
-			      starts_with(answer, "Y")))
-				exit(1);
+			      starts_with(answer, "Y"))) {
+				assumed = NULL;
+				goto out;
+			}
 		} else {
 			fprintf_ln(stderr,
 				   _("Continuing in %0.1f seconds, "
@@ -723,7 +726,8 @@ const char *help_unknown_cmd(const char *cmd)
 				   (float)cfg.autocorrect/10.0, assumed);
 			sleep_millisec(cfg.autocorrect * 100);
 		}
-		return assumed;
+
+		goto out;
 	}
 
 	fprintf_ln(stderr, _("git: '%s' is not a git command. See 'git --help'."), cmd);
@@ -738,7 +742,13 @@ const char *help_unknown_cmd(const char *cmd)
 			fprintf(stderr, "\t%s\n", main_cmds.names[i]->name);
 	}
 
-	exit(1);
+out:
+	cmdnames_release(&cfg.aliases);
+	cmdnames_release(&main_cmds);
+	cmdnames_release(&other_cmds);
+	if (!assumed)
+		exit(1);
+	return assumed;
 }
 
 void get_version_info(struct strbuf *buf, int show_build_options)
-- 
2.47.0.229.g8f8d6eee53.dirty
Rubén Justo· Nov 10, 2024, 21:46 UTC · re: Patrick Steinhardt · lore

Re: [PATCH 15/26] help: fix leaking `struct cmdnames`

On Wed, Nov 06, 2024 at 04:11:03PM +0100, Patrick Steinhardt wrote:
Show 38 quoted lines
> We're populating multiple `struct cmdnames`, but don't ever free them.
> Create a common exit path where we do so.
> 
> Note that this also requires us to use `FREE_AND_NULL()` when freeing
> `cmdnames::names`, as we may otherwise try to free it multiple times.
> 
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
>  help.c | 24 +++++++++++++++++-------
>  1 file changed, 17 insertions(+), 7 deletions(-)
> 
> diff --git a/help.c b/help.c
> index 8794f81db9b..51adc530d7a 100644
> --- a/help.c
> +++ b/help.c
> @@ -169,7 +169,7 @@ void cmdnames_release(struct cmdnames *cmds)
>  	int i;
>  	for (i = 0; i < cmds->cnt; ++i)
>  		free(cmds->names[i]);
> -	free(cmds->names);
> +	FREE_AND_NULL(cmds->names);
>  	cmds->cnt = 0;
>  	cmds->alloc = 0;
>  }
> @@ -619,6 +619,7 @@ const char *help_unknown_cmd(const char *cmd)
>  	struct cmdnames main_cmds = { 0 };
>  	struct cmdnames other_cmds = { 0 };
>  	struct cmdname_help *common_cmds;
> +	const char *assumed = NULL;
>  
>  	read_early_config(the_repository, git_unknown_cmd_config, &cfg);
>  
> @@ -630,7 +631,7 @@ const char *help_unknown_cmd(const char *cmd)
>  
>  	if (cfg.autocorrect == AUTOCORRECT_NEVER) {
>  		fprintf_ln(stderr, _("git: '%s' is not a git command. See 'git --help'."), cmd);
> -		exit(1);
> +		goto out;

We haven't set a value for `assumed` at this point, so it's NULL, and in the new exit path we `exit(1)` when `assumed` is NULL. OK.

However, I think we don't need this change. And keeping the `exit(1)` close to the error message seems like a good idea. Perhaps, in another series, we could change it to `die()`.

Show 22 quoted lines
>  	}
>  
>  	load_command_list("git-", &main_cmds, &other_cmds);
> @@ -695,7 +696,7 @@ 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;
> +		assumed = main_cmds.names[0]->name;
>  		main_cmds.names[0] = NULL;
>  		cmdnames_release(&main_cmds);
>  		fprintf_ln(stderr,
> @@ -714,8 +715,10 @@ const char *help_unknown_cmd(const char *cmd)
>  			answer = git_prompt(msg.buf, PROMPT_ECHO);
>  			strbuf_release(&msg);
>  			if (!(starts_with(answer, "y") ||
> -			      starts_with(answer, "Y")))
> -				exit(1);
> +			      starts_with(answer, "Y"))) {
> +				assumed = NULL;
> +				goto out;
> +			}
OK.  But, as above, I don't think we need to change this either.
Show 10 quoted lines
>  		} else {
>  			fprintf_ln(stderr,
>  				   _("Continuing in %0.1f seconds, "
> @@ -723,7 +726,8 @@ const char *help_unknown_cmd(const char *cmd)
>  				   (float)cfg.autocorrect/10.0, assumed);
>  			sleep_millisec(cfg.autocorrect * 100);
>  		}
> -		return assumed;
> +
> +		goto out;
OK.
Show 15 quoted lines
>  	}
>  
>  	fprintf_ln(stderr, _("git: '%s' is not a git command. See 'git --help'."), cmd);
> @@ -738,7 +742,13 @@ const char *help_unknown_cmd(const char *cmd)
>  			fprintf(stderr, "\t%s\n", main_cmds.names[i]->name);
>  	}
>  
> -	exit(1);
> +out:
> +	cmdnames_release(&cfg.aliases);
> +	cmdnames_release(&main_cmds);
> +	cmdnames_release(&other_cmds);
> +	if (!assumed)
> +		exit(1);
> +	return assumed;
OK.
Show 6 quoted lines
>  }
>  
>  void get_version_info(struct strbuf *buf, int show_build_options)
> -- 
> 2.47.0.229.g8f8d6eee53.dirty
> 
Patrick Steinhardt· Nov 11, 2024, 09:09 UTC · re: Rubén Justo · lore

Re: [PATCH 15/26] help: fix leaking `struct cmdnames`

On Sun, Nov 10, 2024 at 10:46:29PM +0100, Rubén Justo wrote:
Show 14 quoted lines
> On Wed, Nov 06, 2024 at 04:11:03PM +0100, Patrick Steinhardt wrote:
> > @@ -630,7 +631,7 @@ const char *help_unknown_cmd(const char *cmd)
> >  
> >  	if (cfg.autocorrect == AUTOCORRECT_NEVER) {
> >  		fprintf_ln(stderr, _("git: '%s' is not a git command. See 'git --help'."), cmd);
> > -		exit(1);
> > +		goto out;
> 
> We haven't set a value for `assumed` at this point, so it's NULL, and in the
> new exit path we `exit(1)` when `assumed` is NULL.  OK.
> 
> However, I think we don't need this change.  And keeping the `exit(1)` close to
> the error message seems like a good idea.  Perhaps, in another series, we could
> change it to `die()`.
Yeah, good point indeed. I'll adapt this.
Patrick
Patrick Steinhardt· Nov 6, 2024, 15:11 UTC · re: Patrick Steinhardt · lore

[PATCH 16/26] 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 | 11 +++++------
 help.h |  2 +-
 3 files changed, 9 insertions(+), 8 deletions(-)
Show changes to 3 files +9 −8

git.c, help.c, help.h

diff --git a/git.c b/git.c
index 159dd45b082..46b3c740c5d 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 51adc530d7a..0290aba9f38 100644
--- a/help.c
+++ b/help.c
@@ -612,14 +612,14 @@ 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;
 	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);
 
@@ -696,9 +696,8 @@ 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;
-		main_cmds.names[0] = NULL;
-		cmdnames_release(&main_cmds);
+		assumed = xstrdup(main_cmds.names[0]->name);
+
 		fprintf_ln(stderr,
 			   _("WARNING: You called a Git command named '%s', "
 			     "which does not exist."),
@@ -716,7 +715,7 @@ 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 {
diff --git a/help.h b/help.h
index e716ee27ea1..67207b3073c 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 6, 2024, 15:11 UTC · re: Patrick Steinhardt · lore

[PATCH 17/26] 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 4a5a0790704..6a72d991a84 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 6, 2024, 15:11 UTC · re: Patrick Steinhardt · lore

[PATCH 18/26] 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 | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)
Show changes to builtin/init-db.c +17 −13
diff --git a/builtin/init-db.c b/builtin/init-db.c
index 7e00d57d654..9e069e27426 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,
+	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
Rubén Justo· Nov 10, 2024, 21:47 UTC · re: Patrick Steinhardt · lore

Re: [PATCH 18/26] builtin/init-db: fix leaking directory paths

On Wed, Nov 06, 2024 at 04:11:11PM +0100, Patrick Steinhardt wrote:
Show 75 quoted lines
> 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 | 30 +++++++++++++++++-------------
>  1 file changed, 17 insertions(+), 13 deletions(-)
> 
> diff --git a/builtin/init-db.c b/builtin/init-db.c
> index 7e00d57d654..9e069e27426 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);

We were doing this, out of simplicity, even in cases where it wasn't necessary ...

> -	UNLEAK(work_tree);
... and this line is now the `free()` we are doing below.
OK.  Nice clean up.
Show 16 quoted lines
> -
>  	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);
> +
> +	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 6, 2024, 15:11 UTC · re: Patrick Steinhardt · lore

[PATCH 19/26] 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 fd1611ebf55..05ba4cd7a64 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
Rubén Justo· Nov 10, 2024, 21:47 UTC · re: Patrick Steinhardt · lore

Re: [PATCH 19/26] builtin/branch: fix leaking sorting options

On Wed, Nov 06, 2024 at 04:11:16PM +0100, Patrick Steinhardt wrote:
Show 56 quoted lines
> 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(-)
> 
> diff --git a/builtin/branch.c b/builtin/branch.c
> index fd1611ebf55..05ba4cd7a64 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 */
Now we assume failure ...
Show 19 quoted lines
>  
>  		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;
... here.  OK.
Show 33 quoted lines
> +		}
>  
>  		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 6, 2024, 15:11 UTC · re: Patrick Steinhardt · lore

[PATCH 20/26] 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 9018c9f5412..811dde1cb3c 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 6, 2024, 15:11 UTC · re: Patrick Steinhardt · lore

[PATCH 21/26] git-compat-util: 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 and drop the now-unused `UNLEAK()` annotation.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 builtin/clone.c   |  1 -
 builtin/diff.c    |  1 -
 git-compat-util.h | 20 --------------------
 usage.c           | 15 ---------------
 4 files changed, 37 deletions(-)
Show changes to 4 files +0 −37

builtin/clone.c, builtin/diff.c, git-compat-util.h, usage.c

diff --git a/builtin/clone.c b/builtin/clone.c
index 59fcb317a68..e851b1475d7 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 dca52d4221e..2fe92f373e9 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;
 }
diff --git a/git-compat-util.h b/git-compat-util.h
index e4a306dd563..a06d4f3809e 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 7a2f7805f57..29a9725784a 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
Rubén Justo· Nov 10, 2024, 21:47 UTC · re: Patrick Steinhardt · lore

Re: [PATCH 21/26] git-compat-util: drop `UNLEAK()` annotation

On Wed, Nov 06, 2024 at 04:11:21PM +0100, Patrick Steinhardt wrote:
Show 19 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`.
> 
> 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
OK.
> and drop the now-unused `UNLEAK()` annotation.
Perhaps it would be convenient to do this as a separate commit.

Just for reference we have this annotation since 0e5bba53af (add UNLEAK annotation for reducing leak false positives, 2017-09-08).

Show 89 quoted lines
> 
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
>  builtin/clone.c   |  1 -
>  builtin/diff.c    |  1 -
>  git-compat-util.h | 20 --------------------
>  usage.c           | 15 ---------------
>  4 files changed, 37 deletions(-)
> 
> diff --git a/builtin/clone.c b/builtin/clone.c
> index 59fcb317a68..e851b1475d7 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 dca52d4221e..2fe92f373e9 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;
>  }
> diff --git a/git-compat-util.h b/git-compat-util.h
> index e4a306dd563..a06d4f3809e 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 7a2f7805f57..29a9725784a 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, 09:09 UTC · re: Rubén Justo · lore

Re: [PATCH 21/26] git-compat-util: drop `UNLEAK()` annotation

On Sun, Nov 10, 2024 at 10:47:58PM +0100, Rubén Justo wrote:
Show 29 quoted lines
> On Wed, Nov 06, 2024 at 04:11:21PM +0100, Patrick Steinhardt wrote:
> > 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
> 
> OK.
> 
> > and drop the now-unused `UNLEAK()` annotation.
> 
> Perhaps it would be convenient to do this as a separate commit.
> 
> Just for reference we have this annotation since 0e5bba53af (add
> UNLEAK annotation for reducing leak false positives, 2017-09-08).
Makes sense, will do.
Patrick
Patrick Steinhardt· Nov 6, 2024, 15:11 UTC · re: Patrick Steinhardt · lore

[PATCH 22/26] 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 9fe665eadfb..d0c18660e33 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 6, 2024, 15:11 UTC · re: Patrick Steinhardt · lore

[PATCH 23/26] 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 3816ed5058d..b488b505b92 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 d0c18660e33..3b5285cfcf3 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 6, 2024, 15:11 UTC · re: Patrick Steinhardt · lore

[PATCH 24/26] 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 c8d84ab6061..08df74cacfc 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 f6835c91dcc..7750dc9265a 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 3baa52a9bf6..0e5a05894fd 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 6, 2024, 15:11 UTC · re: Patrick Steinhardt · lore

[PATCH 25/26] 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 246072a0932..930f98d7228 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 8c0319b58e5..e84824dc002 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 ea28971e8ee..2fde2353fd3 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 a278181a056..508b5fe1f55 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 6, 2024, 15:11 UTC · re: Patrick Steinhardt · lore

[PATCH 26/26] 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 401 files +0 −400

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-diff-format.sh, t/t4001-diff-rename.sh, t/t4002-diff-basic.sh, t/t4003-diff-rename-1.sh, t/t4004-diff-rename-symlink.sh, t/t4005-diff-rename-2.sh, t/t4006-diff-mode.sh, t/t4007-rename-3.sh, t/t4008-diff-break-rewrite.sh, t/t4009-diff-rename-4.sh, t/t4010-diff-pathspec.sh, t/t4011-diff-symlink.sh, t/t4012-diff-binary.sh, t/t4013-diff-various.sh, t/t4014-format-patch.sh, t/t4015-diff-whitespace.sh, t/t4016-diff-quote.sh, t/t4017-diff-retval.sh, t/t4018-diff-funcname.sh, t/t4019-diff-wserror.sh, t/t4020-diff-external.sh, t/t4021-format-patch-numbered.sh, t/t4022-diff-rewrite.sh, t/t4023-diff-rename-typechange.sh, t/t4024-diff-optimize-common.sh, t/t4025-hunk-header.sh, t/t4026-color.sh, t/t4027-diff-submodule.sh, t/t4028-format-patch-mime-headers.sh, t/t4029-diff-trailing-space.sh, t/t4030-diff-textconv.sh, t/t4031-diff-rewrite-binary.sh, t/t4032-diff-inter-hunk-context.sh, t/t4033-diff-patience.sh, t/t4034-diff-words.sh, t/t4035-diff-quiet.sh, t/t4036-format-patch-signer-mime.sh, t/t4037-diff-r-t-dirs.sh, t/t4038-diff-combined.sh, t/t4039-diff-assume-unchanged.sh, t/t4040-whitespace-status.sh, t/t4041-diff-submodule-option.sh, t/t4042-diff-textconv-caching.sh, t/t4043-diff-rename-binary.sh, t/t4044-diff-index-unique-abbrev.sh, t/t4045-diff-relative.sh, t/t4046-diff-unmerged.sh, t/t4047-diff-dirstat.sh, t/t4048-diff-combined-binary.sh, t/t4049-diff-stat-count.sh, t/t4050-diff-histogram.sh, t/t4051-diff-function-context.sh, t/t4052-stat-output.sh, t/t4053-diff-no-index.sh, t/t4054-diff-bogus-tree.sh, t/t4055-diff-context.sh, t/t4056-diff-order.sh, t/t4057-diff-combined-paths.sh

diff --git a/t/t0001-init.sh b/t/t0001-init.sh
index 0178aa62a41..4890dff4b27 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 bf3bf604abe..dfbcdddbcc1 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 66ccb5889d1..3c98b622f25 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 8114fac73b3..3bdafbae0f0 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 eba75a2490c..afba0fc3fc6 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 fd373e1b391..53ced36df44 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 9fc58823873..2b60317758c 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 02a18d4fdbd..c9376dffb58 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 84172a37390..45229f57b82 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 9eae0d83563..1d273d91c21 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 08814173cb1..ce3d81227a0 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 2a6f39ad9c8..854d59ec58c 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 f3a16859cc2..32fe8481792 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 fac52322a7f..9a3db02fded 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 19a730c29ed..3a4e1cc7e38 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 81946e87ccb..fd1cae09edc 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 9e6c6ee0d44..3f6433d3045 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 9fe98912511..9bd863a970d 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 575805513a3..f9bbb91f64e 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 a7f4de4a43f..44958cb2c2d 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 f7202c192e7..2e28feb69c9 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 f426a185bb9..493b01a0e7c 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 2f57c8669cb..49dbf09da77 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 510da4ca12d..50b3b4649b6 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 4e8e90dd982..baa1b7e85b1 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 f10f42ff1e4..43155f6bd86 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 e97a84764f7..e103fe71092 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 d3cb2a1cb9e..ae7ef092abf 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 45a773642fd..2fe3522305f 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 1464294bd1b..a0f6f134c71 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 325eb1c3cd0..5c9dc90d0b0 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 1a36a535743..ff98be31a51 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 c3eb1158ef9..d0740038b87 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 752aa8c9454..2630e756dab 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 0afa3d0d312..dbb2e73bcd9 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 20986b693cf..76d4936a879 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 b9480c81781..8e215867b8c 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 1fee6d90102..aac63ba5064 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 7d0a0da8c01..df3e9f5fa5d 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 0188d0423a0..7bab49f361a 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 95019e01ed3..f2f3e500312 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 0ecec2ba711..6b9dcf984bc 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 ba8ad1d1ca0..2236a7e9563 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 3c369c88e2a..3db10f095c2 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 67b11216a3e..5a628bf7356 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 d8e2fc42e15..ab80c9ef135 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 fca39048fe8..e11d819b62a 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 133e5747d61..6cabd6e67b9 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 08df74cacfc..8f0c3b7325b 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 70a3223f219..dd5d9b4e5eb 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 878aadd64c9..023b4c6f0b3 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 522fb2ae696..8853d8afb92 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 8724ce1052d..6c74df0dc67 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 5a6f28051bd..b15cb65d5d7 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 86cff324ff1..0ce1f22eff6 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 310a4500125..28d92bb9b7c 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 b9adc94aab4..eff9a59dbd0 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 91260ce97e5..bac90465406 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 147643d5826..1211db9f468 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 6a76b7fdbd4..17952e52d69 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 5d5b64205ff..dc30289f753 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 f83db659e25..c1cd60edd01 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 8aadbe86c45..72ae405c3ed 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 818700fbecd..34bdb3ab1f2 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 932bf2067da..c98d5018695 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 f99a69ae1b7..853101b86ef 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 1eb3a8306ba..d1a498a216f 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 bef2b708713..1e62c791d97 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 d8cbd3f202b..aa7f6ecd813 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 71a4d1a5ae4..30e0a36242e 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 babec7993e3..67bf3a82f6e 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 2805995cc8c..5e05b9c1f2a 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 84922153ab6..d0d7e80b492 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 b1c6c97524f..e2708e11d5b 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 0e8c0dfbbee..b9dd21cfb6b 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 48a1550371a..4a88bb9ef0c 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 a7c2ed0d7c0..df6ef537258 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 c860c08ecb4..66e2bf4aec3 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 2b9720b0feb..11bf10424f1 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 26be4a2b5a0..6b5033d0ce3 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 d36cd7c0863..ff9bf213aa2 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 d73a5cc2370..a0481139de5 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 ad5936e54d1..4512fb0b6e6 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 fc179ac5dd6..2935f68f8d2 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 22875ba598c..c291a2b33d7 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 595b24c0adb..742f0fa909f 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 cde93d22cde..57f0770df14 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 cf8b94ebedb..bfc90d4cf27 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 8ea8d36818b..0c0e6da5cf5 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 da737a32a27..9b965d02943 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 8341a2fe839..5641271b23a 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 45eef9457fe..9fdbb2af80e 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 69bf9476cbf..0b892894eb9 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 cca4380e431..d390d7d5f85 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 ed638f66447..c71932b0242 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 f6709c9f569..361afb679b0 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 5e0f0a334f4..502a5ea1c51 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 da0e7714d5a..3a14218b245 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 8c5cd651b4b..ab3a105ffff 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 2157f37da36..a4c7c41fc00 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 0f37a43fd3c..ae66ba5babf 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 f13277c8f3e..51a85e83c27 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 29cf8a96613..630a47af21e 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 42caa0d2978..69723b88ff8 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 0506f3d6bba..d971925ed02 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 31b89dd9693..c69ae41306c 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 517d6c86937..8ff2b0c232b 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 53e5b290b9b..40d3c42618c 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 b9852fe40e4..5cb546dd00c 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 3bfec07f1ab..e0e49053f07 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 523aa99a1e2..9710ee0ca45 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 1a90d31201a..69e64c6c868 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 ceeb7ac3a47..45a04929170 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 bb057596f1e..e2316f1dd4c 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 90af3f955c0..a2a7e947164 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 5ed9d7318e0..cabc516ae9a 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 403f6b8f7da..9d698b3cc35 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 df90112618c..28e6c380d76 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 a6bcd62ab65..6d8f401a2a9 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 c01f0f14a12..9b9e5d0766f 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 48b1c92a414..9d8e1a13432 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 9469c79a585..41ba1f1d7fc 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 7748973733e..e3c501848a4 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 246a3f46aba..388fdf9ae57 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 da581ec19ac..975c4ea83a8 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 ff30874f940..f7d69b66ff3 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 d2a4822d46f..934688a1ee8 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 49d28166da0..be6c3f472c1 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 eb4eec8becb..51d79bae83b 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 5a812ca3c0b..dd003a196f7 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 0eb5e674bc1..2f374025367 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 2268bca3c11..d51ecd5e925 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 3256e4462f9..c04eeb72111 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 dbe15a0be10..2fb2f44f021 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 0c00118c2b3..3ab65f72cde 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 280cbf3e031..8a456b1142d 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 3413da40e4a..3a3d33f4054 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 f7c0783d30c..cf57cd66f2d 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 30c31918fde..bf2a90df948 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 ae6528aecea..8c94ac2e70b 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 5eaa6428c43..3962f1d2882 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 79df65ec7f6..75a708f9ba5 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 c1679e31d8a..e04420f4368 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 4a5758f08a8..2803ca9489c 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 a3464976e3a..722884e65f4 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 b9af6b3ac03..cb9ef7e329e 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 e841309d0ea..87a42864145 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 591505a39c0..bbfe05b8e4a 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 e7e78a40281..6ecfed86bc0 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 f9d68ce74ea..70f1e0a998e 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 ba43387bf16..5f437be8c9e 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 a835a196aa8..d868a081105 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 cdb26a30d72..75e89c4b6e2 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 342defbb617..dbd8cd69063 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 62e7fd15964..03239e9faa4 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 5dcc1018828..a45a8b4eb04 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 2625ac44889..ac4a5b2734c 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 d8fa489998a..5dc221ef382 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 8b0234cf2d5..4feaf0d7bef 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 79fc97f1d7e..f18616ad2be 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 fc95cf90485..70361c806e1 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 f0fd441d810..ff163cf6750 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 98e818f09f2..b92d96fdc4e 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 67d18cfa104..91b08e03717 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 570ba38580d..bac231b167c 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 bd9e9e7530d..6f0b90ce127 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 8a518a44ea2..eadb9434ae7 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 71195dd28f2..b0540636ae3 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 82c3bfeac1a..3a3d56018e5 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 04f53b1ea14..61417c75675 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 4b6372f4c3e..1f6c4ed0428 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 3c1d663d948..b2bdd1fcb42 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 c138bdde4fe..3e757c6e4e3 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 fb0e13881cd..1820300c62f 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 c40b661ac12..c4f9bf09aa4 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 a5c7358eeab..80ac661815d 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 43551cc1481..a48ebdbf4d0 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 c67261e2b68..1fcef4be95c 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 8d90d028504..28bbbe6c055 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 ecfacf0f7f3..a5c03d5d4a2 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 f1b709d58be..c49ba7f9bd4 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 81e772fb4eb..7b327b75449 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 2caada3d834..a3b1449ef11 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 246609d54d0..dda169bbc4a 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 acd55217a62..161da054b6d 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 98f16c72399..a397790df59 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 b3f6bc97b53..be3fcdde075 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 1f193cde965..21f4659a9d1 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 77b2346291b..c91c4db9361 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 ac404945d4c..16d6348b692 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 42d55221191..27e85be40ad 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 86c9c887881..8198a1e5789 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 59e5570cb2d..5ffe1a41e2c 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 6acdb89d12b..f6fcfc0c1e4 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 d02d6a55504..79fb11f139a 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 7915e7b8211..2df3fdde8bf 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 e3c7acdbf91..6c32d42c8c6 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 c49cdfb6e58..9b11130ab93 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 e9451cd567c..6938ecca868 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 7ec7f30b442..7a0778ed983 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 963ebe77eb6..a7f3d47aec2 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 95c004dc5c5..6b2ccc21a93 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 f0eab13f96a..cc72ead79f3 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 bc5f2886faf..b31dd8ece50 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 df235ac306e..06e83d33333 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 dba62d69c6c..687be974d41 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 24c60bfd790..9ee659098c4 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 8fa44a92a27..192ad14b5f4 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 b7cf1e492c1..31eb233df51 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 98265ba1b49..43d950de640 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 b40eeb263fe..c8de6d8a190 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 cfc4aeb1798..ba320dc4171 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 976d048e3ef..aa5b42c0f7b 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 33ea9cb21ba..cb125ec2265 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 901342ea09b..08531deb5b2 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 842937bfb9a..9536d109195 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 1d7f6056338..11018f37c70 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 7686e60f6ad..bf340b87726 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 7750dc9265a..57c201869f0 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 a3136db7e28..d51cc8c5ab7 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 714feb83be5..5c0bf4d21fc 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 8af4e8cfe3c..f6d8d7d03d7 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 11af4552f74..13f66fd649d 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 1ed0aa967ec..4b676462852 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 4dd24550eba..31462cb441e 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 7933dff9b38..ac3c811f464 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 12e41a7b40e..a1078f8701d 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 fbfa210a50b..db13aabf625 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 2aaf91ebc8c..22c7256c3ae 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 f04bdc8c78b..61771eec830 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 51d3dffaa66..85f37049587 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 14218b34243..963f3462b75 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 054178703d7..7af4532cd1d 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 69e44c387fa..3da5b2b6e79 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 190e2f6eed7..2682b1f43a6 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 6e6ea0b6f3c..8bdaacd85ac 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 133593d23c0..ac82c9cee8a 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 bd65dfcffc7..768d702fbbf 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 38846941655..f1f09abdd9b 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 5a06732ca73..eb69da61fe7 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 4dd42df38c2..3da824117c6 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 436de44971e..8f294d98326 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 5af2dac0e4b..ac44525810f 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 3942db22900..1e16c6b8ea6 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 81c63439623..e7636f6908f 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 3adb206a93b..a1b2069a256 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 ce2391e28be..8bdf400682d 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 ccfa6a720d0..2295db3dcb0 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 6e587d27d7a..800fc33165a 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 3b6dad0c466..a1139f79e2c 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 e627f08a179..500c9d0e727 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 594e3e43e12..3399344f25d 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 0b61da92b37..da1c202fa71 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 86010931ab6..d2ca43d6aab 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 904eea7df59..fe72b247164 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 9cbc34fc583..37b9d26f4b6 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 d3ac826283e..f5bf16abcd8 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 813dfd8db97..d6c50460d08 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 d0c4d38b4d4..bb5fea02a03 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 bc9b791d1b9..eac193757bf 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 2c3a2452668..03dfcd3954c 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 1ec1fb6715e..fcecdc94ff7 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 b6e9f643e3c..8f4102ff9e4 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 ae316502c45..1aa366a410e 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 e1d05ff6bc9..202702be1a7 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 f55277f499d..9bd5dbf341f 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 04866b89bed..597df5ebc0a 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 ce4144db0f2..5b675417e9b 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 0fd33280cf9..96243b72222 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 beca3460567..c4a7839540a 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 09f230eefb2..bab675938a3 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 328c1d3a3f4..f18bae94507 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 5c67d07ba3e..761de63b6b9 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 4f1d6e8ea64..a1911c4a9d6 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 77cceda14a0..b11f04eb334 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 8979bc34073..25243318618 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 82108b67e67..a1d7fa7f7c6 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 2c3f38d45a8..9f49c4228b6 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 7b4607d72f2..cde3562e3a6 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 acaf5558dbe..83ffb39d9ff 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 e75b3d0e07c..58371d8a547 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 426ff098e1d..b4ff614987e 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 22452ff84cb..fcc40d6fe1f 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 f8c4ed78c9e..ea501f2b42b 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 22ee3a20459..96f2cf22faf 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 c0d29c2154f..127216f7225 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 6c61f240cf9..7181f176b81 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 b43046b3b0d..ad3ba6a9848 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 737af80bb3d..f5b7807abd0 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 b40f26250b7..b9408f9ba12 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 2fab703d615..4859bb8f722 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 515c949ae37..1ee6b00fd57 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 a16428bdf54..675491234a6 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 94ea88e384e..ba069dccbdf 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 5e9046e3df3..1b3e97c8755 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 365436ebfc3..6f57aed9fac 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 8e0d03969a2..abd66f36021 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 cb891eeb5fd..2593711fecd 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 7b9c135c6e2..be09fc78c16 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 7f1a5dd3deb..5086e14c022 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 c8172b08522..05df964670f 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 97fc9a23f21..8c94fdffc43 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 6e329fea7c0..6aa2aeb628d 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 4d9744e5fc7..94671d3c465 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 7929e2e2e3a..6f9307e0e3c 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 821f08e5afb..78d42f4c799 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 61ca87512d5..78c3eac54b5 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 411027fb58c..17a99379625 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 1b2c0d6aca6..5495eacfec1 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 76d393dc8a3..95fe4feaeee 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 109016eba92..18aeba161c0 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 ead3fb46807..9748443530c 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 b71bad17b85..7e11bd4a4c5 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 10e9c91dbbd..f3947b400a3 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 afa7727a4af..2d53ce754c5 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 171cc6d76b7..f4159246e1e 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 93c725bac3c..7eb52b12edc 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 dd5d92ef302..84a587daf3a 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 9387a22a9e7..f22d1ddead1 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 e178968b408..8bfe3ed2467 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 133dc072178..5b2e250eaa5 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 31ac31d4bcd..98259e2adaa 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 7cef12981c4..31bd9960fcd 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 fcdefba48cc..08580fd3dcc 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 12bd3db4cb7..389670262e4 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 839c904745a..4c543a1a7e8 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 718438ffc7d..b8a05d95f3f 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 82bfb2fd2ac..8bacacbac68 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 d84071038e0..3ef525a559d 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 3aa59f6f639..b9c96e273fb 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 6ae45a788d1..2bade9e804f 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 d3e428ff46e..e3cf0ffbe59 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 9d4b5ab1f95..3c930ec202d 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 e0659c92935..f03601b49a9 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 72a5a565e97..f528008c363 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 c87592ee2f3..74666ff3e4b 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 aa5019fd6c3..ae313e3c705 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 a1733f45c3a..1289ae3e07c 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 0f61f01ef43..0f7348ec21b 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 7a2eb98b864..10914bba7b3 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 347a89b030b..2b2b366ef94 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 83269d0eb4c..73f2dbdeb02 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 31877f00c77..e2e1251a057 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-diff-format.sh b/t/t4000-diff-format.sh
index 8d50331b8c8..a51f881b1c9 100755
--- a/t/t4000-diff-format.sh
+++ b/t/t4000-diff-format.sh
@@ -10,7 +10,6 @@ same command line parser, so testing one should be sufficient; pick
 diff-files as a representative.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff.sh
 
diff --git a/t/t4001-diff-rename.sh b/t/t4001-diff-rename.sh
index cd1931dd555..4f520d600de 100755
--- a/t/t4001-diff-rename.sh
+++ b/t/t4001-diff-rename.sh
@@ -5,7 +5,6 @@
 
 test_description='Test rename detection in diff engine.'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff.sh
 
diff --git a/t/t4002-diff-basic.sh b/t/t4002-diff-basic.sh
index cb3307010c1..e44648e6f3d 100755
--- a/t/t4002-diff-basic.sh
+++ b/t/t4002-diff-basic.sh
@@ -7,7 +7,6 @@ test_description='Test diff raw-output.
 
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 . "$TEST_DIRECTORY"/lib-read-tree-m-3way.sh
diff --git a/t/t4003-diff-rename-1.sh b/t/t4003-diff-rename-1.sh
index ebe091828c8..fd4faee5d25 100755
--- a/t/t4003-diff-rename-1.sh
+++ b/t/t4003-diff-rename-1.sh
@@ -7,7 +7,6 @@ test_description='More rename detection
 
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff.sh ;# test-lib chdir's into trash
 
diff --git a/t/t4004-diff-rename-symlink.sh b/t/t4004-diff-rename-symlink.sh
index 1d70d4d221b..faf3465deb4 100755
--- a/t/t4004-diff-rename-symlink.sh
+++ b/t/t4004-diff-rename-symlink.sh
@@ -10,7 +10,6 @@ copy of symbolic links, but should not produce rename/copy followed
 by an edit for them.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff.sh
 
diff --git a/t/t4005-diff-rename-2.sh b/t/t4005-diff-rename-2.sh
index 5c756dc2435..92d1141fbe0 100755
--- a/t/t4005-diff-rename-2.sh
+++ b/t/t4005-diff-rename-2.sh
@@ -6,7 +6,6 @@
 test_description='Same rename detection as t4003 but testing diff-raw.'
 
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff.sh ;# test-lib chdir's into trash
 
diff --git a/t/t4006-diff-mode.sh b/t/t4006-diff-mode.sh
index dbd4c0da213..2299b91fc4b 100755
--- a/t/t4006-diff-mode.sh
+++ b/t/t4006-diff-mode.sh
@@ -7,7 +7,6 @@ test_description='Test mode change diffs.
 
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 sed_script='s/\(:100644 100755\) \('"$OID_REGEX"'\) \2 /\1 X X /'
diff --git a/t/t4007-rename-3.sh b/t/t4007-rename-3.sh
index b86165cbac5..e8faf0dd2ef 100755
--- a/t/t4007-rename-3.sh
+++ b/t/t4007-rename-3.sh
@@ -7,7 +7,6 @@ test_description='Rename interaction with pathspec.
 
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff.sh ;# test-lib chdir's into trash
 
diff --git a/t/t4008-diff-break-rewrite.sh b/t/t4008-diff-break-rewrite.sh
index b0ef0026e08..c187c52dab2 100755
--- a/t/t4008-diff-break-rewrite.sh
+++ b/t/t4008-diff-break-rewrite.sh
@@ -22,7 +22,6 @@ With -B, this should be detected as two complete rewrites.
 Further, with -B and -M together, these should turn into two renames.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff.sh ;# test-lib chdir's into trash
 
diff --git a/t/t4009-diff-rename-4.sh b/t/t4009-diff-rename-4.sh
index 3480781dabf..59e71e3acde 100755
--- a/t/t4009-diff-rename-4.sh
+++ b/t/t4009-diff-rename-4.sh
@@ -7,7 +7,6 @@ test_description='Same rename detection as t4003 but testing diff-raw -z.
 
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff.sh ;# test-lib chdir's into trash
 
diff --git a/t/t4010-diff-pathspec.sh b/t/t4010-diff-pathspec.sh
index 9d9650eba7e..c84c3fa05b2 100755
--- a/t/t4010-diff-pathspec.sh
+++ b/t/t4010-diff-pathspec.sh
@@ -10,7 +10,6 @@ Prepare:
         path1/file1
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff.sh ;# test-lib chdir's into trash
 
diff --git a/t/t4011-diff-symlink.sh b/t/t4011-diff-symlink.sh
index bc8ba887191..ac837b6c9ec 100755
--- a/t/t4011-diff-symlink.sh
+++ b/t/t4011-diff-symlink.sh
@@ -7,7 +7,6 @@ test_description='Test diff of symlinks.
 
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff.sh
 
diff --git a/t/t4012-diff-binary.sh b/t/t4012-diff-binary.sh
index c64d9d2f405..d1d30ac2a94 100755
--- a/t/t4012-diff-binary.sh
+++ b/t/t4012-diff-binary.sh
@@ -6,7 +6,6 @@
 test_description='Binary diff and apply
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 cat >expect.binary-numstat <<\EOF
diff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh
index 87d248d0347..3855d68dbc0 100755
--- a/t/t4013-diff-various.sh
+++ b/t/t4013-diff-various.sh
@@ -8,7 +8,6 @@ test_description='Various diff formatting options'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff.sh
 
diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh
index 1c46e963e43..884f83fb8a4 100755
--- a/t/t4014-format-patch.sh
+++ b/t/t4014-format-patch.sh
@@ -8,7 +8,6 @@ test_description='various format-patch 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/t4015-diff-whitespace.sh b/t/t4015-diff-whitespace.sh
index 851cfe4f32c..52e3e476ffa 100755
--- a/t/t4015-diff-whitespace.sh
+++ b/t/t4015-diff-whitespace.sh
@@ -7,7 +7,6 @@ test_description='Test special whitespace in diff engine.
 
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff.sh
 
diff --git a/t/t4016-diff-quote.sh b/t/t4016-diff-quote.sh
index 5a8d8876831..876271d6826 100755
--- a/t/t4016-diff-quote.sh
+++ b/t/t4016-diff-quote.sh
@@ -6,7 +6,6 @@
 test_description='Quoting paths in diff output.
 '
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 P0='pathname'
diff --git a/t/t4017-diff-retval.sh b/t/t4017-diff-retval.sh
index 1cea73ef5a3..c2863c99b71 100755
--- a/t/t4017-diff-retval.sh
+++ b/t/t4017-diff-retval.sh
@@ -5,7 +5,6 @@ test_description='Return value of diffs'
 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/t4018-diff-funcname.sh b/t/t4018-diff-funcname.sh
index 8128c30e7f2..e026fac1f40 100755
--- a/t/t4018-diff-funcname.sh
+++ b/t/t4018-diff-funcname.sh
@@ -5,7 +5,6 @@
 
 test_description='Test custom diff function name patterns'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t4019-diff-wserror.sh b/t/t4019-diff-wserror.sh
index d2b3109c2d3..4001dacee39 100755
--- a/t/t4019-diff-wserror.sh
+++ b/t/t4019-diff-wserror.sh
@@ -2,7 +2,6 @@
 
 test_description='diff whitespace error detection'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t4020-diff-external.sh b/t/t4020-diff-external.sh
index 0e5a05894fd..f1efe482a59 100755
--- a/t/t4020-diff-external.sh
+++ b/t/t4020-diff-external.sh
@@ -2,7 +2,6 @@
 
 test_description='external diff interface test'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t4021-format-patch-numbered.sh b/t/t4021-format-patch-numbered.sh
index 1219aa226dc..9be65fd4440 100755
--- a/t/t4021-format-patch-numbered.sh
+++ b/t/t4021-format-patch-numbered.sh
@@ -5,7 +5,6 @@
 
 test_description='Format-patch numbering options'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t4022-diff-rewrite.sh b/t/t4022-diff-rewrite.sh
index 77bc36d5d8f..6fed993ea0b 100755
--- a/t/t4022-diff-rewrite.sh
+++ b/t/t4022-diff-rewrite.sh
@@ -2,7 +2,6 @@
 
 test_description='rewrite diff'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff-data.sh
 
diff --git a/t/t4023-diff-rename-typechange.sh b/t/t4023-diff-rename-typechange.sh
index e6f4fe441e1..787605ce3fd 100755
--- a/t/t4023-diff-rename-typechange.sh
+++ b/t/t4023-diff-rename-typechange.sh
@@ -2,7 +2,6 @@
 
 test_description='typechange rename detection'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff.sh
 
diff --git a/t/t4024-diff-optimize-common.sh b/t/t4024-diff-optimize-common.sh
index e2f0eca4af0..b98ac0a0c03 100755
--- a/t/t4024-diff-optimize-common.sh
+++ b/t/t4024-diff-optimize-common.sh
@@ -2,7 +2,6 @@
 
 test_description='common tail optimization'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 z=zzzzzzzz ;# 8
diff --git a/t/t4025-hunk-header.sh b/t/t4025-hunk-header.sh
index 5397cb7d42d..c39bb07a417 100755
--- a/t/t4025-hunk-header.sh
+++ b/t/t4025-hunk-header.sh
@@ -2,7 +2,6 @@
 
 test_description='diff hunk header truncation'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 N='日本語'
diff --git a/t/t4026-color.sh b/t/t4026-color.sh
index b05f2a9b607..08f6805e1c8 100755
--- a/t/t4026-color.sh
+++ b/t/t4026-color.sh
@@ -5,7 +5,6 @@
 
 test_description='Test diff/status color escape codes'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 ESC=$(printf '\033')
diff --git a/t/t4027-diff-submodule.sh b/t/t4027-diff-submodule.sh
index 40164ae07d2..295da987cce 100755
--- a/t/t4027-diff-submodule.sh
+++ b/t/t4027-diff-submodule.sh
@@ -2,7 +2,6 @@
 
 test_description='difference in submodules'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff.sh
 
diff --git a/t/t4028-format-patch-mime-headers.sh b/t/t4028-format-patch-mime-headers.sh
index 60cb819c42e..a06a7479260 100755
--- a/t/t4028-format-patch-mime-headers.sh
+++ b/t/t4028-format-patch-mime-headers.sh
@@ -2,7 +2,6 @@
 
 test_description='format-patch mime headers and extra headers do not conflict'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'create commit with utf-8 body' '
diff --git a/t/t4029-diff-trailing-space.sh b/t/t4029-diff-trailing-space.sh
index 5f8ffef74b6..32b6e9a4e76 100755
--- a/t/t4029-diff-trailing-space.sh
+++ b/t/t4029-diff-trailing-space.sh
@@ -4,7 +4,6 @@
 #
 test_description='diff honors config option, diff.suppressBlankEmpty'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 cat <<\EOF >expected ||
diff --git a/t/t4030-diff-textconv.sh b/t/t4030-diff-textconv.sh
index 29f6d610c2e..daebf9796f5 100755
--- a/t/t4030-diff-textconv.sh
+++ b/t/t4030-diff-textconv.sh
@@ -2,7 +2,6 @@
 
 test_description='diff.*.textconv tests'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 find_diff() {
diff --git a/t/t4031-diff-rewrite-binary.sh b/t/t4031-diff-rewrite-binary.sh
index 1b8cd3e4c97..c4394a27b56 100755
--- a/t/t4031-diff-rewrite-binary.sh
+++ b/t/t4031-diff-rewrite-binary.sh
@@ -2,7 +2,6 @@
 
 test_description='rewrite diff on binary file'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # We must be large enough to meet the MINIMUM_BREAK_SIZE
diff --git a/t/t4032-diff-inter-hunk-context.sh b/t/t4032-diff-inter-hunk-context.sh
index 7db92d0d9f4..bada0cbd32f 100755
--- a/t/t4032-diff-inter-hunk-context.sh
+++ b/t/t4032-diff-inter-hunk-context.sh
@@ -2,7 +2,6 @@
 
 test_description='diff hunk fusing'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 f() {
diff --git a/t/t4033-diff-patience.sh b/t/t4033-diff-patience.sh
index f7be7f5ef01..113304dc596 100755
--- a/t/t4033-diff-patience.sh
+++ b/t/t4033-diff-patience.sh
@@ -2,7 +2,6 @@
 
 test_description='patience diff algorithm'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff-alternative.sh
 
diff --git a/t/t4034-diff-words.sh b/t/t4034-diff-words.sh
index 4dcd7e99250..f51d3557f10 100755
--- a/t/t4034-diff-words.sh
+++ b/t/t4034-diff-words.sh
@@ -2,7 +2,6 @@
 
 test_description='word diff colors'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff.sh
 
diff --git a/t/t4035-diff-quiet.sh b/t/t4035-diff-quiet.sh
index 76f8034c60f..0352bf81a90 100755
--- a/t/t4035-diff-quiet.sh
+++ b/t/t4035-diff-quiet.sh
@@ -2,7 +2,6 @@
 
 test_description='Return value of diffs'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t4036-format-patch-signer-mime.sh b/t/t4036-format-patch-signer-mime.sh
index 48655bcc789..98d9713d8b2 100755
--- a/t/t4036-format-patch-signer-mime.sh
+++ b/t/t4036-format-patch-signer-mime.sh
@@ -2,7 +2,6 @@
 
 test_description='format-patch -s should force MIME encoding as needed'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t4037-diff-r-t-dirs.sh b/t/t4037-diff-r-t-dirs.sh
index b5f96fe23bd..f5ce3b29a2a 100755
--- a/t/t4037-diff-r-t-dirs.sh
+++ b/t/t4037-diff-r-t-dirs.sh
@@ -2,7 +2,6 @@
 
 test_description='diff -r -t shows directory additions and deletions'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t4038-diff-combined.sh b/t/t4038-diff-combined.sh
index 00190802d83..2ce26e585c9 100755
--- a/t/t4038-diff-combined.sh
+++ b/t/t4038-diff-combined.sh
@@ -5,7 +5,6 @@ test_description='combined diff'
 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-diff.sh
 
diff --git a/t/t4039-diff-assume-unchanged.sh b/t/t4039-diff-assume-unchanged.sh
index 78090e6852d..0eb0314a8b3 100755
--- a/t/t4039-diff-assume-unchanged.sh
+++ b/t/t4039-diff-assume-unchanged.sh
@@ -2,7 +2,6 @@
 
 test_description='diff with assume-unchanged entries'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # external diff has been tested in t4020-diff-external.sh
diff --git a/t/t4040-whitespace-status.sh b/t/t4040-whitespace-status.sh
index eec3d73dc2b..1b27a0e3813 100755
--- a/t/t4040-whitespace-status.sh
+++ b/t/t4040-whitespace-status.sh
@@ -2,7 +2,6 @@
 
 test_description='diff --exit-code with whitespace'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t4041-diff-submodule-option.sh b/t/t4041-diff-submodule-option.sh
index aa149e0085e..28f9d83d4c1 100755
--- a/t/t4041-diff-submodule-option.sh
+++ b/t/t4041-diff-submodule-option.sh
@@ -12,7 +12,6 @@ This test tries to verify the sanity of the --submodule option of git diff.
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # Test non-UTF-8 encoding in case iconv is available.
diff --git a/t/t4042-diff-textconv-caching.sh b/t/t4042-diff-textconv-caching.sh
index a179205394d..ff0e73531b9 100755
--- a/t/t4042-diff-textconv-caching.sh
+++ b/t/t4042-diff-textconv-caching.sh
@@ -2,7 +2,6 @@
 
 test_description='test textconv caching'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 cat >helper <<'EOF'
diff --git a/t/t4043-diff-rename-binary.sh b/t/t4043-diff-rename-binary.sh
index e4864939081..2a2cf913520 100755
--- a/t/t4043-diff-rename-binary.sh
+++ b/t/t4043-diff-rename-binary.sh
@@ -5,7 +5,6 @@
 
 test_description='Move a binary file'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 
diff --git a/t/t4044-diff-index-unique-abbrev.sh b/t/t4044-diff-index-unique-abbrev.sh
index 9f6043dabac..8400bfbd3c7 100755
--- a/t/t4044-diff-index-unique-abbrev.sh
+++ b/t/t4044-diff-index-unique-abbrev.sh
@@ -2,7 +2,6 @@
 
 test_description='test unique sha1 abbreviation on "index from..to" line'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t4045-diff-relative.sh b/t/t4045-diff-relative.sh
index 9b46c4c1bef..2c8493fe66c 100755
--- a/t/t4045-diff-relative.sh
+++ b/t/t4045-diff-relative.sh
@@ -2,7 +2,6 @@
 
 test_description='diff --relative tests'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t4046-diff-unmerged.sh b/t/t4046-diff-unmerged.sh
index afda629c981..7c27f053663 100755
--- a/t/t4046-diff-unmerged.sh
+++ b/t/t4046-diff-unmerged.sh
@@ -2,7 +2,6 @@
 
 test_description='diff with unmerged index entries'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
diff --git a/t/t4047-diff-dirstat.sh b/t/t4047-diff-dirstat.sh
index 7b73462d53d..a7ce8d3161b 100755
--- a/t/t4047-diff-dirstat.sh
+++ b/t/t4047-diff-dirstat.sh
@@ -2,7 +2,6 @@
 
 test_description='diff --dirstat tests'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # set up two commits where the second commit has these files
diff --git a/t/t4048-diff-combined-binary.sh b/t/t4048-diff-combined-binary.sh
index f399484bcef..0260cf64f5d 100755
--- a/t/t4048-diff-combined-binary.sh
+++ b/t/t4048-diff-combined-binary.sh
@@ -4,7 +4,6 @@ test_description='combined and merge diff handle binary files and textconv'
 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 binary merge conflict' '
diff --git a/t/t4049-diff-stat-count.sh b/t/t4049-diff-stat-count.sh
index 0a4fc735d44..eceb47c8594 100755
--- a/t/t4049-diff-stat-count.sh
+++ b/t/t4049-diff-stat-count.sh
@@ -3,7 +3,6 @@
 
 test_description='diff --stat-count'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t4050-diff-histogram.sh b/t/t4050-diff-histogram.sh
index c61b30f96da..fd3e86a74f3 100755
--- a/t/t4050-diff-histogram.sh
+++ b/t/t4050-diff-histogram.sh
@@ -2,7 +2,6 @@
 
 test_description='histogram diff algorithm'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-diff-alternative.sh
 
diff --git a/t/t4051-diff-function-context.sh b/t/t4051-diff-function-context.sh
index 725278ad19c..4838a1df8b4 100755
--- a/t/t4051-diff-function-context.sh
+++ b/t/t4051-diff-function-context.sh
@@ -2,7 +2,6 @@
 
 test_description='diff function context'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 dir="$TEST_DIRECTORY/t4051"
diff --git a/t/t4052-stat-output.sh b/t/t4052-stat-output.sh
index 7badd72488d..740bb970918 100755
--- a/t/t4052-stat-output.sh
+++ b/t/t4052-stat-output.sh
@@ -8,7 +8,6 @@ test_description='test --stat output of various commands'
 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/t4053-diff-no-index.sh b/t/t4053-diff-no-index.sh
index 651ec776606..5e5bad61ca1 100755
--- a/t/t4053-diff-no-index.sh
+++ b/t/t4053-diff-no-index.sh
@@ -2,7 +2,6 @@
 
 test_description='diff --no-index'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t4054-diff-bogus-tree.sh b/t/t4054-diff-bogus-tree.sh
index 05c88f8cdf0..1131431fe0e 100755
--- a/t/t4054-diff-bogus-tree.sh
+++ b/t/t4054-diff-bogus-tree.sh
@@ -2,7 +2,6 @@
 
 test_description='test diff with a bogus tree containing the null sha1'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'create bogus tree' '
diff --git a/t/t4055-diff-context.sh b/t/t4055-diff-context.sh
index 3ea9ae99e04..f7ff234cf93 100755
--- a/t/t4055-diff-context.sh
+++ b/t/t4055-diff-context.sh
@@ -5,7 +5,6 @@
 
 test_description='diff.context configuration'
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
diff --git a/t/t4056-diff-order.sh b/t/t4056-diff-order.sh
index 32c5fcb9a27..aec1d9d1b42 100755
--- a/t/t4056-diff-order.sh
+++ b/t/t4056-diff-order.sh
@@ -5,7 +5,6 @@ test_description='diff order & rotate'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
-TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 create_files () {
diff --git a/t/t4057-diff-combined-paths.sh b/t/t4057-diff-combined-paths.sh
index 9a7505cbb8b..04b8a1542a8 100755
--- a/t/t4057-diff-combined-paths.sh
+++ b/t/t4057-diff-combined-paths.sh
@@ -5,7 +5,6 @@ test_descriptio
Rubén Justo· Nov 10, 2024, 21:48 UTC · re: Patrick Steinhardt · lore

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

On Wed, Nov 06, 2024 at 04:10:14PM +0100, Patrick Steinhardt wrote:
Show 19 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 21 remove the last remaining `UNLEAK()` annotations
>     and ultimately remove the macro itself.
> 
>   - Patch 22 works around a bug in the leak sanitizer itself.
> 
>   - Patches 23 and 24 drop annotations where leak-free tests pass with
>     the leak sanitizer.
> 
>   - Patches 25 and 26 unconditionally enable leak checking in all newly
>     added tests and then drop the `TEST_PASSES_SANITIZE_LEAK`
>     annotation.
Hi Patrick.
Thanks for working on this.

It's been a while since 956d2e4639 (tests: add a test mode for SANITIZE=leak, run it in CI, 2021-09-23). This series marks certainly another milestone.

I have left a few comments, none of them important. The series looks good to me. Just in case you re-roll, while reading the series I spotted some nits:

Show changes to 2 files +4 −4

bisect.c, builtin/init-db.c

diff --git a/bisect.c b/bisect.c
index 518be70aa3..0e804086cb 100644
--- a/bisect.c
+++ b/bisect.c
@@ -641,7 +641,7 @@ static struct commit_list *skip_away(struct commit_list *list, int count)
                        else if (previous)
                                result = previous;
                        else
-                               result =  list;
+                               result = list;
                        break;
                }
                previous = cur;
diff --git a/builtin/init-db.c b/builtin/init-db.c
index 9e069e2742..096f96b9c4 100644
--- a/builtin/init-db.c
+++ b/builtin/init-db.c
@@ -248,9 +248,9 @@ int cmd_init_db(int argc,
        }
 
        flags |= INIT_DB_EXIST_OK;
-       ret =  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);


> 
> 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.
> 
> This series is built on top of 8f8d6eee53 (The seventh batch,
> 2024-11-01) with ps/leakfixes-part-9 at c810549be1
> (list-objects-filter-options: work around reported leak on error,
> 2024-11-05) merged into it.
> 
> The series has some trivial conflicts with the removed test annotations
> when merging with `seen`. There are two topics in-flight that introduce
> new memory leaks (ds/path-walk and cc/promisor-remote-capability), both
> of which are fixed by the below patch. I've sent a message in response
> to the individual commits that introduce the leaks.
> 
> Thanks!
> 
> Patrick
Patrick Steinhardt· Nov 11, 2024, 09:09 UTC · re: Rubén Justo · lore

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

On Sun, Nov 10, 2024 at 10:48:53PM +0100, Rubén Justo wrote:
Show 31 quoted lines
> On Wed, Nov 06, 2024 at 04:10:14PM +0100, Patrick Steinhardt wrote:
> > 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 21 remove the last remaining `UNLEAK()` annotations
> >     and ultimately remove the macro itself.
> > 
> >   - Patch 22 works around a bug in the leak sanitizer itself.
> > 
> >   - Patches 23 and 24 drop annotations where leak-free tests pass with
> >     the leak sanitizer.
> > 
> >   - Patches 25 and 26 unconditionally enable leak checking in all newly
> >     added tests and then drop the `TEST_PASSES_SANITIZE_LEAK`
> >     annotation.
> 
> Hi Patrick.
> 
> Thanks for working on this.
> 
> It's been a while since 956d2e4639 (tests: add a test mode for SANITIZE=leak,
> run it in CI, 2021-09-23).  This series marks certainly another milestone.
> 
> I have left a few comments, none of them important.  The series looks
> good to me.  Just in case you re-roll, while reading the series I
> spotted some nits:

Thanks for your review, I've addressed your comments and will send out v2 soonish!

patrick

← back to recent threads