Merge branch 'ab/various-leak-fixes'

Various leak fixes.

* ab/various-leak-fixes:
  built-ins: use free() not UNLEAK() if trivial, rm dead code
  revert: fix parse_options_concat() leak
  cherry-pick: free "struct replay_opts" members
  rebase: don't leak on "--abort"
  connected.c: free the "struct packed_git"
  sequencer.c: fix "opts->strategy" leak in read_strategy_opts()
  ls-files: fix a --with-tree memory leak
  revision API: call graph_clear() in release_revisions()
  unpack-file: fix ancient leak in create_temp_file()
  built-ins & libs & helpers: add/move destructors, fix leaks
  dir.c: free "ident" and "exclude_per_dir" in "struct untracked_cache"
  read-cache.c: clear and free "sparse_checkout_patterns"
  commit: discard partial cache before (re-)reading it
  {reset,merge}: call discard_index() before returning
  tests: mark tests as passing with SANITIZE=leak
This commit is contained in:
Junio C Hamano 2022-12-14 15:55:46 +09:00
commit 9ea1378d04
77 changed files with 142 additions and 48 deletions

View File

@ -695,6 +695,6 @@ finish:
die(_("Unable to write new index file")); die(_("Unable to write new index file"));
dir_clear(&dir); dir_clear(&dir);
UNLEAK(pathspec); clear_pathspec(&pathspec);
return exit_status; return exit_status;
} }

View File

@ -106,6 +106,7 @@ int cmd_bugreport(int argc, const char **argv, const char *prefix)
const char *user_relative_path = NULL; const char *user_relative_path = NULL;
char *prefixed_filename; char *prefixed_filename;
size_t output_path_len; size_t output_path_len;
int ret;
const struct option bugreport_options[] = { const struct option bugreport_options[] = {
OPT_CALLBACK_F(0, "diagnose", &diagnose, N_("mode"), OPT_CALLBACK_F(0, "diagnose", &diagnose, N_("mode"),
@ -182,7 +183,9 @@ int cmd_bugreport(int argc, const char **argv, const char *prefix)
user_relative_path); user_relative_path);
free(prefixed_filename); free(prefixed_filename);
UNLEAK(buffer); strbuf_release(&buffer);
UNLEAK(report_path);
return !!launch_editor(report_path.buf, NULL, NULL); ret = !!launch_editor(report_path.buf, NULL, NULL);
strbuf_release(&report_path);
return ret;
} }

View File

@ -1471,6 +1471,8 @@ static void die_if_some_operation_in_progress(void)
"or \"git worktree add\".")); "or \"git worktree add\"."));
if (state.bisect_in_progress) if (state.bisect_in_progress)
warning(_("you are switching branch while bisecting")); warning(_("you are switching branch while bisecting"));
wt_status_state_free_buffers(&state);
} }
static int checkout_branch(struct checkout_opts *opts, static int checkout_branch(struct checkout_opts *opts,

View File

@ -991,8 +991,11 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
struct object_id oid; struct object_id oid;
const char *parent = "HEAD"; const char *parent = "HEAD";
if (!active_nr && read_cache() < 0) if (!active_nr) {
discard_cache();
if (read_cache() < 0)
die(_("Cannot read index")); die(_("Cannot read index"));
}
if (amend) if (amend)
parent = "HEAD^1"; parent = "HEAD^1";
@ -1875,8 +1878,8 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
apply_autostash(git_path_merge_autostash(the_repository)); apply_autostash(git_path_merge_autostash(the_repository));
cleanup: cleanup:
UNLEAK(author_ident); strbuf_release(&author_ident);
UNLEAK(err); strbuf_release(&err);
UNLEAK(sb); strbuf_release(&sb);
return ret; return ret;
} }

View File

@ -639,8 +639,9 @@ static char *default_user_config(void)
int cmd_config(int argc, const char **argv, const char *prefix) int cmd_config(int argc, const char **argv, const char *prefix)
{ {
int nongit = !startup_info->have_repository; int nongit = !startup_info->have_repository;
char *value; char *value = NULL;
int flags = 0; int flags = 0;
int ret = 0;
given_config_source.file = xstrdup_or_null(getenv(CONFIG_ENVIRONMENT)); given_config_source.file = xstrdup_or_null(getenv(CONFIG_ENVIRONMENT));
@ -856,23 +857,19 @@ int cmd_config(int argc, const char **argv, const char *prefix)
free(config_file); free(config_file);
} }
else if (actions == ACTION_SET) { else if (actions == ACTION_SET) {
int ret;
check_write(); check_write();
check_argc(argc, 2, 2); check_argc(argc, 2, 2);
value = normalize_value(argv[0], argv[1]); value = normalize_value(argv[0], argv[1]);
UNLEAK(value);
ret = git_config_set_in_file_gently(given_config_source.file, argv[0], value); ret = git_config_set_in_file_gently(given_config_source.file, argv[0], value);
if (ret == CONFIG_NOTHING_SET) if (ret == CONFIG_NOTHING_SET)
error(_("cannot overwrite multiple values with a single value\n" error(_("cannot overwrite multiple values with a single value\n"
" Use a regexp, --add or --replace-all to change %s."), argv[0]); " Use a regexp, --add or --replace-all to change %s."), argv[0]);
return ret;
} }
else if (actions == ACTION_SET_ALL) { else if (actions == ACTION_SET_ALL) {
check_write(); check_write();
check_argc(argc, 2, 3); check_argc(argc, 2, 3);
value = normalize_value(argv[0], argv[1]); value = normalize_value(argv[0], argv[1]);
UNLEAK(value); ret = git_config_set_multivar_in_file_gently(given_config_source.file,
return git_config_set_multivar_in_file_gently(given_config_source.file,
argv[0], value, argv[2], argv[0], value, argv[2],
flags); flags);
} }
@ -880,8 +877,7 @@ int cmd_config(int argc, const char **argv, const char *prefix)
check_write(); check_write();
check_argc(argc, 2, 2); check_argc(argc, 2, 2);
value = normalize_value(argv[0], argv[1]); value = normalize_value(argv[0], argv[1]);
UNLEAK(value); ret = git_config_set_multivar_in_file_gently(given_config_source.file,
return git_config_set_multivar_in_file_gently(given_config_source.file,
argv[0], value, argv[0], value,
CONFIG_REGEX_NONE, CONFIG_REGEX_NONE,
flags); flags);
@ -890,8 +886,7 @@ int cmd_config(int argc, const char **argv, const char *prefix)
check_write(); check_write();
check_argc(argc, 2, 3); check_argc(argc, 2, 3);
value = normalize_value(argv[0], argv[1]); value = normalize_value(argv[0], argv[1]);
UNLEAK(value); ret = git_config_set_multivar_in_file_gently(given_config_source.file,
return git_config_set_multivar_in_file_gently(given_config_source.file,
argv[0], value, argv[2], argv[0], value, argv[2],
flags | CONFIG_FLAGS_MULTI_REPLACE); flags | CONFIG_FLAGS_MULTI_REPLACE);
} }
@ -934,26 +929,28 @@ int cmd_config(int argc, const char **argv, const char *prefix)
flags | CONFIG_FLAGS_MULTI_REPLACE); flags | CONFIG_FLAGS_MULTI_REPLACE);
} }
else if (actions == ACTION_RENAME_SECTION) { else if (actions == ACTION_RENAME_SECTION) {
int ret;
check_write(); check_write();
check_argc(argc, 2, 2); check_argc(argc, 2, 2);
ret = git_config_rename_section_in_file(given_config_source.file, ret = git_config_rename_section_in_file(given_config_source.file,
argv[0], argv[1]); argv[0], argv[1]);
if (ret < 0) if (ret < 0)
return ret; return ret;
if (ret == 0) else if (!ret)
die(_("no such section: %s"), argv[0]); die(_("no such section: %s"), argv[0]);
else
ret = 0;
} }
else if (actions == ACTION_REMOVE_SECTION) { else if (actions == ACTION_REMOVE_SECTION) {
int ret;
check_write(); check_write();
check_argc(argc, 1, 1); check_argc(argc, 1, 1);
ret = git_config_rename_section_in_file(given_config_source.file, ret = git_config_rename_section_in_file(given_config_source.file,
argv[0], NULL); argv[0], NULL);
if (ret < 0) if (ret < 0)
return ret; return ret;
if (ret == 0) else if (!ret)
die(_("no such section: %s"), argv[0]); die(_("no such section: %s"), argv[0]);
else
ret = 0;
} }
else if (actions == ACTION_GET_COLOR) { else if (actions == ACTION_GET_COLOR) {
check_argc(argc, 1, 2); check_argc(argc, 1, 2);
@ -966,5 +963,6 @@ int cmd_config(int argc, const char **argv, const char *prefix)
return get_colorbool(argv[0], argc == 2); return get_colorbool(argv[0], argc == 2);
} }
return 0; free(value);
return ret;
} }

View File

@ -612,7 +612,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
if (1 < rev.diffopt.skip_stat_unmatch) if (1 < rev.diffopt.skip_stat_unmatch)
refresh_index_quietly(); refresh_index_quietly();
release_revisions(&rev); release_revisions(&rev);
UNLEAK(ent); object_array_clear(&ent);
UNLEAK(blob); UNLEAK(blob);
return result; return result;
} }

View File

@ -613,6 +613,7 @@ void overlay_tree_on_index(struct index_state *istate,
if (!fn) if (!fn)
fn = read_one_entry_quick; fn = read_one_entry_quick;
err = read_tree(the_repository, tree, &pathspec, fn, istate); err = read_tree(the_repository, tree, &pathspec, fn, istate);
clear_pathspec(&pathspec);
if (err) if (err)
die("unable to read tree entries %s", tree_name); die("unable to read tree entries %s", tree_name);

View File

@ -1789,5 +1789,6 @@ done:
} }
strbuf_release(&buf); strbuf_release(&buf);
free(branch_to_free); free(branch_to_free);
discard_index(&the_index);
return ret; return ret;
} }

View File

@ -1322,6 +1322,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
if (reset_head(the_repository, &ropts) < 0) if (reset_head(the_repository, &ropts) < 0)
die(_("could not move back to %s"), die(_("could not move back to %s"),
oid_to_hex(&options.orig_head->object.oid)); oid_to_hex(&options.orig_head->object.oid));
strbuf_release(&head_msg);
remove_branch_state(the_repository, 0); remove_branch_state(the_repository, 0);
ret = finish_rebase(&options); ret = finish_rebase(&options);
goto cleanup; goto cleanup;
@ -1828,10 +1829,13 @@ cleanup:
strbuf_release(&revisions); strbuf_release(&revisions);
free(options.reflog_action); free(options.reflog_action);
free(options.head_name); free(options.head_name);
strvec_clear(&options.git_am_opts);
free(options.gpg_sign_opt); free(options.gpg_sign_opt);
free(options.cmd); free(options.cmd);
free(options.strategy); free(options.strategy);
strbuf_release(&options.git_format_patch_opt); strbuf_release(&options.git_format_patch_opt);
free(squash_onto_name); free(squash_onto_name);
string_list_clear(&exec, 0);
string_list_clear(&strategy_options, 0);
return !!ret; return !!ret;
} }

View File

@ -973,6 +973,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
item = string_list_append(&names, line.buf); item = string_list_append(&names, line.buf);
item->util = populate_pack_exts(item->string); item->util = populate_pack_exts(item->string);
} }
strbuf_release(&line);
fclose(out); fclose(out);
ret = finish_command(&cmd); ret = finish_command(&cmd);
if (ret) if (ret)
@ -1175,7 +1176,6 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
string_list_clear(&existing_nonkept_packs, 0); string_list_clear(&existing_nonkept_packs, 0);
string_list_clear(&existing_kept_packs, 0); string_list_clear(&existing_kept_packs, 0);
clear_pack_geometry(geometry); clear_pack_geometry(geometry);
strbuf_release(&line);
return 0; return 0;
} }

View File

@ -485,5 +485,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
if (!pathspec.nr) if (!pathspec.nr)
remove_branch_state(the_repository, 0); remove_branch_state(the_repository, 0);
discard_index(&the_index);
return update_ref_status; return update_ref_status;
} }

View File

@ -530,6 +530,7 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix)
strbuf_addstr(&parsed, " --"); strbuf_addstr(&parsed, " --");
sq_quote_argv(&parsed, argv); sq_quote_argv(&parsed, argv);
puts(parsed.buf); puts(parsed.buf);
strbuf_release(&parsed);
return 0; return 0;
} }

View File

@ -221,6 +221,7 @@ static int run_sequencer(int argc, const char **argv, struct replay_opts *opts)
opts->strategy = xstrdup_or_null(opts->strategy); opts->strategy = xstrdup_or_null(opts->strategy);
if (!opts->strategy && getenv("GIT_TEST_MERGE_ALGORITHM")) if (!opts->strategy && getenv("GIT_TEST_MERGE_ALGORITHM"))
opts->strategy = xstrdup(getenv("GIT_TEST_MERGE_ALGORITHM")); opts->strategy = xstrdup(getenv("GIT_TEST_MERGE_ALGORITHM"));
free(options);
if (cmd == 'q') { if (cmd == 'q') {
int ret = sequencer_remove_state(opts); int ret = sequencer_remove_state(opts);
@ -261,6 +262,9 @@ int cmd_cherry_pick(int argc, const char **argv, const char *prefix)
opts.action = REPLAY_PICK; opts.action = REPLAY_PICK;
sequencer_init_config(&opts); sequencer_init_config(&opts);
res = run_sequencer(argc, argv, &opts); res = run_sequencer(argc, argv, &opts);
if (opts.revs)
release_revisions(opts.revs);
free(opts.revs);
if (res < 0) if (res < 0)
die(_("cherry-pick failed")); die(_("cherry-pick failed"));
return res; return res;

View File

@ -1689,8 +1689,10 @@ static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int q
} }
done: done:
strbuf_release(&patch);
free_stash_info(&info); free_stash_info(&info);
strbuf_release(&stash_msg_buf); strbuf_release(&stash_msg_buf);
strbuf_release(&untracked_files);
return ret; return ret;
} }

View File

@ -19,6 +19,7 @@ static char *create_temp_file(struct object_id *oid)
if (write_in_full(fd, buf, size) < 0) if (write_in_full(fd, buf, size) < 0)
die_errno("unable to write temp-file"); die_errno("unable to write temp-file");
close(fd); close(fd);
free(buf);
return path; return path;
} }

View File

@ -629,6 +629,7 @@ static int add(int ac, const char **av, const char *prefix)
N_("try to match the new branch name with a remote-tracking branch")), N_("try to match the new branch name with a remote-tracking branch")),
OPT_END() OPT_END()
}; };
int ret;
memset(&opts, 0, sizeof(opts)); memset(&opts, 0, sizeof(opts));
opts.checkout = 1; opts.checkout = 1;
@ -705,9 +706,9 @@ static int add(int ac, const char **av, const char *prefix)
die(_("--[no-]track can only be used if a new branch is created")); die(_("--[no-]track can only be used if a new branch is created"));
} }
UNLEAK(path); ret = add_worktree(path, branch, &opts);
UNLEAK(opts); free(path);
return add_worktree(path, branch, &opts); return ret;
} }
static void show_worktree_porcelain(struct worktree *wt, int line_terminator) static void show_worktree_porcelain(struct worktree *wt, int line_terminator)

View File

@ -85,6 +85,7 @@ int check_connected(oid_iterate_fn fn, void *cb_data,
promisor_pack_found: promisor_pack_found:
; ;
} while ((oid = fn(cb_data)) != NULL); } while ((oid = fn(cb_data)) != NULL);
free(new_pack);
return 0; return 0;
} }
@ -121,8 +122,10 @@ no_promisor_pack_found:
else else
rev_list.no_stderr = opt->quiet; rev_list.no_stderr = opt->quiet;
if (start_command(&rev_list)) if (start_command(&rev_list)) {
free(new_pack);
return error(_("Could not run 'git rev-list'")); return error(_("Could not run 'git rev-list'"));
}
sigchain_push(SIGPIPE, SIG_IGN); sigchain_push(SIGPIPE, SIG_IGN);
@ -154,5 +157,6 @@ no_promisor_pack_found:
err = error_errno(_("failed to close rev-list's stdin")); err = error_errno(_("failed to close rev-list's stdin"));
sigchain_pop(SIGPIPE); sigchain_pop(SIGPIPE);
free(new_pack);
return finish_command(&rev_list) || err; return finish_command(&rev_list) || err;
} }

8
dir.c
View File

@ -3581,7 +3581,11 @@ static void free_untracked(struct untracked_cache_dir *ucd)
void free_untracked_cache(struct untracked_cache *uc) void free_untracked_cache(struct untracked_cache *uc)
{ {
if (uc) if (!uc)
return;
free(uc->exclude_per_dir_to_free);
strbuf_release(&uc->ident);
free_untracked(uc->root); free_untracked(uc->root);
free(uc); free(uc);
} }
@ -3739,7 +3743,7 @@ struct untracked_cache *read_untracked_extension(const void *data, unsigned long
next + offset + hashsz); next + offset + hashsz);
uc->dir_flags = get_be32(next + ouc_offset(dir_flags)); uc->dir_flags = get_be32(next + ouc_offset(dir_flags));
exclude_per_dir = (const char *)next + exclude_per_dir_offset; exclude_per_dir = (const char *)next + exclude_per_dir_offset;
uc->exclude_per_dir = xstrdup(exclude_per_dir); uc->exclude_per_dir = uc->exclude_per_dir_to_free = xstrdup(exclude_per_dir);
/* NUL after exclude_per_dir is covered by sizeof(*ouc) */ /* NUL after exclude_per_dir is covered by sizeof(*ouc) */
next += exclude_per_dir_offset + strlen(exclude_per_dir) + 1; next += exclude_per_dir_offset + strlen(exclude_per_dir) + 1;
if (next >= end) if (next >= end)

1
dir.h
View File

