This commit is contained in:
Jean-Marie 'Histausse' Mineau 2025-01-28 00:03:34 +01:00
parent 59d01d04db
commit 48817d1df8
Signed by: histausse
GPG key ID: B66AEEDA9B645AD2
6 changed files with 58 additions and 10 deletions

View file

@ -1,12 +1,16 @@
use log::warn;
use std::collections::HashMap;
use std::io::{Read, Seek, SeekFrom};
use crate::{
apk_signing_block::ApkSigningBlock, apk_signing_block::Magic, compression::CompressionMethod,
apk_signing_block::ApkSigningBlock,
apk_signing_block::Magic,
compression::CompressionMethod,
data_descriptor::{DataDescriptor, DataDescriptor32, DataDescriptor64},
end_of_central_directory::EndCentralDirectory,
end_of_central_directory::Zip64EndCentralDirectory,
end_of_central_directory::Zip64EndCentralDirectoryLocator, general_purpose_flags, FileHeader,
FileInfo, LocalFileHeader, Signature,
end_of_central_directory::Zip64EndCentralDirectoryLocator,
general_purpose_flags, FileHeader, FileInfo, LocalFileHeader, Signature,
};
use androscalpel_serializer::Serializable;
use flate2::read::DeflateDecoder;
@ -80,18 +84,34 @@ impl<T: Read + Seek> ZipFileReader<T> {
.seek(SeekFrom::Start(header.get_offset_local_header()))
.unwrap();
let local_header = LocalFileHeader::deserialize(&mut zip_file.data).unwrap();
zip_file.data.seek(SeekFrom::Start(pos_in_dir)).unwrap();
if (local_header.general_purpose_flags
let data_descriptor = if (local_header.general_purpose_flags
& general_purpose_flags::MASK_USE_DATA_DESCRIPTOR
!= 0)
|| (header.general_purpose_flags & general_purpose_flags::MASK_USE_DATA_DESCRIPTOR
!= 0)
{
panic!("Data Descriptor not yet suported");
}
warn!("Data Descriptor not yet suported");
zip_file
.data
.seek(SeekFrom::Current(header.compressed_size as i64))
.unwrap();
if zip_file.zip64_end_of_central_directory.is_some() {
Some(DataDescriptor::Zip64(
DataDescriptor64::deserialize(&mut zip_file.data).unwrap(),
))
} else {
Some(DataDescriptor::Zip32(
DataDescriptor32::deserialize(&mut zip_file.data).unwrap(),
))
}
} else {
None
};
zip_file.data.seek(SeekFrom::Start(pos_in_dir)).unwrap();
zip_file.files.push(FileInfo {
local_header,
header,
data_descriptor,
});
}
assert_eq!(size_read, cd_size);