-
Notifications
You must be signed in to change notification settings - Fork 47
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
decompression logic error edge case prevents clean decompression into an exact sized buffer. #110
Comments
This will only be the case for zlib streams, as raw deflate streams won't have the checksum. Would have to test a bit to see whether that thing is needed or not, or it could simply check if the remaining data is the checksum and the stream itself is done. |
As I said, all other existing tests passed when that one line was deleted. |
Yup, just want to make sure we're not creating a rare edge case that's not covered by the tests with that change, will have a look at it this week. |
Does 5869904 sort it for you? It will now skip the check if the decoder is in the ReadAdler32 state as if we are there we know for sure that there won't be any more output. I'm a bit hesitant to just remove check entirely, it was added as a response to #68 as a safety measure to avoid data loss if both input is empty and output is full at the same time. It's possible it could be done in a better way though. |
Yes, I rebased my branch and it no longer requires the +1 byte to pass tests. |
Deep inside of
decompress
after all the state machines is the following:If you're streaming in the decompression and your output buffer is full but the decompressor needs more input to finish reading the adler32 value, this will cause the decompressor to claim that it needs more output space when no actual additional output will occur. To ensure a successful decompression no matter how the stream is chunked up your output buffer will always have to be 1 more byte than the actual output size.
Simply deleting this line allows all tests to pass except for a single test which enumerates every possible error case in every possible situation and which expects the current behavior.
The text was updated successfully, but these errors were encountered: