mirror of
https://github.com/git-for-windows/git.git
synced 2025-12-13 00:06:03 -06:00
git: fix leaking argv when handling builtins
In `handle_builtin()` we may end up creating an ad-hoc argv array in
case we see that the command line contains the "--help" parameter. In
this case we observe two memory leaks though:
- We leak the `struct strvec` itself because we directly exit after
calling `run_builtin()`, without bothering about any cleanups.
- Even if we free'd that vector we'd end up leaking some of its
strings because `run_builtin()` will modify the array.
Plug both of these leaks.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
0f26223b6d
commit
3aef7a05ad
22
git.c
22
git.c
@ -711,6 +711,7 @@ static void strip_extension(const char **argv)
|
|||||||
static void handle_builtin(int argc, const char **argv)
|
static void handle_builtin(int argc, const char **argv)
|
||||||
{
|
{
|
||||||
struct strvec args = STRVEC_INIT;
|
struct strvec args = STRVEC_INIT;
|
||||||
|
const char **argv_copy = NULL;
|
||||||
const char *cmd;
|
const char *cmd;
|
||||||
struct cmd_struct *builtin;
|
struct cmd_struct *builtin;
|
||||||
|
|
||||||
@ -731,13 +732,28 @@ static void handle_builtin(int argc, const char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
argc++;
|
argc++;
|
||||||
argv = args.v;
|
|
||||||
|
/*
|
||||||
|
* `run_builtin()` will modify the argv array, so we need to
|
||||||
|
* create a shallow copy such that we can free all of its
|
||||||
|
* strings.
|
||||||
|
*/
|
||||||
|
CALLOC_ARRAY(argv_copy, argc + 1);
|
||||||
|
COPY_ARRAY(argv_copy, args.v, argc);
|
||||||
|
|
||||||
|
argv = argv_copy;
|
||||||
}
|
}
|
||||||
|
|
||||||
builtin = get_builtin(cmd);
|
builtin = get_builtin(cmd);
|
||||||
if (builtin)
|
if (builtin) {
|
||||||
exit(run_builtin(builtin, argc, argv));
|
int ret = run_builtin(builtin, argc, argv);
|
||||||
|
strvec_clear(&args);
|
||||||
|
free(argv_copy);
|
||||||
|
exit(ret);
|
||||||
|
}
|
||||||
|
|
||||||
strvec_clear(&args);
|
strvec_clear(&args);
|
||||||
|
free(argv_copy);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void execv_dashed_external(const char **argv)
|
static void execv_dashed_external(const char **argv)
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
test_description='help'
|
test_description='help'
|
||||||
|
|
||||||
|
TEST_PASSES_SANITIZE_LEAK=true
|
||||||
. ./test-lib.sh
|
. ./test-lib.sh
|
||||||
|
|
||||||
configure_help () {
|
configure_help () {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user