diff options
author | Junio C Hamano <gitster@pobox.com> | 2009-06-08 23:26:44 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2009-10-04 14:44:34 -0700 |
commit | 3af1cae469555485cd3ef003aa2a55bd2a4f544f (patch) | |
tree | 90d51c0e12927afc0fd6e71afec182f80babdc60 /builtin-show-branch.c | |
parent | 57343652a55bdc3e7f3cf8c6def94dac482c72e5 (diff) | |
download | git-3af1cae469555485cd3ef003aa2a55bd2a4f544f.tar.gz |
show-branch: fix segfault when showbranch.default exists
When running "git show-branch" without any parameter in a repository that
has showbranch.default defined, we used to rely on the fact that our
handcrafted option parsing loop never looked at av[0].
The array of default strings had the first real command line argument in
default_arg[0], but the option parser wanted to look at the array starting
at av[1], so we assigned the address of -1th element to av to force the
loop start working from default_arg[0].
This no longer worked since 5734365 (show-branch: migrate to parse-options
API, 2009-05-21), as parse_options_start() saved the incoming &av[0] in
its ctx->out and later in parse_options_end() it did memmove to ctx->out
(with ctx->cpidx == 0), overwriting the memory before default_arg[] array.
I am not sure if this is a bug in parse_options(), or a bug in the caller,
and tonight I do not have enough concentration to figure out which. In
any case, this patch works the issue around.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin-show-branch.c')
-rw-r--r-- | builtin-show-branch.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/builtin-show-branch.c b/builtin-show-branch.c index b1affd2ffb..5d85ab0cae 100644 --- a/builtin-show-branch.c +++ b/builtin-show-branch.c @@ -565,7 +565,15 @@ static int git_show_branch_config(const char *var, const char *value, void *cb) if (!strcmp(var, "showbranch.default")) { if (!value) return config_error_nonbool(var); - if (default_alloc <= default_num + 1) { + /* + * default_arg is now passed to parse_options(), so we need to + * mimick the real argv a bit better. + */ + if (!default_num) { + default_alloc = 20; + default_arg = xcalloc(default_alloc, sizeof(*default_arg)); + default_arg[default_num++] = "show-branch"; + } else if (default_alloc <= default_num + 1) { default_alloc = default_alloc * 3 / 2 + 20; default_arg = xrealloc(default_arg, sizeof *default_arg * default_alloc); } @@ -693,8 +701,8 @@ int cmd_show_branch(int ac, const char **av, const char *prefix) /* If nothing is specified, try the default first */ if (ac == 1 && default_num) { - ac = default_num + 1; - av = default_arg - 1; /* ick; we would not address av[0] */ + ac = default_num; + av = default_arg; } ac = parse_options(ac, av, builtin_show_branch_options, |