avoid segfault when reading header of malformed commits

If a commit object has a header line at the end of the buffer that is missing its newline (or if it appears so because the content on the header line contains a stray NUL), then git will segfault. Interestingly, this case is explicitly handled and we do correctly scan the final line for the header we are looking for. But if we don't find it, we will dereference NULL while trying to look at the next line. Git will never generate such a commit, but it's good to be defensive. We could die() in such a case, but since it's easy enough to handle it gracefully, let's just issue a warning and continue (so you could still view such a commit with "git show", though you might be missing headers after the NUL). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed May 22, 2012 at 00:52 UTC a9c7a8a8bef30bbbf87e0d4c0e64d50c676f70ed
1 file changed +4 -1
pretty.c
+4 -1
@@ -439,12 +439,14 @@ static char *get_header(const struct commit *commit, const char *key)
439 int key_len = strlen(key);
440 const char *line = commit->buffer;
441
442 - for (;;) {
442 + while (line) {
443 const char *eol = strchr(line, '\n'), *next;
444
445 if (line == eol)
446 return NULL;
447 if (!eol) {
448 + warning("malformed commit (header is missing newline): %s",
449 + sha1_to_hex(commit->object.sha1));
450 eol = line + strlen(line);
451 next = NULL;
452 } else
@@ -456,6 +458,7 @@ static char *get_header(const struct commit *commit, const char *key)
458 }
459 line = next;
460 }
461 + return NULL;
462 }
463
464 static char *replace_encoding_header(char *buf, const char *encoding)