From ce38c836f417a991e19a01c25f3b26edabce4546 Mon Sep 17 00:00:00 2001 From: kmatveev Date: Fri, 31 May 2024 10:32:53 +0300 Subject: [PATCH 1/2] replace read() which can do partial reads(especially in BufferedReader) with read_exact() --- src/read.rs | 31 ++++++++----------------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/src/read.rs b/src/read.rs index e4b9119..464343c 100644 --- a/src/read.rs +++ b/src/read.rs @@ -21,17 +21,10 @@ impl Reader { } fn read_to_array(&mut self, buf: &mut [u8; LEN]) -> ReadResult<()> { - match self.inner.read(buf) { - Ok(n) => { - self.position += n; - - if n == LEN { - Ok(()) - } else { - Err(self.to_error(ReadErrorKind::Incomplete(Needed::Size( - NonZeroUsize::new(LEN - n).expect("n is guaranteed to not equal LEN"), - )))) - } + match self.inner.read_exact(buf) { + Ok(()) => { + self.position += LEN; + Ok(()) } Err(e) => match e.kind() { // this I/O error is non-fatal, so reading is retried @@ -45,19 +38,11 @@ impl Reader { } fn read_to_slice(&mut self, buf: &mut [u8]) -> ReadResult<()> { - match self.inner.read(buf) { - Ok(n) => { - self.position += n; + match self.inner.read_exact(buf) { + Ok(()) => { let buf_len = buf.len(); - - if n == buf_len { - Ok(()) - } else { - Err(self.to_error(ReadErrorKind::Incomplete(Needed::Size( - NonZeroUsize::new(buf_len - n) - .expect("n is guaranteed to not equal buf_len"), - )))) - } + self.position += buf_len; + Ok(()) } Err(e) => match e.kind() { // this I/O error is non-fatal, so reading is retried From ca3bfac8cec6f21d42e61d143a194cf9a5b5e999 Mon Sep 17 00:00:00 2001 From: kmatveev Date: Fri, 13 Sep 2024 21:14:48 +0300 Subject: [PATCH 2/2] fix one-byte zero size terminator of packets --- src/encode/vorbis.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/encode/vorbis.rs b/src/encode/vorbis.rs index 5c5db34..d12717f 100644 --- a/src/encode/vorbis.rs +++ b/src/encode/vorbis.rs @@ -41,7 +41,7 @@ pub(super) fn encode( let stream_size = info.size.get() as usize; let mut window = PreviousWindowRight::new(); - while source.position() - start_pos < stream_size { + while source.position() - start_pos < (stream_size - 1){ let packet_size = source .le_u16() .map_err(VorbisError::from_read(VorbisErrorKind::ReadPacket))?;