Skip to content

Commit

Permalink
show-branch: fix segfault when showbranch.default exists
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano committed Oct 4, 2009
1 parent 5734365 commit 3af1cae
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 3 deletions.
14 changes: 11 additions & 3 deletions builtin-show-branch.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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,
Expand Down
8 changes: 8 additions & 0 deletions t/t3202-show-branch-octopus.sh
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,12 @@ test_expect_success 'show-branch with more than 8 branches' '
'

test_expect_success 'show-branch with showbranch.default' '
for i in $numbers; do
git config --add showbranch.default branch$i
done &&
git show-branch >out &&
test_cmp expect out
'

test_done

0 comments on commit 3af1cae

Please sign in to comment.