builtin/stash: fix various trivial memory leaks
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>maint
parent
fc68633352
commit
2e875b6cb4
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 '
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#!/bin/sh
|
||||
|
||||
test_description='stash -p'
|
||||
|
||||
TEST_PASSES_SANITIZE_LEAK=true
|
||||
. ./lib-patch-mode.sh
|
||||
|
||||
test_expect_success 'setup' '
|
||||
|
|
|
@ -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' '
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue