An insane ident line (generated by old version of git or by hands such
as git-hash-object) may cause segfault for `git log` and others commands.

This is because the `split_ident_line` function save the result in
ident_split, and the returned ident_split.date_begin, ident_split.date_end,
ident_split.tz_begin, and ident_split.tz_end maybe NULL pointers for an
insame ident line.

This issue was was introduced in v1.8.1-rc1-7-g3c020bd (Use split_ident_line
to parse author and committer).

Signed-off-by: Jiang Xin <worldhello....@gmail.com>
---
 builtin/blame.c | 14 +++++++++++---
 pretty.c        |  9 +++++++--
 2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/builtin/blame.c b/builtin/blame.c
index 86100..4b94e 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -1375,10 +1375,18 @@ static void get_ac_line(const char *inbuf, const char 
*what,
        maillen = ident.mail_end - ident.mail_begin;
        mailbuf = ident.mail_begin;
 
-       *time = strtoul(ident.date_begin, NULL, 10);
+       if (ident.date_begin != NULL) {
+               *time = strtoul(ident.date_begin, NULL, 10);
+       } else {
+               *time = 0;
+       }
 
-       len = ident.tz_end - ident.tz_begin;
-       strbuf_add(tz, ident.tz_begin, len);
+       if (ident.tz_begin != NULL && ident.tz_end !=NULL) {
+               len = ident.tz_end - ident.tz_begin;
+               strbuf_add(tz, ident.tz_begin, len);
+       } else {
+               strbuf_addstr(tz, "(unknown)");
+       }
 
        /*
         * Now, convert both name and e-mail using mailmap
diff --git a/pretty.c b/pretty.c
index d3a82..2402f 100644
--- a/pretty.c
+++ b/pretty.c
@@ -438,8 +438,13 @@ void pp_user_info(const struct pretty_print_context *pp,
        strbuf_add(&name, namebuf, namelen);
 
        namelen = name.len + mail.len + 3; /* ' ' + '<' + '>' */
-       time = strtoul(ident.date_begin, &date, 10);
-       tz = strtol(date, NULL, 10);
+       if (ident.date_begin != NULL) {
+               time = strtoul(ident.date_begin, &date, 10);
+               tz = strtol(date, NULL, 10);
+       } else {
+               time = 0;
+               tz = 0;
+       }
 
        if (pp->fmt == CMIT_FMT_EMAIL) {
                strbuf_addstr(sb, "From: ");
-- 
1.8.2.1.348.gb94490b

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to