]> git.ipfire.org Git - thirdparty/git.git/commitdiff
various: add missing clear_pathspec(), fix leaks
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Mon, 6 Feb 2023 23:07:40 +0000 (00:07 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 6 Feb 2023 23:34:37 +0000 (15:34 -0800)
Fix memory leaks resulting from a missing clear_pathspec().

- archive.c: Plug a leak in the "struct archiver_args", and
  clear_pathspec() the "pathspec" member that the "parse_pathspec_arg()"
  call in this function populates.

- builtin/clean.c: Fix a memory leak that's been with us since
  893d839970c (clean: convert to use parse_pathspec, 2013-07-14).

- builtin/reset.c: Add clear_pathspec() calls to cmd_reset(),
  including to the codepaths where we'd return early.

- builtin/stash.c: Call clear_pathspec() on the pathspec initialized
  in push_stash().

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
archive.c
builtin/clean.c
builtin/reset.c
builtin/stash.c
t/t5001-archive-attr.sh
t/t5004-archive-corner-cases.sh
t/t7105-reset-patch.sh
t/t7106-reset-unborn-branch.sh
t/t7107-reset-pathspec-file.sh
t/t7301-clean-interactive.sh

index 81ff76fce99ed2c6eb569f033ab927e91f6632bc..f2a8756d84fedefd63cb16e942fa9ed0f82d18b0 100644 (file)
--- a/archive.c
+++ b/archive.c
@@ -710,6 +710,7 @@ int write_archive(int argc, const char **argv, const char *prefix,
 
        string_list_clear_func(&args.extra_files, extra_file_info_clear);
        free(args.refname);
+       clear_pathspec(&args.pathspec);
 
        return rc;
 }
index b2701a2815803e8c1231eb7516bc5936311e9f0a..b15eab328b7badf157c731af01ec8cc8d2637c2a 100644 (file)
@@ -1092,5 +1092,6 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
        strbuf_release(&buf);
        string_list_clear(&del_list, 0);
        string_list_clear(&exclude_list, 0);
+       clear_pathspec(&pathspec);
        return (errors != 0);
 }
index fea20a9ba0b99bc730f7c7fc7c1000fa57febf3e..e9c10618cd32384c15b55dfcf70dc437f3cd9ca6 100644 (file)
@@ -390,7 +390,8 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
                if (reset_type != NONE)
                        die(_("options '%s' and '%s' cannot be used together"), "--patch", "--{hard,mixed,soft}");
                trace2_cmd_mode("patch-interactive");
-               return run_add_interactive(rev, "--patch=reset", &pathspec);
+               update_ref_status = run_add_interactive(rev, "--patch=reset", &pathspec);
+               goto cleanup;
        }
 
        /* git reset tree [--] paths... can be used to
@@ -439,8 +440,10 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
                                       LOCK_DIE_ON_ERROR);
                if (reset_type == MIXED) {
                        int flags = quiet ? REFRESH_QUIET : REFRESH_IN_PORCELAIN;
-                       if (read_from_tree(&pathspec, &oid, intent_to_add))
-                               return 1;
+                       if (read_from_tree(&pathspec, &oid, intent_to_add)) {
+                               update_ref_status = 1;
+                               goto cleanup;
+                       }
                        the_index.updated_skipworktree = 1;
                        if (!no_refresh && get_git_work_tree()) {
                                uint64_t t_begin, t_delta_in_ms;
@@ -488,5 +491,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
 
        discard_index(&the_index);
 
+cleanup:
+       clear_pathspec(&pathspec);
        return update_ref_status;
 }
index 839569a98033f1cf2e8eb74b2eb6fc1770eba8fc..71a4ee6b1a59832411af03df0cf2206d7f62a7e8 100644 (file)
@@ -1727,6 +1727,7 @@ static int push_stash(int argc, const char **argv, const char *prefix,
                OPT_PATHSPEC_FILE_NUL(&pathspec_file_nul),
                OPT_END()
        };
+       int ret;
 
        if (argc) {
                force_assume = !strcmp(argv[0], "-p");
@@ -1766,8 +1767,10 @@ static int push_stash(int argc, const char **argv, const char *prefix,
                die(_("the option '%s' requires '%s'"), "--pathspec-file-nul", "--pathspec-from-file");
        }
 
-       return do_push_stash(&ps, stash_msg, quiet, keep_index, patch_mode,
-                            include_untracked, only_staged);
+       ret = do_push_stash(&ps, stash_msg, quiet, keep_index, patch_mode,
+                           include_untracked, only_staged);
+       clear_pathspec(&ps);
+       return ret;
 }
 
 static int push_stash_unassumed(int argc, const char **argv, const char *prefix)
index 2f6eef5e3720452df49c4810bd9f4f63dc1167fb..04d300eeda760033c0e72beb2aee1235c664c457 100755 (executable)
@@ -3,6 +3,7 @@
 test_description='git archive attribute tests'
 
 TEST_CREATE_REPO_NO_TEMPLATE=1
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 SUBSTFORMAT='%H (%h)%n'
index ae508e21623fb4af7b55c1c8afe27556b24bb232..9f2c6da80e8cd97c12eb5452e940a9022b2e3a84 100755 (executable)
@@ -1,6 +1,8 @@
 #!/bin/sh
 
 test_description='test corner cases of git-archive'
+
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 # the 10knuls.tar file is used to test for an empty git generated tar
index fc2a6cf5c7a49a7971e23213d4d324799c2f92c9..9b46da7aaa7e59c08bf799262a21056fe7417d86 100755 (executable)
@@ -1,6 +1,8 @@
 #!/bin/sh
 
 test_description='git reset --patch'
+
+TEST_PASSES_SANITIZE_LEAK=true
 . ./lib-patch-mode.sh
 
 test_expect_success PERL 'setup' '
index ecb85c3b823275efc68fb64643a4304a3cbf28b2..a0b67a0b843b3411de060ca9f4e507e59d516dd2 100755 (executable)
@@ -1,6 +1,8 @@
 #!/bin/sh
 
 test_description='git reset should work on unborn branch'
+
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success 'setup' '
index 523efbecde1dff517ffebf3c04cfcf74ea280f15..af5ea406db3bf5748d3cf1a1ae16abd3b6fd9363 100755 (executable)
@@ -2,6 +2,7 @@
 
 test_description='reset --pathspec-from-file'
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_tick
index a07e8b86de2014fd24bcb4692a744f147ef07787..d82a3210a1db48288c54ce3c06d430546da70f48 100755 (executable)
@@ -2,6 +2,7 @@
 
 test_description='git clean -i basic tests'
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-terminal.sh