From d26b298b3a27e26bd5524ee5b6f16255c5129d8f Mon Sep 17 00:00:00 2001 From: Antoni Boucher Date: Fri, 10 Feb 2023 15:58:01 -0500 Subject: [PATCH] Update read_skippable_frame to take a Write parameter --- src/stream/read/mod.rs | 10 +++------- src/stream/zio/writer.rs | 7 +++++-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/stream/read/mod.rs b/src/stream/read/mod.rs index e42bfc49..df354374 100644 --- a/src/stream/read/mod.rs +++ b/src/stream/read/mod.rs @@ -2,7 +2,7 @@ #[cfg(feature = "experimental")] use std::cmp::min; #[cfg(feature = "experimental")] -use std::io::{SeekFrom, Seek}; +use std::io::{SeekFrom, Seek, Write}; use std::io::{self, BufRead, BufReader, Read}; #[cfg(feature = "experimental")] use std::mem::size_of; @@ -106,7 +106,7 @@ impl<'a, R: Read + Seek> Decoder<'a, BufReader> { /// Attempt to read a skippable frame and write its content to `dest`. /// If it cannot read a skippable frame, the reader will be back to its starting position. - pub fn read_skippable_frame(&mut self, dest: &mut [u8]) -> io::Result<(usize, MagicVariant)> { + pub fn read_skippable_frame(&mut self, dest: &mut W) -> io::Result<(usize, MagicVariant)> { let magic_buffer = self.reader.peek_4bytes()?; let op = self.reader.operation(); if !op.is_skippable_frame(&magic_buffer) { @@ -121,12 +121,8 @@ impl<'a, R: Read + Seek> Decoder<'a, BufReader> { self.reader.reader_mut().read_exact(&mut buffer)?; let content_size = u32::from_le_bytes(buffer) as usize; - if content_size > dest.len() { - return Err(io::Error::new(io::ErrorKind::Other, "Destination buffer is too small")); - } - if content_size > 0 { - self.reader.reader_mut().read_exact(&mut dest[..content_size])?; + std::io::copy(&mut self.reader.reader_mut().take(content_size as u64), dest)?; } let magic_variant = magic_number - MAGIC_SKIPPABLE_START; diff --git a/src/stream/zio/writer.rs b/src/stream/zio/writer.rs index 98758775..1d5139aa 100644 --- a/src/stream/zio/writer.rs +++ b/src/stream/zio/writer.rs @@ -346,7 +346,7 @@ mod tests { // Decompress and skip a frame. let mut decoder = Decoder::new(data).unwrap().single_frame(); - let mut frame = vec![0; 20]; + let mut frame = vec![]; let (size, _) = decoder.read_skippable_frame(&mut frame).unwrap(); assert_eq!("test content", String::from_utf8_lossy(&frame[..size])); @@ -370,6 +370,7 @@ mod tests { .single_frame() }; + let mut frame = vec![]; let (size, _) = decoder.read_skippable_frame(&mut frame).unwrap(); assert_eq!("SKIP", String::from_utf8_lossy(&frame[..size])); @@ -384,6 +385,7 @@ mod tests { .single_frame() }; + let mut frame = vec![]; let (size, _) = decoder.read_skippable_frame(&mut frame).unwrap(); assert_eq!("end", String::from_utf8_lossy(&frame[..size])); @@ -432,10 +434,11 @@ mod tests { .single_frame() }; - let mut frame = vec![0; 20]; + let mut frame = vec![]; let (size, _) = decoder.read_skippable_frame(&mut frame).unwrap(); assert_eq!("SKIP", String::from_utf8_lossy(&frame[..size])); + let mut frame = vec![]; let (size, _) = decoder.read_skippable_frame(&mut frame).unwrap(); assert_eq!("second skip frame", String::from_utf8_lossy(&frame[..size])); }