]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/stash: fix various trivial memory leaks
authorPatrick Steinhardt <ps@pks.im>
Thu, 1 Aug 2024 10:40:17 +0000 (12:40 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 1 Aug 2024 15:47:36 +0000 (08:47 -0700)
There are multiple trivial memory leaks in git-stash(1). Fix those.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/stash.c
t/t2501-cwd-empty.sh
t/t3903-stash.sh
t/t3904-stash-patch.sh
t/t3905-stash-include-untracked.sh
t/t7064-wtstatus-pv2.sh

index 46b981c4dd3cd998aa443d5f7c7652aa9a628dd2..7f2f989b69df37edc4dfe0d021dd5b40e4cfced1 100644 (file)
@@ -1521,6 +1521,7 @@ static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int q
        struct strbuf patch = STRBUF_INIT;
        struct strbuf stash_msg_buf = STRBUF_INIT;
        struct strbuf untracked_files = STRBUF_INIT;
+       struct strbuf out = STRBUF_INIT;
 
        if (patch_mode && keep_index == -1)
                keep_index = 1;
@@ -1626,7 +1627,6 @@ static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int q
                        struct child_process cp_add = CHILD_PROCESS_INIT;
                        struct child_process cp_diff = CHILD_PROCESS_INIT;
                        struct child_process cp_apply = CHILD_PROCESS_INIT;
-                       struct strbuf out = STRBUF_INIT;
 
                        cp_add.git_cmd = 1;
                        strvec_push(&cp_add.args, "add");
@@ -1718,6 +1718,7 @@ static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int q
 
 done:
        strbuf_release(&patch);
+       strbuf_release(&out);
        free_stash_info(&info);
        strbuf_release(&stash_msg_buf);
        strbuf_release(&untracked_files);
@@ -1869,6 +1870,8 @@ int cmd_stash(int argc, const char **argv, const char *prefix)
                OPT_SUBCOMMAND_F("save", &fn, save_stash, PARSE_OPT_NOCOMPLETE),
                OPT_END()
        };
+       const char **args_copy;
+       int ret;
 
        git_config(git_stash_config, NULL);
 
@@ -1892,5 +1895,16 @@ int cmd_stash(int argc, const char **argv, const char *prefix)
        /* Assume 'stash push' */
        strvec_push(&args, "push");
        strvec_pushv(&args, argv);
-       return !!push_stash(args.nr, args.v, prefix, 1);
+
+       /*
+        * `push_stash()` ends up modifying the array, which causes memory
+        * leaks if we didn't copy the array here.
+        */
+       DUP_ARRAY(args_copy, args.v, args.nr);
+
+       ret = !!push_stash(args.nr, args_copy, prefix, 1);
+
+       strvec_clear(&args);
+       free(args_copy);
+       return ret;
 }
index f6d8d7d03d7ca42b566c2b177ee57345e09b7107..8af4e8cfe3c8414d2c8d676b5fec7f6bfcb6909a 100755 (executable)
@@ -2,6 +2,7 @@
 
 test_description='Test handling of the current working directory becoming empty'
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 test_expect_success setup '
index a7f71f8126fce48ef58e32d89f628a91bf234899..e4c0937f61d382198dfc2a7e23f320390d9bb6fe 100755 (executable)
@@ -8,6 +8,7 @@ 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
 
index 368fc2a6cc16755e4e2c6e9a7fba0e88bba5a033..aa5019fd6c3d59cc4f3ad870607c7e6e531e628b 100755 (executable)
@@ -1,6 +1,8 @@
 #!/bin/sh
 
 test_description='stash -p'
+
+TEST_PASSES_SANITIZE_LEAK=true
 . ./lib-patch-mode.sh
 
 test_expect_success 'setup' '
index 1289ae3e07c635d30930067022969247b2b63f1f..a1733f45c3aa13e642fe7aeb808391dbd10e6fab 100755 (executable)
@@ -5,6 +5,7 @@
 
 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' '
index 11884d2fc36911cea7f82a1257e35434de61500c..06c130122236aa8dea156b3450088a869f97db9f 100755 (executable)
@@ -4,6 +4,7 @@ test_description='git status --porcelain=v2
 
 This test exercises porcelain V2 output for git status.'
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh