Skip to content

Commit 692f0bc

Browse files
peffgitster
authored andcommitted
avoid infinite loop in read_istream_loose
The read_istream_loose function loops on inflating a chunk of data from an mmap'd loose object. We end the loop when we run out of space in our output buffer, or if we see a zlib error. We need to treat Z_BUF_ERROR specially, though, as it is not fatal; it is just zlib's way of telling us that we need to either feed it more input or give it more output space. It is perfectly normal for us to hit this when we are at the end of our buffer. However, we may also get Z_BUF_ERROR because we have run out of input. In a well-formed object, this should not happen, because we have fed the whole mmap'd contents to zlib. But if the object is truncated or corrupt, we will loop forever, never giving zlib any more data, but continuing to ask it to inflate. We can fix this by considering it an error when zlib returns Z_BUF_ERROR but we still have output space left (which means it must want more input, which we know is a truncation error). It would not be sufficient to just check whether zlib had consumed all the input at the start of the loop, as it might still want to generate output from what is in its internal state. Signed-off-by: Jeff King <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 42e7e2a commit 692f0bc

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

streaming.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ static read_method_decl(loose)
309309
st->z_state = z_done;
310310
break;
311311
}
312-
if (status != Z_OK && status != Z_BUF_ERROR) {
312+
if (status != Z_OK && (status != Z_BUF_ERROR || total_read < sz)) {
313313
git_inflate_end(&st->z);
314314
st->z_state = z_error;
315315
return -1;

0 commit comments

Comments
 (0)