Browse Source

for-each-ref: do not segv with %(HEAD) on an unborn branch

The code to flip between "*" and " " prefixes depending on what
branch is checked out used in --format='%(HEAD)' did not consider
that HEAD may resolve to an unborn branch and dereferenced a NULL.

This will become a lot easier to trigger as the codepath will be
used to reimplement "git branch [--list]" in the future.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Junio C Hamano 8 years ago
parent
commit
84679d470d
  1. 2
      ref-filter.c
  2. 10
      t/t6300-for-each-ref.sh

2
ref-filter.c

@ -1017,7 +1017,7 @@ static void populate_value(struct ref_array_item *ref) @@ -1017,7 +1017,7 @@ static void populate_value(struct ref_array_item *ref)

head = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
sha1, NULL);
if (!strcmp(ref->refname, head))
if (head && !strcmp(ref->refname, head))
v->s = "*";
else
v->s = " ";

10
t/t6300-for-each-ref.sh

@ -553,4 +553,14 @@ test_expect_success 'Verify sort with multiple keys' ' @@ -553,4 +553,14 @@ test_expect_success 'Verify sort with multiple keys' '
refs/tags/bogo refs/tags/master > actual &&
test_cmp expected actual
'

test_expect_success 'do not dereference NULL upon %(HEAD) on unborn branch' '
test_when_finished "git checkout master" &&
git for-each-ref --format="%(HEAD) %(refname:short)" refs/heads/ >actual &&
sed -e "s/^\* / /" actual >expect &&
git checkout --orphan HEAD &&
git for-each-ref --format="%(HEAD) %(refname:short)" refs/heads/ >actual &&
test_cmp expect actual
'

test_done

Loading…
Cancel
Save