summaryrefslogtreecommitdiff
path: root/builtin-blame.c
diff options
context:
space:
mode:
authorDavid Reiss <dreiss@facebook.com>2009-12-22 18:51:41 (GMT)
committerJunio C Hamano <gitster@pobox.com>2009-12-22 19:51:17 (GMT)
commitc8cba79181abc139d7cba364bf868875426fc2c1 (patch)
treefbe48748ccb1778d9173bf2816ef8a0812e222b2 /builtin-blame.c
parente49ca974d6ff2dda1ff4ee39e7cc33af33d1eb2a (diff)
downloadgit-c8cba79181abc139d7cba364bf868875426fc2c1.zip
git-c8cba79181abc139d7cba364bf868875426fc2c1.tar.gz
git-c8cba79181abc139d7cba364bf868875426fc2c1.tar.bz2
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>
Diffstat (limited to 'builtin-blame.c')
-rw-r--r--builtin-blame.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/builtin-blame.c b/builtin-blame.c
index dd16b22..98e818c 100644
--- a/builtin-blame.c
+++ b/builtin-blame.c
@@ -1305,6 +1305,7 @@ static void get_ac_line(const char *inbuf, const char *what,
error_out:
/* Ugh */
*tz = "(unknown)";
+ strcpy(person, *tz);
strcpy(mail, *tz);
*time = 0;
return;
@@ -1314,20 +1315,26 @@ static void get_ac_line(const char *inbuf, const char *what,
tmp = person;
tmp += len;
*tmp = 0;
- while (*tmp != ' ')
+ while (person < tmp && *tmp != ' ')
tmp--;
+ if (tmp <= person)
+ goto error_out;
*tz = tmp+1;
tzlen = (person+len)-(tmp+1);
*tmp = 0;
- while (*tmp != ' ')
+ while (person < tmp && *tmp != ' ')
tmp--;
+ if (tmp <= person)
+ goto error_out;
*time = strtoul(tmp, NULL, 10);
timepos = tmp;
*tmp = 0;
- while (*tmp != ' ')
+ while (person < tmp && *tmp != ' ')
tmp--;
+ if (tmp <= person)
+ return;
mailpos = tmp + 1;
*tmp = 0;
maillen = timepos - tmp;