git/t/helper
Jeff King 7ce4088ab7 parse-options: consistently allocate memory in fix_filename()
When handling OPT_FILENAME(), we have to stick the "prefix" (if any) in
front of the filename to make up for the fact that Git has chdir()'d to
the top of the repository. We can do this with prefix_filename(), but
there are a few special cases we handle ourselves.

Unfortunately the memory allocation is inconsistent here; if we do make
it to prefix_filename(), we'll allocate a string which the caller must
free to avoid a leak. But if we hit our special cases, we'll return the
string as-is, and a caller which tries to free it will crash. So there's
no way to win.

Let's consistently allocate, so that callers can do the right thing.

There are now three cases to care about in the function (and hence a
three-armed if/else):

  1. we got a NULL input (and should leave it as NULL, though arguably
     this is the sign of a bug; let's keep the status quo for now and we
     can pick at that scab later)

  2. we hit a special case that means we leave the name intact; we
     should duplicate the string. This includes our special "-"
     matching. Prior to this patch, it also included empty prefixes and
     absolute filenames. But we can observe that prefix_filename()
     already handles these, so we don't need to detect them.

  3. everything else goes to prefix_filename()

I've dropped the "const" from the "char **file" parameter to indicate
that we're allocating, though in practice it's not really important.
This is all being shuffled through a void pointer via opt->value before
it hits code which ever looks at the string. And it's even a bit weird,
because we are really taking _in_ a const string and using the same
out-parameter for a non-const string. A better function signature would
be:

  static char *fix_filename(const char *prefix, const char *file);

but that would mean the caller dereferences the double-pointer (and the
NULL check is currently handled inside this function). So I took the
path of least-change here.

