From 70c0b164be92522d6aedb8bdfc4d59960ee8998b Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Fri, 4 Aug 2023 22:55:48 +0900 Subject: [PATCH] chore: use streaming in deflate64 crate --- Cargo.toml | 2 +- src/deflate64.rs | 61 ------------------------------------------------ src/lib.rs | 2 -- src/read.rs | 6 ++--- 4 files changed, 4 insertions(+), 67 deletions(-) delete mode 100644 src/deflate64.rs diff --git a/Cargo.toml b/Cargo.toml index 941e2651..9dd4a103 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,7 @@ pbkdf2 = {version = "0.11.0", optional = true } sha1 = {version = "0.10.1", optional = true } time = { version = "0.3.7", optional = true, default-features = false, features = ["std"] } zstd = { version = "0.11.2", optional = true } -deflate64 = { version = "0.1.3", optional = true } +deflate64 = { version = "0.1.4", optional = true } [target.'cfg(any(all(target_arch = "arm", target_pointer_width = "32"), target_arch = "mips", target_arch = "powerpc"))'.dependencies] crossbeam-utils = "0.8.8" diff --git a/src/deflate64.rs b/src/deflate64.rs deleted file mode 100644 index 5e972ffb..00000000 --- a/src/deflate64.rs +++ /dev/null @@ -1,61 +0,0 @@ -// TODO: move this module to deflate64 crate - -use deflate64::InflaterManaged; -use std::io; -use std::io::{BufRead, BufReader, Read}; - -const IN_BUFFER_MAX_SIZE: usize = 8192; - -pub(crate) struct BufferedDeflate64Decoder { - inner: R, - inflator: Box, -} - -impl BufferedDeflate64Decoder> { - pub(crate) fn new(inner: R) -> Self { - Self { - inner: BufReader::new(inner), - inflator: Box::new(InflaterManaged::new()), - } - } -} - -impl BufferedDeflate64Decoder { - pub(crate) fn into_inner(self) -> R { - self.inner - } -} - -struct State { - inflater: InflaterManaged, - in_buffer_size: u16, - in_buffer: [u8; IN_BUFFER_MAX_SIZE], -} - -impl Read for BufferedDeflate64Decoder { - fn read(&mut self, buf: &mut [u8]) -> io::Result { - loop { - let input = self.inner.fill_buf()?; - let eof = input.is_empty(); - - let result = self.inflator.inflate(input, buf); - - self.inner.consume(result.bytes_consumed); - - if result.data_error { - return Err(io::Error::new( - io::ErrorKind::InvalidInput, - "invalid deflate64", - )); - } - - if result.bytes_written == 0 && !eof && !self.inflator.finished() { - // if we haven't ready any data and we haven't hit EOF yet, - // ask again. We must not return 0 in such case - continue; - } - - Ok(result.bytes_written) - } - } -} diff --git a/src/lib.rs b/src/lib.rs index be5b2662..e2228e5b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -36,8 +36,6 @@ mod aes_ctr; mod compression; mod cp437; mod crc32; -#[cfg(feature = "deflate64")] -mod deflate64; pub mod read; pub mod result; mod spec; diff --git a/src/read.rs b/src/read.rs index 121e0149..c94e5254 100644 --- a/src/read.rs +++ b/src/read.rs @@ -24,7 +24,7 @@ use std::sync::Arc; use flate2::read::DeflateDecoder; #[cfg(feature = "deflate64")] -use crate::deflate64::BufferedDeflate64Decoder; +use deflate64::Deflate64Decoder; #[cfg(feature = "bzip2")] use bzip2::read::BzDecoder; @@ -133,7 +133,7 @@ enum ZipFileReader<'a> { ))] Deflated(Crc32Reader>>), #[cfg(feature = "deflate64")] - Deflate64(Crc32Reader>>>), + Deflate64(Crc32Reader>>>), #[cfg(feature = "bzip2")] Bzip2(Crc32Reader>>), #[cfg(feature = "zstd")] @@ -288,7 +288,7 @@ fn make_reader( } #[cfg(feature = "deflate64")] CompressionMethod::Deflate64 => { - let deflate64_reader = BufferedDeflate64Decoder::new(reader); + let deflate64_reader = Deflate64Decoder::new(reader); ZipFileReader::Deflate64(Crc32Reader::new(deflate64_reader, crc32, ae2_encrypted)) } #[cfg(feature = "bzip2")]