From a24ae8622cc2f829a8101a7f812fc98297053cc3 Mon Sep 17 00:00:00 2001 From: igorechek06 Date: Sat, 10 Aug 2024 22:58:27 +0900 Subject: Add more tests --- src/zip/driver.rs | 55 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/zip/driver.rs b/src/zip/driver.rs index 81629dd..7758479 100644 --- a/src/zip/driver.rs +++ b/src/zip/driver.rs @@ -98,33 +98,38 @@ impl ArchiveRead for Zip { // Try to find eocdr64locator io.seek(SeekFrom::Start(pos.saturating_sub(20)))?; let buf = io.read_arr::<20>()?; - let (cd_pointer, cd_size, cd_records) = - // If locator found then read eocdr64 - if buf[0..4] == EOCDR64_LOCATOR_SIGNATURE { - let eocdr64locator: Eocdr64Locator = deserialize(&buf[4..]).unwrap(); - - io.seek(SeekFrom::Start(eocdr64locator.eocdr64_pointer))?; - let buf = io.read_arr::<56>()?; - if buf[0..4] != EOCDR64_SIGNATURE { - return Err(ZipError::InvalidSignature("Eocdr64")); - } - let eocdr64: Eocdr64 = deserialize(&buf[4..]).unwrap(); - if eocdr64.cd_pointer + eocdr64.cd_size > eocdr64locator.eocdr64_pointer { - return Err(ZipError::Overlapping("Central directory records", "Zip64 end of central directory record")); - } + let (cd_pointer, cd_size, cd_records) = if buf[..4] == EOCDR64_LOCATOR_SIGNATURE { + // Locator found + let eocdr64locator: Eocdr64Locator = deserialize(&buf[4..]).unwrap(); - (eocdr64.cd_pointer, eocdr64.cd_size, eocdr64.cd_records) - } else { - if (eocdr.cd_pointer + eocdr.cd_size) as u64 > pos { - return Err(ZipError::Overlapping("Central directory records", "End of central directory record")); - } + io.seek(SeekFrom::Start(eocdr64locator.eocdr64_pointer))?; + if io.read_arr()? != EOCDR64_SIGNATURE { + return Err(ZipError::InvalidSignature("Eocdr64")); + } - ( - eocdr.cd_pointer as u64, - eocdr.cd_size as u64, - eocdr.cd_records as u64, - ) - }; + let eocdr64: Eocdr64 = deserialize(&io.read_arr::<52>()?).unwrap(); + if eocdr64.cd_pointer + eocdr64.cd_size > eocdr64locator.eocdr64_pointer { + return Err(ZipError::Overlapping( + "Central directory records", + "Zip64 end of central directory record", + )); + } + + (eocdr64.cd_pointer, eocdr64.cd_size, eocdr64.cd_records) + } else { + if (eocdr.cd_pointer + eocdr.cd_size) as u64 > pos { + return Err(ZipError::Overlapping( + "Central directory records", + "End of central directory record", + )); + } + + ( + eocdr.cd_pointer as u64, + eocdr.cd_size as u64, + eocdr.cd_records as u64, + ) + }; // Read cd records let mut indexes = Map::with_capacity(cd_records as usize); -- cgit v1.2.3