Skip to content

Commit

Permalink
avoid segfault when reading header of malformed commits
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jeff King authored and Junio C Hamano committed May 22, 2012
1 parent d0f1ea6 commit a9c7a8a
Showing 1 changed file with 4 additions and 1 deletion.
5 changes: 4 additions & 1 deletion pretty.c
Original file line number Diff line number Diff line change
Expand Up @@ -439,12 +439,14 @@ static char *get_header(const struct commit *commit, const char *key)
int key_len = strlen(key);
const char *line = commit->buffer;

for (;;) {
while (line) {
const char *eol = strchr(line, '\n'), *next;

if (line == eol)
return NULL;
if (!eol) {
warning("malformed commit (header is missing newline): %s",
sha1_to_hex(commit->object.sha1));
eol = line + strlen(line);
next = NULL;
} else
Expand All @@ -456,6 +458,7 @@ static char *get_header(const struct commit *commit, const char *key)
}
line = next;
}
return NULL;
}

static char *replace_encoding_header(char *buf, const char *encoding)
Expand Down

0 comments on commit a9c7a8a

Please sign in to comment.