Browse Source

Prevent git blame from segfaulting on a missing author name

The human-readable author and committer name can be missing from
commits imported from foreign SCM interfaces.  Make sure we parse
the "author" and "committer" line a bit more leniently and avoid
segfaulting by assuming the name always exists.

Signed-off-by: David Reiss <dreiss@facebook.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
David Reiss 15 years ago committed by Junio C Hamano
parent
commit
c8cba79181
  1. 13
      builtin-blame.c
  2. 13
      t/t8003-blame.sh

13
builtin-blame.c

@ -1305,6 +1305,7 @@ static void get_ac_line(const char *inbuf, const char *what,
error_out: error_out:
/* Ugh */ /* Ugh */
*tz = "(unknown)"; *tz = "(unknown)";
strcpy(person, *tz);
strcpy(mail, *tz); strcpy(mail, *tz);
*time = 0; *time = 0;
return; return;
@ -1314,20 +1315,26 @@ static void get_ac_line(const char *inbuf, const char *what,
tmp = person; tmp = person;
tmp += len; tmp += len;
*tmp = 0; *tmp = 0;
while (*tmp != ' ') while (person < tmp && *tmp != ' ')
tmp--; tmp--;
if (tmp <= person)
goto error_out;
*tz = tmp+1; *tz = tmp+1;
tzlen = (person+len)-(tmp+1); tzlen = (person+len)-(tmp+1);


*tmp = 0; *tmp = 0;
while (*tmp != ' ') while (person < tmp && *tmp != ' ')
tmp--; tmp--;
if (tmp <= person)
goto error_out;
*time = strtoul(tmp, NULL, 10); *time = strtoul(tmp, NULL, 10);
timepos = tmp; timepos = tmp;


*tmp = 0; *tmp = 0;
while (*tmp != ' ') while (person < tmp && *tmp != ' ')
tmp--; tmp--;
if (tmp <= person)
return;
mailpos = tmp + 1; mailpos = tmp + 1;
*tmp = 0; *tmp = 0;
maillen = timepos - tmp; maillen = timepos - tmp;

13
t/t8003-blame.sh

@ -144,4 +144,17 @@ test_expect_success 'blame path that used to be a directory' '
git blame HEAD^.. -- path git blame HEAD^.. -- path
' '


test_expect_success 'blame to a commit with no author name' '
TREE=`git rev-parse HEAD:`
cat >badcommit <<EOF
tree $TREE
author <noname> 1234567890 +0000
committer David Reiss <dreiss@facebook.com> 1234567890 +0000

some message
EOF
COMMIT=`git hash-object -t commit -w badcommit`
git --no-pager blame $COMMIT -- uno >/dev/null
'

test_done test_done

Loading…
Cancel
Save