Don't call self.inner.read() with empty buffer #4
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.
Alas, I have just learned the hard way that some
Read
implementations (in this case,flate2::read::GzEncoder
) don't behave nicely whenread()
is called with an empty buffer (you'd think they'd just returnOk(0)
, butGzEncoder
gets confused). However, theRead
implementation fornewc::Reader
callsself.inner.read()
with a buffer limited in length to the size of the remaining data, which could be zero even if the original buffer was nonempty. (And so I had a bug where copying data from an entry in a gzipped cpio archive would fail.)This PR adds the simple workaround of not bothering to call
self.inner.read()
iflimit
is zero. I think this is probably slightly better anyway, even for better-behaved inner readers, sinceself.inner.read()
could potentially involve a syscall or some other relatively expensive operation, and there's no reason to do that if we already know we won't be returning any data.