From 8ba1a59036445fe356ba02c05d28651e47c6229a Mon Sep 17 00:00:00 2001 From: onlyxuyang Date: Mon, 14 Oct 2024 21:45:55 +0800 Subject: [PATCH 1/2] zip64: fix zip64 extended information issue --- src/write.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/write.rs b/src/write.rs index a7c300430..da7eda8db 100644 --- a/src/write.rs +++ b/src/write.rs @@ -1828,12 +1828,21 @@ fn update_aes_extra_data(writer: &mut W, file: &mut ZipFileData Ok(()) } -fn update_local_file_header(writer: &mut T, file: &ZipFileData) -> ZipResult<()> { +fn update_local_file_header( + writer: &mut T, + file: &mut ZipFileData, +) -> ZipResult<()> { const CRC32_OFFSET: u64 = 14; writer.seek(SeekFrom::Start(file.header_start + CRC32_OFFSET))?; writer.write_u32_le(file.crc32)?; if file.large_file { + writer.write_u32_le(spec::ZIP64_BYTES_THR as u32)?; + writer.write_u32_le(spec::ZIP64_BYTES_THR as u32)?; + update_local_zip64_extra_field(writer, file)?; + + file.compressed_size = spec::ZIP64_BYTES_THR; + file.uncompressed_size = spec::ZIP64_BYTES_THR; } else { // check compressed size as well as it can also be slightly larger than uncompressed size if file.compressed_size > spec::ZIP64_BYTES_THR { @@ -1869,7 +1878,7 @@ fn write_central_directory_header(writer: &mut T, file: &ZipFileData) fn update_local_zip64_extra_field( writer: &mut T, - file: &ZipFileData, + file: &mut ZipFileData, ) -> ZipResult<()> { let block = file.zip64_extra_field_block().ok_or(InvalidArchive( "Attempted to update a nonexistent ZIP64 extra field", @@ -1882,6 +1891,9 @@ fn update_local_zip64_extra_field( writer.seek(SeekFrom::Start(zip64_extra_field_start))?; let block = block.serialize(); writer.write_all(&block)?; + + file.extra_field = Some(block.into_vec().into()); + Ok(()) } From 9bfd5c8492bcaefbf60096309e9e8a1bea18e246 Mon Sep 17 00:00:00 2001 From: onlyxuyang Date: Wed, 20 Nov 2024 23:36:31 +0800 Subject: [PATCH 2/2] fix crypto case issue Signed-off-by: onlyxuyang --- src/write.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/write.rs b/src/write.rs index 1b940aeff..3440d2fd2 100644 --- a/src/write.rs +++ b/src/write.rs @@ -1937,7 +1937,8 @@ fn update_local_zip64_extra_field( let block = block.serialize(); writer.write_all(&block)?; - file.extra_field = Some(block.into_vec().into()); + let extra_field = Arc::get_mut(file.extra_field.as_mut().unwrap()).unwrap(); + extra_field[..block.len()].copy_from_slice(&block); Ok(()) }