From cff54acadb20f5c0f86c4bfaf05bb66cd6adbb21 Mon Sep 17 00:00:00 2001 From: Truman Kilen Date: Wed, 22 Jan 2025 11:55:31 -0600 Subject: [PATCH] Fix decompression block size --- repak/src/entry.rs | 74 +++++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/repak/src/entry.rs b/repak/src/entry.rs index 1a12469..a5fd649 100644 --- a/repak/src/entry.rs +++ b/repak/src/entry.rs @@ -394,43 +394,49 @@ impl Entry { #[cfg(not(feature = "compression"))] _ => return Err(super::Error::Compression), #[cfg(feature = "compression")] - Some(comp) => match comp { - Compression::Zlib => decompress!(flate2::read::ZlibDecoder<&[u8]>), - Compression::Gzip => decompress!(flate2::read::GzDecoder<&[u8]>), - Compression::Zstd => { - for range in ranges { - io::copy(&mut zstd::stream::read::Decoder::new(&data[range])?, buf)?; - } - } - Compression::LZ4 => { - let mut decompressed = vec![0; self.uncompressed as usize]; - for (decomp_chunk, comp_range) in decompressed - .chunks_mut(self.compression_block_size as usize) - .zip(ranges) - { - lz4_flex::block::decompress_into(&data[comp_range], decomp_chunk) - .map_err(|_| Error::DecompressionFailed(Compression::LZ4))?; - } - buf.write_all(&decompressed)?; - } - #[cfg(feature = "oodle")] - Compression::Oodle => { - let mut decompressed = vec![0; self.uncompressed as usize]; - for (decomp_chunk, comp_range) in decompressed - .chunks_mut(self.compression_block_size as usize) - .zip(ranges) - { - let out = - oodle_loader::oodle()?.decompress(&data[comp_range], decomp_chunk); - if out == 0 { - return Err(Error::DecompressionFailed(Compression::Oodle)); + Some(comp) => { + let chunk_size = if ranges.len() == 1 { + self.uncompressed as usize + } else { + self.compression_block_size as usize + }; + + match comp { + Compression::Zlib => decompress!(flate2::read::ZlibDecoder<&[u8]>), + Compression::Gzip => decompress!(flate2::read::GzDecoder<&[u8]>), + Compression::Zstd => { + for range in ranges { + io::copy(&mut zstd::stream::read::Decoder::new(&data[range])?, buf)?; } } - buf.write_all(&decompressed)?; + Compression::LZ4 => { + let mut decompressed = vec![0; self.uncompressed as usize]; + for (decomp_chunk, comp_range) in + decompressed.chunks_mut(chunk_size).zip(ranges) + { + lz4_flex::block::decompress_into(&data[comp_range], decomp_chunk) + .map_err(|_| Error::DecompressionFailed(Compression::LZ4))?; + } + buf.write_all(&decompressed)?; + } + #[cfg(feature = "oodle")] + Compression::Oodle => { + let mut decompressed = vec![0; self.uncompressed as usize]; + for (decomp_chunk, comp_range) in + decompressed.chunks_mut(chunk_size).zip(ranges) + { + let out = + oodle_loader::oodle()?.decompress(&data[comp_range], decomp_chunk); + if out == 0 { + return Err(Error::DecompressionFailed(Compression::Oodle)); + } + } + buf.write_all(&decompressed)?; + } + #[cfg(not(feature = "oodle"))] + Compression::Oodle => return Err(super::Error::Oodle), } - #[cfg(not(feature = "oodle"))] - Compression::Oodle => return Err(super::Error::Oodle), - }, + } } buf.flush()?; Ok(())