From 5e74d3d3dba94e1930f53933c49f58015de29580 Mon Sep 17 00:00:00 2001 From: n4n5 Date: Thu, 5 Feb 2026 23:12:59 -0700 Subject: [PATCH 1/6] fix: update --- bin/zipdetails | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/bin/zipdetails b/bin/zipdetails index 4a17256..957ea4a 100755 --- a/bin/zipdetails +++ b/bin/zipdetails @@ -4230,9 +4230,12 @@ sub walk_Zip64_in_CD return; } - my $assumeAllFieldsPresent = (length($zip64Extended) == 28) ; + # The order of the fields in the zip64 extended + # information record is fixed, but the fields MUST + # only appear if the corresponding Local or Central + # directory record field is set to 0xFFFF or 0xFFFFFFFF. - if ($assumeAllFieldsPresent || full32 $entry->std_uncompressedSize ) + if (full32 $entry->std_uncompressedSize) { if (length $zip64Extended < 8) { @@ -4249,7 +4252,7 @@ sub walk_Zip64_in_CD if $display; } - if ($assumeAllFieldsPresent || full32 $entry->std_compressedSize) + if (full32 $entry->std_compressedSize) { if (length $zip64Extended < 8) { @@ -4267,7 +4270,7 @@ sub walk_Zip64_in_CD if $display; } - if ($assumeAllFieldsPresent || full32 $entry->std_localHeaderOffset) + if (full32 $entry->std_localHeaderOffset) { if (length $zip64Extended < 8) { @@ -4289,7 +4292,7 @@ sub walk_Zip64_in_CD $entry->localHeaderOffset(checkOffsetValue($entry->localHeaderOffset, $fieldStart, 0, $commonMessage, $fieldStart, ZIP_LOCAL_HDR_SIG, 0) ); } - if ($assumeAllFieldsPresent || full16 $entry->std_diskNumber) + if (full16 $entry->std_diskNumber) { if (length $zip64Extended < 4) { @@ -4301,7 +4304,6 @@ sub walk_Zip64_in_CD $fieldOffset += 4; - my $here = $FH->tell(); my $data = substr($zip64Extended, 0, 4, "") ; $entry->diskNumber(unpack "v", $data); out2 $data, "Disk Number", Value_V($entry->diskNumber) From ea2b56f84b45cc1cd7b883fe28b9567153f7594e Mon Sep 17 00:00:00 2001 From: n4n5 Date: Fri, 6 Feb 2026 17:58:29 -0700 Subject: [PATCH 2/6] fix: add info if not used --- bin/zipdetails | 86 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 61 insertions(+), 25 deletions(-) diff --git a/bin/zipdetails b/bin/zipdetails index 957ea4a..8bd6144 100755 --- a/bin/zipdetails +++ b/bin/zipdetails @@ -4234,8 +4234,9 @@ sub walk_Zip64_in_CD # information record is fixed, but the fields MUST # only appear if the corresponding Local or Central # directory record field is set to 0xFFFF or 0xFFFFFFFF. + my $assumeAllFieldsPresent = (length($zip64Extended) == 28); - if (full32 $entry->std_uncompressedSize) + if ($assumeAllFieldsPresent || full32 $entry->std_uncompressedSize) { if (length $zip64Extended < 8) { @@ -4246,13 +4247,22 @@ sub walk_Zip64_in_CD } $fieldOffset += 8; - my $data = substr($zip64Extended, 0, 8, "") ; - $entry->uncompressedSize(unpack "Q<", $data); - out2 $data, "Uncompressed Size", Value_Q($entry->uncompressedSize) - if $display; + my $data = substr $zip64Extended, 0, 8, ""; + my $value = unpack "Q<", $data; + if (full32 $entry->std_compressedSize) + { + $entry->uncompressedSize($value); + out2 $data, "Uncompressed Size", Value_Q($entry->uncompressedSize) + if $display; + } + else + { + info $data, "Uncompressed Size " . Value_V($value) . " is not used since uncompressedSize is not set to 0xFFFFFFFF" + if $display; + } } - if (full32 $entry->std_compressedSize) + if ($assumeAllFieldsPresent || full32 $entry->std_compressedSize) { if (length $zip64Extended < 8) { @@ -4264,13 +4274,22 @@ sub walk_Zip64_in_CD $fieldOffset += 8; - my $data = substr($zip64Extended, 0, 8, "") ; - $entry->compressedSize(unpack "Q<", $data); - out2 $data, "Compressed Size", Value_Q($entry->compressedSize) - if $display; + my $data = substr $zip64Extended, 0, 8, ""; + my $value = unpack "Q<", $data; + if (full32 $entry->std_compressedSize) + { + $entry->compressedSize($value); + out2 $data, "Compressed Size", Value_Q($entry->compressedSize) + if $display; + } + else + { + info $data, "Compressed Size " . Value_V($value) . " is not used since compressedSize is not set to 0xFFFFFFFF" + if $display; + } } - if (full32 $entry->std_localHeaderOffset) + if ($assumeAllFieldsPresent || full32 $entry->std_localHeaderOffset) { if (length $zip64Extended < 8) { @@ -4282,21 +4301,29 @@ sub walk_Zip64_in_CD $fieldOffset += 8; - my $here = $FH->tell(); - my $data = substr($zip64Extended, 0, 8, "") ; - $entry->localHeaderOffset(unpack "Q<", $data); - out2 $data, "Offset to Local Dir", Value_Q($entry->localHeaderOffset) - if $display; + my $data = substr $zip64Extended, 0, 8, ""; + my $value = unpack "Q<", $data; + if (full32 $entry->std_localHeaderOffset) + { + $entry->localHeaderOffset($value); + out2 $data, "Offset to Local Dir", Value_Q($entry->localHeaderOffset) + if $display; - my $commonMessage = "'Offset to Local Dir' field in 'Zip64 Extra Field' is invalid"; - $entry->localHeaderOffset(checkOffsetValue($entry->localHeaderOffset, $fieldStart, 0, $commonMessage, $fieldStart, ZIP_LOCAL_HDR_SIG, 0) ); + my $commonMessage = "'Offset to Local Dir' field in 'Zip64 Extra Field' is invalid"; + $entry->localHeaderOffset(checkOffsetValue($entry->localHeaderOffset, $fieldStart, 0, $commonMessage, $fieldStart, ZIP_LOCAL_HDR_SIG, 0) ); + } + else + { + info $data, "Offset to Local Dir " . Value_V($value) . " is not used since first localHeaderOffset is not set to 0xFFFFFFFF" + if $display; + } } - if (full16 $entry->std_diskNumber) + if ($assumeAllFieldsPresent || full16 $entry->std_diskNumber) { if (length $zip64Extended < 4) { - my $message = extraFieldIdentifier($extraID) . ": Expected " . decimalHex0x(4) . " bytes for 'Disk Number': only " . decimalHex0x(length $zip64Extended) . " bytes present"; + my $message = extraFieldIdentifier($extraID) . ": Expected " . decimalHex0x(4) . " bytes for 'Disk Number': only " . decimalHex0x(length $zip64Extended) . " bytes present"; error $fieldOffset, $message; out2 $zip64Extended, $message; return; @@ -4304,11 +4331,20 @@ sub walk_Zip64_in_CD $fieldOffset += 4; - my $data = substr($zip64Extended, 0, 4, "") ; - $entry->diskNumber(unpack "v", $data); - out2 $data, "Disk Number", Value_V($entry->diskNumber) - if $display; - $entry->zip64_diskNumberPresent(1); + my $data = substr $zip64Extended, 0, 4, ""; + my $value = unpack "v", $data; + if (full16 $entry->std_diskNumber) + { + $entry->diskNumber($value); + out2 $data, "Disk Number", Value_V($entry->diskNumber) + if $display; + $entry->zip64_diskNumberPresent(1); + } + else + { + info $data, "Disk Number " . Value_V($value) . " is not used since first diskNumber is not set to 0xFFFF" + if $display; + } } if (length $zip64Extended) From 54f36f305faea3439ef295831b9fab2dfede24dd Mon Sep 17 00:00:00 2001 From: n4n5 Date: Sat, 7 Feb 2026 07:55:49 -0700 Subject: [PATCH 3/6] always assign and print value --- bin/zipdetails | 62 +++++++++++++++++++------------------------------- 1 file changed, 23 insertions(+), 39 deletions(-) diff --git a/bin/zipdetails b/bin/zipdetails index 8bd6144..9d60cfb 100755 --- a/bin/zipdetails +++ b/bin/zipdetails @@ -4248,16 +4248,12 @@ sub walk_Zip64_in_CD $fieldOffset += 8; my $data = substr $zip64Extended, 0, 8, ""; - my $value = unpack "Q<", $data; - if (full32 $entry->std_compressedSize) - { - $entry->uncompressedSize($value); - out2 $data, "Uncompressed Size", Value_Q($entry->uncompressedSize) - if $display; - } - else + $entry->uncompressedSize(unpack "Q<", $data); + out2 $data, "Uncompressed Size", Value_Q($entry->uncompressedSize) + if $display; + if (! full32 $entry->std_compressedSize) { - info $data, "Uncompressed Size " . Value_V($value) . " is not used since uncompressedSize is not set to 0xFFFFFFFF" + info $data, "Uncompressed Size " . Value_V($entry->uncompressedSize) . " is not used since uncompressedSize is not set to 0xFFFFFFFF" if $display; } } @@ -4275,16 +4271,12 @@ sub walk_Zip64_in_CD $fieldOffset += 8; my $data = substr $zip64Extended, 0, 8, ""; - my $value = unpack "Q<", $data; - if (full32 $entry->std_compressedSize) - { - $entry->compressedSize($value); - out2 $data, "Compressed Size", Value_Q($entry->compressedSize) - if $display; - } - else + $entry->compressedSize(unpack "Q<", $data); + out2 $data, "Compressed Size", Value_Q($entry->compressedSize) + if $display; + if (! full32 $entry->std_compressedSize) { - info $data, "Compressed Size " . Value_V($value) . " is not used since compressedSize is not set to 0xFFFFFFFF" + info $data, "Compressed Size " . Value_V($entry->compressedSize) . " is not used since compressedSize is not set to 0xFFFFFFFF" if $display; } } @@ -4302,19 +4294,15 @@ sub walk_Zip64_in_CD $fieldOffset += 8; my $data = substr $zip64Extended, 0, 8, ""; - my $value = unpack "Q<", $data; - if (full32 $entry->std_localHeaderOffset) - { - $entry->localHeaderOffset($value); - out2 $data, "Offset to Local Dir", Value_Q($entry->localHeaderOffset) - if $display; + $entry->localHeaderOffset(unpack "Q<", $data); + out2 $data, "Offset to Local Dir", Value_Q($entry->localHeaderOffset) + if $display; - my $commonMessage = "'Offset to Local Dir' field in 'Zip64 Extra Field' is invalid"; - $entry->localHeaderOffset(checkOffsetValue($entry->localHeaderOffset, $fieldStart, 0, $commonMessage, $fieldStart, ZIP_LOCAL_HDR_SIG, 0) ); - } - else + my $commonMessage = "'Offset to Local Dir' field in 'Zip64 Extra Field' is invalid"; + $entry->localHeaderOffset(checkOffsetValue($entry->localHeaderOffset, $fieldStart, 0, $commonMessage, $fieldStart, ZIP_LOCAL_HDR_SIG, 0) ); + if (! full32 $entry->std_localHeaderOffset) { - info $data, "Offset to Local Dir " . Value_V($value) . " is not used since first localHeaderOffset is not set to 0xFFFFFFFF" + info $data, "Offset to Local Dir " . Value_V($entry->localHeaderOffset) . " is not used since first localHeaderOffset is not set to 0xFFFFFFFF" if $display; } } @@ -4332,17 +4320,13 @@ sub walk_Zip64_in_CD $fieldOffset += 4; my $data = substr $zip64Extended, 0, 4, ""; - my $value = unpack "v", $data; - if (full16 $entry->std_diskNumber) - { - $entry->diskNumber($value); - out2 $data, "Disk Number", Value_V($entry->diskNumber) - if $display; - $entry->zip64_diskNumberPresent(1); - } - else + $entry->diskNumber(unpack "v", $data); + out2 $data, "Disk Number", Value_V($entry->diskNumber) + if $display; + $entry->zip64_diskNumberPresent(1); + if (! full16 $entry->std_diskNumber) { - info $data, "Disk Number " . Value_V($value) . " is not used since first diskNumber is not set to 0xFFFF" + info $data, "Disk Number " . Value_V($entry->diskNumber) . " is not used since first diskNumber is not set to 0xFFFF" if $display; } } From 34084e7b05cc5e6f60b19ae9723fc521a2fbdf5e Mon Sep 17 00:00:00 2001 From: n4n5 Date: Sat, 7 Feb 2026 08:00:01 -0700 Subject: [PATCH 4/6] fix texts --- bin/zipdetails | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/zipdetails b/bin/zipdetails index 9d60cfb..e7f5574 100755 --- a/bin/zipdetails +++ b/bin/zipdetails @@ -4253,7 +4253,7 @@ sub walk_Zip64_in_CD if $display; if (! full32 $entry->std_compressedSize) { - info $data, "Uncompressed Size " . Value_V($entry->uncompressedSize) . " is not used since uncompressedSize is not set to 0xFFFFFFFF" + info $data, "Uncompressed Size should not be present in the ZIP64 extra field. Corresponding uncompressedSize from central header is not set to 0xFFFFFFFF, value is " . Value_V($entry->uncompressedSize) if $display; } } @@ -4276,7 +4276,7 @@ sub walk_Zip64_in_CD if $display; if (! full32 $entry->std_compressedSize) { - info $data, "Compressed Size " . Value_V($entry->compressedSize) . " is not used since compressedSize is not set to 0xFFFFFFFF" + info $data, "Compressed Size should not be present in the ZIP64 extra field. Corresponding compressedSize from central header is not set to 0xFFFFFFFF, value is " . Value_V($entry->compressedSize) if $display; } } @@ -4302,7 +4302,7 @@ sub walk_Zip64_in_CD $entry->localHeaderOffset(checkOffsetValue($entry->localHeaderOffset, $fieldStart, 0, $commonMessage, $fieldStart, ZIP_LOCAL_HDR_SIG, 0) ); if (! full32 $entry->std_localHeaderOffset) { - info $data, "Offset to Local Dir " . Value_V($entry->localHeaderOffset) . " is not used since first localHeaderOffset is not set to 0xFFFFFFFF" + info $data, "Offset to Local Dir should not be present in the ZIP64 extra field. Corresponding localHeaderOffset from central header is not set to 0xFFFFFFFF, value is " . Value_V($entry->localHeaderOffset) if $display; } } @@ -4326,7 +4326,7 @@ sub walk_Zip64_in_CD $entry->zip64_diskNumberPresent(1); if (! full16 $entry->std_diskNumber) { - info $data, "Disk Number " . Value_V($entry->diskNumber) . " is not used since first diskNumber is not set to 0xFFFF" + info $data, "Disk Number should not be present in the ZIP64 extra field. Corresponding diskNumber from central header is not set to 0xFFFF, value is " . Value_V($entry->diskNumber) if $display; } } From dad49980f843c57b6fa3b9789d5ef779644d4540 Mon Sep 17 00:00:00 2001 From: n4n5 Date: Sat, 7 Feb 2026 08:21:34 -0700 Subject: [PATCH 5/6] add warning --- bin/zipdetails | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/bin/zipdetails b/bin/zipdetails index e7f5574..c303e76 100755 --- a/bin/zipdetails +++ b/bin/zipdetails @@ -4157,6 +4157,11 @@ sub walk_Zip64_in_LD $entry->uncompressedSize(unpack "Q<", $data); out2 $data, "Uncompressed Size", Value_Q($entry->uncompressedSize) if $display; + if (! full32 $entry->std_uncompressedSize) + { + info $data, "Uncompressed Size should not be present in the ZIP64 extra field. Corresponding uncompressedSize from local header is not set to 0xFFFFFFFF, value is " . Value_V($entry->uncompressedSize) + if $display; + } } if ($assumeLengthsPresent || $assumeAllFieldsPresent || full32 $entry->std_compressedSize) @@ -4175,6 +4180,11 @@ sub walk_Zip64_in_LD $entry->compressedSize( unpack "Q<", $data); out2 $data, "Compressed Size", Value_Q($entry->compressedSize) if $display; + if (! full32 $entry->std_compressedSize) + { + info $data, "Compressed Size should not be present in the ZIP64 extra field. Corresponding compressedSize from local header is not set to 0xFFFFFFFF, value is " . Value_V($entry->compressedSize) + if $display; + } } # Zip64 in local header should not have localHeaderOffset or disk number @@ -4188,6 +4198,11 @@ sub walk_Zip64_in_LD my $localHeaderOffset = unpack "Q<", $data; out2 $data, "Offset to Local Dir", Value_Q($localHeaderOffset) if $display; + if (! full32 $entry->std_localHeaderOffset) + { + info $data, "Offset to Local Dir should not be present in the ZIP64 extra field. Value is " . Value_V($entry->localHeaderOffset) + if $display; + } } if ($assumeAllFieldsPresent) @@ -4198,6 +4213,11 @@ sub walk_Zip64_in_LD my $diskNumber = unpack "v", $data; out2 $data, "Disk Number", Value_V($diskNumber) if $display; + if (! full16 $entry->std_diskNumber) + { + info $data, "Disk Number should not be present in the ZIP64 extra field. Value is " . Value_V($entry->diskNumber) + if $display; + } } if (length $zip64Extended) @@ -4247,11 +4267,11 @@ sub walk_Zip64_in_CD } $fieldOffset += 8; - my $data = substr $zip64Extended, 0, 8, ""; + my $data = substr($zip64Extended, 0, 8, ""); $entry->uncompressedSize(unpack "Q<", $data); out2 $data, "Uncompressed Size", Value_Q($entry->uncompressedSize) if $display; - if (! full32 $entry->std_compressedSize) + if (! full32 $entry->std_uncompressedSize) { info $data, "Uncompressed Size should not be present in the ZIP64 extra field. Corresponding uncompressedSize from central header is not set to 0xFFFFFFFF, value is " . Value_V($entry->uncompressedSize) if $display; @@ -4270,7 +4290,7 @@ sub walk_Zip64_in_CD $fieldOffset += 8; - my $data = substr $zip64Extended, 0, 8, ""; + my $data = substr($zip64Extended, 0, 8, ""); $entry->compressedSize(unpack "Q<", $data); out2 $data, "Compressed Size", Value_Q($entry->compressedSize) if $display; @@ -4293,7 +4313,7 @@ sub walk_Zip64_in_CD $fieldOffset += 8; - my $data = substr $zip64Extended, 0, 8, ""; + my $data = substr($zip64Extended, 0, 8, ""); $entry->localHeaderOffset(unpack "Q<", $data); out2 $data, "Offset to Local Dir", Value_Q($entry->localHeaderOffset) if $display; @@ -4319,7 +4339,7 @@ sub walk_Zip64_in_CD $fieldOffset += 4; - my $data = substr $zip64Extended, 0, 4, ""; + my $data = substr($zip64Extended, 0, 4, ""); $entry->diskNumber(unpack "v", $data); out2 $data, "Disk Number", Value_V($entry->diskNumber) if $display; From de4b391c38c9fb39cad04250fd1dd9a6be0be63d Mon Sep 17 00:00:00 2001 From: n4n5 Date: Sat, 7 Feb 2026 08:22:42 -0700 Subject: [PATCH 6/6] fmt --- bin/zipdetails | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/zipdetails b/bin/zipdetails index c303e76..e3a8540 100755 --- a/bin/zipdetails +++ b/bin/zipdetails @@ -4267,7 +4267,7 @@ sub walk_Zip64_in_CD } $fieldOffset += 8; - my $data = substr($zip64Extended, 0, 8, ""); + my $data = substr($zip64Extended, 0, 8, "") ; $entry->uncompressedSize(unpack "Q<", $data); out2 $data, "Uncompressed Size", Value_Q($entry->uncompressedSize) if $display; @@ -4290,7 +4290,7 @@ sub walk_Zip64_in_CD $fieldOffset += 8; - my $data = substr($zip64Extended, 0, 8, ""); + my $data = substr($zip64Extended, 0, 8, "") ; $entry->compressedSize(unpack "Q<", $data); out2 $data, "Compressed Size", Value_Q($entry->compressedSize) if $display; @@ -4313,7 +4313,7 @@ sub walk_Zip64_in_CD $fieldOffset += 8; - my $data = substr($zip64Extended, 0, 8, ""); + my $data = substr($zip64Extended, 0, 8, "") ; $entry->localHeaderOffset(unpack "Q<", $data); out2 $data, "Offset to Local Dir", Value_Q($entry->localHeaderOffset) if $display; @@ -4339,7 +4339,7 @@ sub walk_Zip64_in_CD $fieldOffset += 4; - my $data = substr($zip64Extended, 0, 4, ""); + my $data = substr($zip64Extended, 0, 4, "") ; $entry->diskNumber(unpack "v", $data); out2 $data, "Disk Number", Value_V($entry->diskNumber) if $display;