From 1f7b25ef55611799e74f2f4bca18e15b2187daaf Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Sat, 3 Dec 2022 18:31:28 +0100 Subject: [PATCH] Fix read in packbits decoder This assumed that a `read` would succeed for the full length, thus interpreting in a subsequent call some data bits as a header. For instance, consider 77 bytes of literal were left and a buffer of 1024 bytes was provided. Then the `read` call might return 60 which was ignored and assumed to be 77. Thus the next 17 bytes of literal data were instead interpreted as a header due to setting `self.count` to 0. --- src/decoder/stream.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/decoder/stream.rs b/src/decoder/stream.rs index 160ea38..8912ad9 100644 --- a/src/decoder/stream.rs +++ b/src/decoder/stream.rs @@ -384,23 +384,23 @@ impl Read for PackBitsReader { } let length = buf.len().min(self.count); - match self.state { - PackBitsReaderState::Literal => { - self.reader.read(&mut buf[..length])?; - } + let actual = match self.state { + PackBitsReaderState::Literal => self.reader.read(&mut buf[..length])?, PackBitsReaderState::Repeat { value } => { for b in &mut buf[..length] { *b = value; } + + length } PackBitsReaderState::Header => unreachable!(), - } + }; - self.count -= length; + self.count -= actual; if self.count == 0 { self.state = PackBitsReaderState::Header; } - return Ok(length); + return Ok(actual); } }