diff options
author | René Scharfe <l.s.r@web.de> | 2022-12-13 07:47:59 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2022-12-13 14:07:37 +0100 |
commit | a658e881c138c8bc398d1d4b9b6db9e29b16673c (patch) | |
tree | 900b01ae8a8271244192eddd5ef3ae542774976a /builtin/am.c | |
parent | Git 2.38.2 (diff) | |
download | git-a658e881c138c8bc398d1d4b9b6db9e29b16673c.tar.xz git-a658e881c138c8bc398d1d4b9b6db9e29b16673c.zip |
am: don't pass strvec to apply_parse_options()
apply_parse_options() passes the array of argument strings to
parse_options(), which removes recognized options. The removed strings
are not freed, though.
Make a copy of the strvec to pass to the function to retain the pointers
of its strings, so we release them all at the end.
Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/am.c')
-rw-r--r-- | builtin/am.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/builtin/am.c b/builtin/am.c index 39fea24833..accd9826f4 100644 --- a/builtin/am.c +++ b/builtin/am.c @@ -1476,6 +1476,7 @@ static int run_apply(const struct am_state *state, const char *index_file) int res, opts_left; int force_apply = 0; int options = 0; + const char **apply_argv; if (init_apply_state(&apply_state, the_repository, NULL)) BUG("init_apply_state() failed"); @@ -1483,7 +1484,15 @@ static int run_apply(const struct am_state *state, const char *index_file) strvec_push(&apply_opts, "apply"); strvec_pushv(&apply_opts, state->git_apply_opts.v); - opts_left = apply_parse_options(apply_opts.nr, apply_opts.v, + /* + * Build a copy that apply_parse_options() can rearrange. + * apply_opts.v keeps referencing the allocated strings for + * strvec_clear() to release. + */ + ALLOC_ARRAY(apply_argv, apply_opts.nr); + COPY_ARRAY(apply_argv, apply_opts.v, apply_opts.nr); + + opts_left = apply_parse_options(apply_opts.nr, apply_argv, &apply_state, &force_apply, &options, NULL); @@ -1513,6 +1522,7 @@ static int run_apply(const struct am_state *state, const char *index_file) strvec_clear(&apply_paths); strvec_clear(&apply_opts); clear_apply_state(&apply_state); + free(apply_argv); if (res) return res; |