Fix decompression block size

This commit is contained in:
Truman Kilen 2025-01-22 11:55:31 -06:00
parent 29bf6e7859
commit cff54acadb

View file

@ -394,43 +394,49 @@ impl Entry {
#[cfg(not(feature = "compression"))] #[cfg(not(feature = "compression"))]
_ => return Err(super::Error::Compression), _ => return Err(super::Error::Compression),
#[cfg(feature = "compression")] #[cfg(feature = "compression")]
Some(comp) => match comp { Some(comp) => {
Compression::Zlib => decompress!(flate2::read::ZlibDecoder<&[u8]>), let chunk_size = if ranges.len() == 1 {
Compression::Gzip => decompress!(flate2::read::GzDecoder<&[u8]>), self.uncompressed as usize
Compression::Zstd => { } else {
for range in ranges { self.compression_block_size as usize
io::copy(&mut zstd::stream::read::Decoder::new(&data[range])?, buf)?; };
}
} match comp {
Compression::LZ4 => { Compression::Zlib => decompress!(flate2::read::ZlibDecoder<&[u8]>),
let mut decompressed = vec![0; self.uncompressed as usize]; Compression::Gzip => decompress!(flate2::read::GzDecoder<&[u8]>),
for (decomp_chunk, comp_range) in decompressed Compression::Zstd => {
.chunks_mut(self.compression_block_size as usize) for range in ranges {
.zip(ranges) io::copy(&mut zstd::stream::read::Decoder::new(&data[range])?, buf)?;
{
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));
} }
} }
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()?; buf.flush()?;
Ok(()) Ok(())