@ -188,6 +188,7 @@ struct untracked_cache {
struct oid_stat ss_info_exclude; struct oid_stat ss_info_exclude;
struct oid_stat ss_excludes_file; struct oid_stat ss_excludes_file;
const char *exclude_per_dir; const char *exclude_per_dir;
char *exclude_per_dir_to_free;
struct strbuf ident; struct strbuf ident;
/* /*
* dir_struct#flags must match dir_flags or the untracked * dir_struct#flags must match dir_flags or the untracked

View File

@ -2558,6 +2558,11 @@ void discard_index(struct index_state *istate)
free_untracked_cache(istate->untracked); free_untracked_cache(istate->untracked);
istate->untracked = NULL; istate->untracked = NULL;
if (istate->sparse_checkout_patterns) {
clear_pattern_list(istate->sparse_checkout_patterns);
FREE_AND_NULL(istate->sparse_checkout_patterns);
}
if (istate->ce_mem_pool) { if (istate->ce_mem_pool) {
mem_pool_discard(istate->ce_mem_pool, should_validate_cache_entries()); mem_pool_discard(istate->ce_mem_pool, should_validate_cache_entries());
FREE_AND_NULL(istate->ce_mem_pool); FREE_AND_NULL(istate->ce_mem_pool);

View File

@ -1358,6 +1358,7 @@ static void find_subpos(const char *buf,
/* parse signature first; we might not even have a subject line */ /* parse signature first; we might not even have a subject line */
parse_signature(buf, end - buf, &payload, &signature); parse_signature(buf, end - buf, &payload, &signature);
strbuf_release(&payload);
/* skip past header until we hit empty line */ /* skip past header until we hit empty line */
while (*buf && *buf != '\n') { while (*buf && *buf != '\n') {

View File

@ -3054,6 +3054,7 @@ void release_revisions(struct rev_info *revs)
date_mode_release(&revs->date_mode); date_mode_release(&revs->date_mode);
release_revisions_mailmap(revs->mailmap); release_revisions_mailmap(revs->mailmap);
free_grep_patterns(&revs->grep_filter); free_grep_patterns(&revs->grep_filter);
graph_clear(revs->graph);
/* TODO (need to handle "no_free"): diff_free(&revs->diffopt) */ /* TODO (need to handle "no_free"): diff_free(&revs->diffopt) */
diff_free(&revs->pruning); diff_free(&revs->pruning);
reflog_walk_info_release(revs->reflog_info); reflog_walk_info_release(revs->reflog_info);

View File

@ -2897,6 +2897,7 @@ static void read_strategy_opts(struct replay_opts *opts, struct strbuf *buf)
strbuf_reset(buf); strbuf_reset(buf);
if (!read_oneliner(buf, rebase_path_strategy(), 0)) if (!read_oneliner(buf, rebase_path_strategy(), 0))
return; return;
free(opts->strategy);
opts->strategy = strbuf_detach(buf, NULL); opts->strategy = strbuf_detach(buf, NULL);
if (!read_oneliner(buf, rebase_path_strategy_opts(), 0)) if (!read_oneliner(buf, rebase_path_strategy_opts(), 0))
return; return;

View File

@ -17,6 +17,7 @@ int cmd_main(int argc, const char **argv)
f = fopen(buf.buf, "w"); f = fopen(buf.buf, "w");
if (!f) if (!f)
die("Could not write to %s", buf.buf); die("Could not write to %s", buf.buf);
strbuf_release(&buf);
for (i = 0; i < argc; i++) for (i = 0; i < argc; i++)
fprintf(f, "%s%s", i > 0 ? " " : "", i > 0 ? argv[i] : "ssh:"); fprintf(f, "%s%s", i > 0 ? " " : "", i > 0 ? argv[i] : "ssh:");
fprintf(f, "\n"); fprintf(f, "\n");

View File

@ -2,6 +2,7 @@
test_description='git for-each-repo builtin' test_description='git for-each-repo builtin'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'run based on configured value' ' test_expect_success 'run based on configured value' '

View File

@ -6,6 +6,7 @@ test_description='check that the most basic functions work
Verify wrappers and compatibility functions. Verify wrappers and compatibility functions.
' '
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'character classes (isspace, isalpha etc.)' ' test_expect_success 'character classes (isspace, isalpha etc.)' '

View File

@ -12,6 +12,7 @@ test_description='sparse checkout tests
' '
TEST_CREATE_REPO_NO_TEMPLATE=1 TEST_CREATE_REPO_NO_TEMPLATE=1
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
. "$TEST_DIRECTORY"/lib-read-tree.sh . "$TEST_DIRECTORY"/lib-read-tree.sh

View File

@ -3,7 +3,7 @@
test_description='git read-tree in partial clones' test_description='git read-tree in partial clones'
TEST_NO_CREATE_REPO=1 TEST_NO_CREATE_REPO=1
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'read-tree in partial clone prefetches in one batch' ' test_expect_success 'read-tree in partial clone prefetches in one batch' '

View File

@ -1,6 +1,8 @@
#!/bin/sh #!/bin/sh
test_description='Test git update-ref error handling' test_description='Test git update-ref error handling'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
# Create some references, perhaps run pack-refs --all, then try to # Create some references, perhaps run pack-refs --all, then try to

View File

@ -2,6 +2,7 @@
test_description='avoid rewriting packed-refs unnecessarily' test_description='avoid rewriting packed-refs unnecessarily'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
# Add an identifying mark to the packed-refs file header line. This # Add an identifying mark to the packed-refs file header line. This

View File

@ -4,6 +4,7 @@ test_description='Test reflog interaction with detached HEAD'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
reset_state () { reset_state () {

View File

@ -1,6 +1,8 @@
#!/bin/sh #!/bin/sh
test_description='test separate work tree' test_description='test separate work tree'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'setup' ' test_expect_success 'setup' '

View File

@ -5,6 +5,7 @@ test_description='checkout can switch to last branch and merge base'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'setup' ' test_expect_success 'setup' '

View File

@ -3,6 +3,7 @@
test_description='checkout' test_description='checkout'
TEST_CREATE_REPO_NO_TEMPLATE=1 TEST_CREATE_REPO_NO_TEMPLATE=1
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
# Arguments: [!] <branch> <oid> [<checkout options>] # Arguments: [!] <branch> <oid> [<checkout options>]

View File

@ -2,6 +2,7 @@
test_description='checkout --no-overlay <tree-ish> -- <pathspec>' test_description='checkout --no-overlay <tree-ish> -- <pathspec>'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'setup' ' test_expect_success 'setup' '

View File

@ -18,6 +18,7 @@ This test runs git ls-files --others with the following working tree:
git repository with a commit and an untracked file git repository with a commit and an untracked file
' '
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'setup: directories' ' test_expect_success 'setup: directories' '

View File

@ -41,6 +41,8 @@ Also for modification test, the cache and working tree have:
We should report path0, path1, path2/file2, path3/file3, path7 and path8 We should report path0, path1, path2/file2, path3/file3, path7 and path8
modified without reporting path9 and path10. submod1 is also modified. modified without reporting path9 and path10. submod1 is also modified.
' '
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'git update-index --add to add various paths.' ' test_expect_success 'git update-index --add to add various paths.' '

View File

@ -2,6 +2,7 @@
test_description='fetching and pushing project with subproject' test_description='fetching and pushing project with subproject'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success setup ' test_expect_success setup '

View File

@ -8,6 +8,8 @@ test_description='git ls-files test (--with-tree).
This test runs git ls-files --with-tree and in particular in This test runs git ls-files --with-tree and in particular in
a scenario known to trigger a crash with some versions of git. a scenario known to trigger a crash with some versions of git.
' '
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'setup' ' test_expect_success 'setup' '

View File

@ -2,6 +2,7 @@
test_description='git rebase interactive environment' test_description='git rebase interactive environment'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'setup' ' test_expect_success 'setup' '

View File

@ -5,6 +5,7 @@ test_description='git rebase with its hook(s)'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success setup ' test_expect_success setup '

View File

@ -5,6 +5,7 @@ test_description='git rebase --signoff
This test runs git rebase --signoff and make sure that it works. This test runs git rebase --signoff and make sure that it works.
' '
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
# A simple file to commit # A simple file to commit

View File

@ -2,6 +2,7 @@
test_description='rebase should reread the todo file if an exec modifies it' test_description='rebase should reread the todo file if an exec modifies it'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
. "$TEST_DIRECTORY"/lib-rebase.sh . "$TEST_DIRECTORY"/lib-rebase.sh

View File

@ -2,6 +2,7 @@
test_description='git rebase across mode change' test_description='git rebase across mode change'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'setup' ' test_expect_success 'setup' '

View File

@ -1638,7 +1638,7 @@ test_expect_success 'no effect on diff from --color-moved with --word-diff' '
test_cmp expect actual test_cmp expect actual
' '
test_expect_success !SANITIZE_LEAK 'no effect on show from --color-moved with --word-diff' ' test_expect_success 'no effect on show from --color-moved with --word-diff' '
git show --color-moved --word-diff >actual && git show --color-moved --word-diff >actual &&
git show --word-diff >expect && git show --word-diff >expect &&
test_cmp expect actual test_cmp expect actual
@ -2024,7 +2024,7 @@ test_expect_success '--color-moved rewinds for MIN_ALNUM_COUNT' '
test_cmp expected actual test_cmp expected actual
' '
test_expect_success !SANITIZE_LEAK 'move detection with submodules' ' test_expect_success 'move detection with submodules' '
test_create_repo bananas && test_create_repo bananas &&
echo ripe >bananas/recipe && echo ripe >bananas/recipe &&
git -C bananas add recipe && git -C bananas add recipe &&

View File

@ -1,6 +1,8 @@
#!/bin/sh #!/bin/sh
test_description='diff --relative tests' test_description='diff --relative tests'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'setup' ' test_expect_success 'setup' '

View File

@ -8,6 +8,7 @@ test_description='test --stat output of various commands'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
. "$TEST_DIRECTORY"/lib-terminal.sh . "$TEST_DIRECTORY"/lib-terminal.sh

View File

@ -2,6 +2,7 @@
test_description='diff --no-index' test_description='diff --no-index'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'setup' ' test_expect_success 'setup' '

View File

@ -2,6 +2,7 @@
test_description='behavior of diff when reading objects in a partial clone' test_description='behavior of diff when reading objects in a partial clone'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'git show batches blobs' ' test_expect_success 'git show batches blobs' '

View File

@ -2,6 +2,7 @@
test_description='patching from inconvenient places' test_description='patching from inconvenient places'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'setup' ' test_expect_success 'setup' '

View File

@ -2,6 +2,7 @@
test_description='git apply with weird postimage filenames' test_description='git apply with weird postimage filenames'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'setup' ' test_expect_success 'setup' '

View File

@ -2,6 +2,7 @@
test_description='log/show --expand-tabs' test_description='log/show --expand-tabs'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
HT=" " HT=" "

View File

@ -1,6 +1,8 @@
#!/bin/sh #!/bin/sh
test_description='test custom script in place of pack-objects' test_description='test custom script in place of pack-objects'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'create some history to fetch' ' test_expect_success 'create some history to fetch' '

View File

@ -1,6 +1,8 @@
#!/bin/sh #!/bin/sh
test_description='test noop fetch negotiator' test_description='test noop fetch negotiator'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'noop negotiator does not emit any "have"' ' test_expect_success 'noop negotiator does not emit any "have"' '

View File

@ -4,6 +4,7 @@ test_description='test cloning a repository with detached HEAD'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
head_is_detached() { head_is_detached() {

View File

@ -4,6 +4,7 @@ test_description='tests for git clone -c key=value'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'clone -c sets config in cloned repo' ' test_expect_success 'clone -c sets config in cloned repo' '

View File

@ -2,6 +2,7 @@
test_description='Test shallow cloning of repos with submodules' test_description='Test shallow cloning of repos with submodules'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
pwd=$(pwd) pwd=$(pwd)

View File

@ -5,6 +5,7 @@ test_description='Test cloning repos with submodules using remote-tracking branc
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
pwd=$(pwd) pwd=$(pwd)

View File

@ -1,6 +1,8 @@
#!/bin/sh #!/bin/sh
test_description='test handling of --alternate-refs traversal' test_description='test handling of --alternate-refs traversal'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
# Avoid test_commit because we want a specific and known set of refs: # Avoid test_commit because we want a specific and known set of refs:

View File

@ -1,6 +1,8 @@
#!/bin/sh #!/bin/sh
test_description='basic git merge-index / git-merge-one-file tests' test_description='basic git merge-index / git-merge-one-file tests'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'setup diverging branches' ' test_expect_success 'setup diverging branches' '

View File

@ -2,6 +2,7 @@
test_description='for-each-ref errors for broken refs' test_description='for-each-ref errors for broken refs'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
ZEROS=$ZERO_OID ZEROS=$ZERO_OID

View File

@ -8,6 +8,8 @@
test_description='Test criss-cross merge' test_description='Test criss-cross merge'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'prepare repository' ' test_expect_success 'prepare repository' '

View File

@ -8,6 +8,7 @@ test_description='per path merge controlled by merge attribute'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success setup ' test_expect_success setup '

View File

@ -5,6 +5,7 @@ test_description='ask merge-recursive to merge binary files'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success setup ' test_expect_success setup '

View File

@ -4,6 +4,7 @@ test_description='merging when a directory was replaced with a symlink'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'create a commit where dir a/b changed to symlink' ' test_expect_success 'create a commit where dir a/b changed to symlink' '

View File

@ -3,6 +3,7 @@
test_description='merge with sparse files' test_description='merge with sparse files'
TEST_CREATE_REPO_NO_TEMPLATE=1 TEST_CREATE_REPO_NO_TEMPLATE=1
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
# test_file $filename $content # test_file $filename $content

View File

@ -63,7 +63,7 @@ test_expect_success '"mixed" reset is not allowed in bare' '
test_must_fail git reset --mixed HEAD^ test_must_fail git reset --mixed HEAD^
' '
test_expect_success !SANITIZE_LEAK '"soft" reset is allowed in bare' ' test_expect_success '"soft" reset is allowed in bare' '
git reset --soft HEAD^ && git reset --soft HEAD^ &&
git show --pretty=format:%s >out && git show --pretty=format:%s >out &&
echo one >expect && echo one >expect &&

View File

@ -5,6 +5,7 @@ test_description='commit-msg hook'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'with no hook' ' test_expect_success 'with no hook' '

View File

@ -9,6 +9,7 @@ test_description='per-repo forced setting of email address'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'setup a likely user.useConfigOnly use case' ' test_expect_success 'setup a likely user.useConfigOnly use case' '

View File

@ -2,6 +2,7 @@
test_description='ignored hook warning' test_description='ignored hook warning'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success setup ' test_expect_success setup '

View File

@ -4,6 +4,7 @@ test_description='git merge
Testing the resolve strategy.' Testing the resolve strategy.'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'setup' ' test_expect_success 'setup' '

View File

@ -8,6 +8,7 @@ This test runs git merge --signoff and makes sure that it works.
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
# Setup test files # Setup test files

View File

@ -1,6 +1,8 @@
#!/bin/sh #!/bin/sh
test_description='help.autocorrect finding a match' test_description='help.autocorrect finding a match'
TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'setup' ' test_expect_success 'setup' '

View File

@ -5,7 +5,6 @@
test_description='git svn dcommit can commit renames of files with ugly names' test_description='git svn dcommit can commit renames of files with ugly names'
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh
test_expect_success 'load repository with strange names' ' test_expect_success 'load repository with strange names' '

View File

@ -4,7 +4,6 @@
test_description='git svn creates empty directories' test_description='git svn creates empty directories'
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh
test_expect_success 'initialize repo' ' test_expect_success 'initialize repo' '

View File

@ -5,7 +5,6 @@
test_description='git svn propset tests' test_description='git svn propset tests'
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh
test_expect_success 'setup propset via import' ' test_expect_success 'setup propset via import' '

View File

@ -9,7 +9,6 @@ This test uses git to clone a Subversion repository that contains empty
directories, and checks that corresponding directories are created in the directories, and checks that corresponding directories are created in the
local Git repository with placeholder files.' local Git repository with placeholder files.'
TEST_FAILS_SANITIZE_LEAK=true
. ./lib-git-svn.sh . ./lib-git-svn.sh
GIT_REPO=git-svn-repo GIT_REPO=git-svn-repo