Browse Source

ls-files: fix a trivial dir_clear() leak

Fix an edge case that was missed when the dir_clear() call was added
in eceba53214 (dir: fix problematic API to avoid memory leaks,
2020-08-18), we need to also clean up when we're about to exit with
non-zero.

That commit says, on the topic of the dir_clear() API and UNLEAK():

    [...]two of them clearly thought about leaks since they had an
    UNLEAK(dir) directive, which to me suggests that the method to
    free the data was too unclear.

I think that 0e5bba53af (add UNLEAK annotation for reducing leak
false positives, 2017-09-08) which added the UNLEAK() makes it clear
that that wasn't the case, rather it was the desire to avoid the
complexity of freeing the memory at the end of the program.

This does add a bit of complexity, but I think it's worth it to just
fix these leaks when it's easy in built-ins. It allows them to serve
as canaries for underlying APIs that shouldn't be leaking, it
encourages us to make those freeing APIs nicer for all their users,
and it prevents other leaking regressions by being able to mark the
entire test as TEST_PASSES_SANITIZE_LEAK=true.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Ævar Arnfjörð Bjarmason 3 years ago committed by Junio C Hamano
parent
commit
eab4ac6a23
  1. 13
      builtin/ls-files.c
  2. 1
      t/t3005-ls-files-relative.sh
  3. 2
      t/t3020-ls-files-error-unmatch.sh
  4. 1
      t/t3700-add.sh
  5. 1
      t/t7104-reset-hard.sh

13
builtin/ls-files.c

@ -672,6 +672,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) @@ -672,6 +672,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
N_("suppress duplicate entries")),
OPT_END()
};
int ret = 0;

if (argc == 2 && !strcmp(argv[1], "-h"))
usage_with_options(ls_files_usage, builtin_ls_files_options);
@ -775,16 +776,12 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) @@ -775,16 +776,12 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
if (show_resolve_undo)
show_ru_info(the_repository->index);

if (ps_matched) {
int bad;
bad = report_path_error(ps_matched, &pathspec);
if (bad)
fprintf(stderr, "Did you forget to 'git add'?\n");

return bad ? 1 : 0;
if (ps_matched && report_path_error(ps_matched, &pathspec)) {
fprintf(stderr, "Did you forget to 'git add'?\n");
ret = 1;
}

dir_clear(&dir);
free(max_prefix);
return 0;
return ret;
}

1
t/t3005-ls-files-relative.sh

@ -5,6 +5,7 @@ test_description='ls-files tests with relative paths @@ -5,6 +5,7 @@ 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' '

2
t/t3020-ls-files-error-unmatch.sh

@ -9,6 +9,8 @@ This test runs git ls-files --error-unmatch to ensure it correctly @@ -9,6 +9,8 @@ This test runs git ls-files --error-unmatch to ensure it correctly
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' '

1
t/t3700-add.sh

@ -5,6 +5,7 @@ @@ -5,6 +5,7 @@

test_description='Test of git add, including the -- option.'

TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh

# Test the file mode "$1" of the file "$2" in the index.

1
t/t7104-reset-hard.sh

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@

test_description='reset --hard unmerged'

TEST_PASSES_SANITIZE_LEAK=true
. ./test-lib.sh

test_expect_success setup '

Loading…
Cancel
Save