From ede85c0f9e2588b691663f6737030c9564f9e35d Mon Sep 17 00:00:00 2001 From: Chris Hennick <4961925+Pr0methean@users.noreply.github.com> Date: Fri, 14 Jun 2024 10:01:50 -0700 Subject: [PATCH] test: Fix bug: wrong field was being used for CRC32 --- src/extra_fields/zipinfo_utf8.rs | 4 ++-- src/read.rs | 5 +++-- src/write.rs | 28 +++------------------------- 3 files changed, 8 insertions(+), 29 deletions(-) diff --git a/src/extra_fields/zipinfo_utf8.rs b/src/extra_fields/zipinfo_utf8.rs index ca89d0d1..7119bbfb 100644 --- a/src/extra_fields/zipinfo_utf8.rs +++ b/src/extra_fields/zipinfo_utf8.rs @@ -13,9 +13,9 @@ pub struct UnicodeExtraField { impl UnicodeExtraField { /// Verifies the checksum and returns the content. - pub fn unwrap_valid(self) -> ZipResult> { + pub fn unwrap_valid(self, ascii_field: &[u8]) -> ZipResult> { let mut crc32 = crc32fast::Hasher::new(); - crc32.update(&self.content); + crc32.update(ascii_field); let actual_crc32 = crc32.finalize(); if self.crc32 != actual_crc32 { return Err(ZipError::InvalidArchive( diff --git a/src/read.rs b/src/read.rs index 2911cbf8..91602d17 100644 --- a/src/read.rs +++ b/src/read.rs @@ -1285,7 +1285,7 @@ pub(crate) fn parse_single_extra_field( // APPNOTE 4.6.8 and https://libzip.org/specifications/extrafld.txt file.file_comment = String::from_utf8( UnicodeExtraField::try_from_reader(reader, len)? - .unwrap_valid()? + .unwrap_valid(file.file_comment.as_bytes())? .into_vec(), )? .into(); @@ -1293,7 +1293,8 @@ pub(crate) fn parse_single_extra_field( 0x7075 => { // Info-ZIP Unicode Path Extra Field // APPNOTE 4.6.9 and https://libzip.org/specifications/extrafld.txt - file.file_name_raw = UnicodeExtraField::try_from_reader(reader, len)?.unwrap_valid()?; + file.file_name_raw = UnicodeExtraField::try_from_reader(reader, len)? + .unwrap_valid(&file.file_name_raw)?; file.file_name = String::from_utf8(file.file_name_raw.clone().into_vec())?.into_boxed_str(); file.is_utf8 = true; diff --git a/src/write.rs b/src/write.rs index 716d170a..c946e94b 100644 --- a/src/write.rs +++ b/src/write.rs @@ -2584,14 +2584,13 @@ mod test { #[test] #[cfg(not(feature = "unreserved"))] - fn test_fuzz_crash_2024_06_13() -> ZipResult<()> { + fn test_invalid_extra_data_unreserved() { use crate::write::ExtendedFileOptions; let mut writer = ZipWriter::new(Cursor::new(Vec::new())); - writer.set_flush_on_finish_file(false); let options = FileOptions { compression_method: Stored, compression_level: None, - last_modified_time: DateTime::from_date_and_time(2021, 8, 8, 1, 0, 29)?, + last_modified_time: DateTime::from_date_and_time(2021, 8, 8, 1, 0, 29).unwrap(), permissions: None, large_file: true, encrypt_with: None, @@ -2605,28 +2604,7 @@ mod test { alignment: 4103, ..Default::default() }; - writer.start_file_from_path("", options)?; - let finished = writer.finish_into_readable()?; - let inner = finished.into_inner(); - writer = ZipWriter::new_append(inner)?; - let options = FileOptions { - compression_method: Stored, - compression_level: None, - last_modified_time: DateTime::default(), - permissions: None, - large_file: false, - encrypt_with: None, - extended_options: ExtendedFileOptions { - extra_data: vec![].into(), - central_extra_data: vec![].into(), - }, - alignment: 0, - ..Default::default() - }; - writer.start_file_from_path("", options)?; - writer.shallow_copy_file_from_path("", "")?; - let _ = writer.finish_into_readable()?; - Ok(()) + assert!(writer.start_file_from_path("", options).is_err()); } #[cfg(feature = "deflate64")]