Add tests for reading with an empty buffer, and fix bug in GzDecoder #150
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
I recently ran into a problem where I was wrapping a
flate2::read::GzDecoder
inside another reader, and the outer reader ended up callingread()
on theGzDecoder
with an empty buffer, and instead of just returningOk(0)
, theGzDecoder
returned anInvalidInput
error with the message:"corrupt gzip stream does not have a matching checksum"
.Here's a simple test case to reproduce (without the need for the outer writer):
The contract for
Read::read()
doesn't seem to require implementations to returnOk(0)
when the buffer is empty (instead of blocking or returning an error), but it seems like the nice thing to do. Even ifGzDecoder
wanted to return an error in this case, "corrupt gzip stream does not have a matching checksum" is definitely misleading (and in fact, it took me some time to track down the cause).Interestingly, the other
Read
impls inflate2
seem to handleread(&mut [])
just fine (e.g. if you replaceGz
withZlib
in the above test); it's justGzDecoder
that breaks.This PR adds a simple 3-line fix for
GzDecoder
, along with a bunch of unit tests.