Skip to content

Commit

Permalink
Make sure fsck_commit_buffer() does not run out of the buffer
Browse files Browse the repository at this point in the history
So far, we assumed that the buffer is NUL terminated, but this is not
a safe assumption, now that we opened the fsck_object() API to pass a
buffer directly.

So let's make sure that there is at least an empty line in the buffer.
That way, our checks would fail if the empty line was encountered
prematurely, and consequently we can get away with the current string
comparisons even with non-NUL-terminated buffers are passed to
fsck_object().

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Johannes Schindelin authored and Junio C Hamano committed Sep 11, 2014
1 parent 90a398b commit 4d0d897
Showing 1 changed file with 23 additions and 0 deletions.
23 changes: 23 additions & 0 deletions fsck.c
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,26 @@ static int fsck_tree(struct tree *item, int strict, fsck_error error_func)
return retval;
}

static int require_end_of_header(const void *data, unsigned long size,
struct object *obj, fsck_error error_func)
{
const char *buffer = (const char *)data;
unsigned long i;

for (i = 0; i < size; i++) {
switch (buffer[i]) {
case '\0':
return error_func(obj, FSCK_ERROR,
"unterminated header: NUL at offset %d", i);
case '\n':
if (i + 1 < size && buffer[i + 1] == '\n')
return 0;
}
}

return error_func(obj, FSCK_ERROR, "unterminated header");
}

static int fsck_ident(const char **ident, struct object *obj, fsck_error error_func)
{
char *end;
Expand Down Expand Up @@ -284,6 +304,9 @@ static int fsck_commit_buffer(struct commit *commit, const char *buffer,
unsigned parent_count, parent_line_count = 0;
int err;

if (require_end_of_header(buffer, size, &commit->object, error_func))
return -1;

if (!skip_prefix(buffer, "tree ", &buffer))
return error_func(&commit->object, FSCK_ERROR, "invalid format - expected 'tree' line");
if (get_sha1_hex(buffer, tree_sha1) || buffer[40] != '\n')
Expand Down

0 comments on commit 4d0d897

Please sign in to comment.