Note that we have to fix several callers in this commit, too, or we'll
break the leak-checking tests. These are "new" leaks in the sense that
they are now triggered by the test suite, but these spots have always
been leaky when Git is run in a subdirectory of the repository. I fixed
all of the cases that trigger with GIT_TEST_PASSING_SANITIZE_LEAK. There
may be others in scripts that have other leaks, but we can fix them
later along with those other leaks (and again, you _couldn't_ fix them
before this patch, so this is the necessary first step).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2023-03-06 13:14:45 -08:00
..
.gitignore
test-advise.c
test-bitmap.c t/helper/test-bitmap.c: add 'dump-hashes' mode 2021-09-14 16:34:17 -07:00
test-bloom.c test-tool bloom: fix memory leaks 2022-07-01 13:38:50 -07:00
test-bundle-uri.c bundle-uri: parse bundle list in config format 2022-10-12 09:13:24 -07:00
test-cache-tree.c cache.h & test-tool.h: add & use "USE_THE_INDEX_VARIABLE" 2022-11-21 12:06:15 +09:00
test-chmtime.c t/helper/test-chmtime: skip directories on Windows 2022-03-25 16:04:17 -07:00
test-config.c git-compat-util.h: use "UNUSED", not "UNUSED(var)" 2022-09-01 10:49:48 -07:00
test-crontab.c test-crontab: minor memory and error handling fixes 2022-08-30 14:31:37 -07:00
test-csprng.c wrapper: add a helper to generate numbers from a CSPRNG 2022-01-17 14:17:48 -08:00
test-ctype.c
test-date.c date API: add and use a date_mode_release() 2022-02-16 09:40:00 -08:00
test-delta.c test-tool delta: fix a memory leak 2022-07-01 13:38:50 -07:00
test-dir-iterator.c
test-drop-caches.c lazyload: use correct calling conventions 2022-01-09 10:34:53 -08:00
test-dump-cache-tree.c cache.h & test-tool.h: add & use "USE_THE_INDEX_VARIABLE" 2022-11-21 12:06:15 +09:00
test-dump-fsmonitor.c
test-dump-split-index.c cache.h & test-tool.h: add & use "USE_THE_INDEX_VARIABLE" 2022-11-21 12:06:15 +09:00
test-dump-untracked-cache.c cache.h & test-tool.h: add & use "USE_THE_INDEX_VARIABLE" 2022-11-21 12:06:15 +09:00
test-example-decorate.c
test-fake-ssh.c use child_process member "args" instead of string array variable 2022-10-30 14:04:39 -04:00
test-fast-rebase.c cache.h & test-tool.h: add & use "USE_THE_INDEX_VARIABLE" 2022-11-21 12:06:15 +09:00
test-fsmonitor-client.c t/helper/fsmonitor-client: create stress test 2022-05-26 15:59:26 -07:00
test-genrandom.c
test-genzeros.c test-tool genzeros: generate large amounts of data more efficiently 2021-11-03 11:22:26 -07:00
test-getcwd.c t0001: fix broken not-quite getcwd(3) test in bed67874e2 2021-07-30 10:18:27 -07:00
test-hash-speed.c
test-hash.c test-tool test-hash: fix a memory leak 2022-07-01 13:38:49 -07:00
test-hashmap.c
test-hexdump.c t/helper/hexdump: add helper to print hexdump of stdin 2022-05-26 15:59:27 -07:00
test-index-version.c
test-json-writer.c test-tool json-writer: fix memory leaks 2022-07-01 13:38:50 -07:00
test-lazy-init-name-hash.c cache.h & test-tool.h: add & use "USE_THE_INDEX_VARIABLE" 2022-11-21 12:06:15 +09:00
test-match-trees.c
test-mergesort.c test-mergesort: use mem_pool for sort input 2022-08-28 13:10:22 -07:00
test-mktemp.c
test-oid-array.c tests: fix test-oid-array leak, test in SANITIZE=leak 2021-10-07 15:40:15 -07:00
test-oidmap.c
test-oidtree.c tests: fix a memory leak in test-oidtree.c 2021-10-07 15:40:15 -07:00
test-online-cpus.c
test-pack-mtimes.c t/helper: add 'pack-mtimes' test-tool 2022-05-26 15:48:26 -07:00
test-parse-options.c test-parse-options.c: fix style of comparison with zero 2022-09-07 12:06:12 -07:00
test-parse-pathspec-file.c parse-options: consistently allocate memory in fix_filename() 2023-03-06 13:14:45 -08:00
test-partial-clone.c
test-path-utils.c string-list: mark unused callback parameters 2022-10-17 21:24:04 -07:00
test-pcre2-config.c
test-pkt-line.c
test-prio-queue.c tests: fix a memory leak in test-prio-queue.c 2021-10-07 15:40:15 -07:00
test-proc-receive.c doc txt & -h consistency: use "<options>", not "<options>..." 2022-10-13 09:32:55 -07:00
test-progress.c progress.c tests: make start/stop commands on stdin 2022-02-03 15:39:55 -08:00
test-reach.c
test-read-cache.c cache.h & test-tool.h: add & use "USE_THE_INDEX_VARIABLE" 2022-11-21 12:06:15 +09:00
test-read-graph.c test-read-graph: include extra post-parse info 2022-03-01 12:09:55 -08:00
test-read-midx.c t/helper/test-read-midx.c: free MIDX within read_midx_file() 2021-10-27 16:26:37 -07:00
test-ref-store.c git-compat-util.h: use "UNUSED", not "UNUSED(var)" 2022-09-01 10:49:48 -07:00
test-reftable.c reftable: order unittests by complexity 2022-01-20 11:31:53 -08:00
test-regex.c test-tool regex: call regfree(), fix memory leaks 2022-07-01 13:38:50 -07:00
test-repository.c
test-revision-walking.c revisions API users: add straightforward release_revisions() 2022-04-13 23:56:08 -07:00
test-rot13-filter.c t0021: implementation the rot13-filter.pl script in C 2022-08-14 22:57:12 -07:00
test-run-command.c run-command API: have run_process_parallel() take an "opts" struct 2022-10-12 14:12:41 -07:00
test-scrap-cache-tree.c cache.h & test-tool.h: add & use "USE_THE_INDEX_VARIABLE" 2022-11-21 12:06:15 +09:00
test-serve-v2.c parse-options: PARSE_OPT_KEEP_UNKNOWN only applies to --options 2022-08-19 11:13:14 -07:00
test-sha1.c Makefile & test-tool: replace "DC_SHA1" variable with a "define" 2022-11-07 22:11:51 -05:00
test-sha1.sh
test-sha256.c
test-sigchain.c
test-simple-ipc.c t/helper/simple-ipc: convert test-simple-ipc to use start_bg_command 2021-09-20 08:57:58 -07:00
test-strcmp-offset.c
test-string-list.c
test-submodule-config.c test-tool submodule-config: remove unused "--url" handling 2022-09-02 09:16:23 -07:00
test-submodule-nested-repo-config.c repository: support unabsorbed in repo_submodule_init 2021-09-09 14:09:30 -07:00
test-submodule.c submodule--helper: move "config" to a test-tool 2022-11-08 14:55:30 -05:00
test-subprocess.c run-command API users: use strvec_pushv(), not argv assignment 2021-11-25 22:15:07 -08:00
test-tool-utils.h submodule--helper: move "is-active" to a test-tool 2022-09-02 09:16:23 -07:00
test-tool.c Merge branch 'vd/skip-cache-tree-update' 2022-11-18 18:43:56 -05:00
test-tool.h cache.h & test-tool.h: add & use "USE_THE_INDEX_VARIABLE" 2022-11-21 12:06:15 +09:00
test-trace2.c Merge branch 'rs/no-more-run-command-v' 2022-11-08 17:15:12 -05:00
test-urlmatch-normalization.c test-tool urlmatch-normalization: fix a memory leak 2022-07-01 13:38:49 -07:00
test-userdiff.c git-compat-util.h: use "UNUSED", not "UNUSED(var)" 2022-09-01 10:49:48 -07:00
test-wildmatch.c
test-windows-named-pipe.c
test-write-cache.c cache.h & test-tool.h: add & use "USE_THE_INDEX_VARIABLE" 2022-11-21 12:06:15 +09:00
test-xml-encode.c