From b849feb33dbcec795fee91c3d4dd88af2c41cd86 Mon Sep 17 00:00:00 2001 From: Ronan Timinello Date: Wed, 7 Sep 2022 13:28:15 +0200 Subject: [PATCH] Add support for zip64 format --- modules/juce_core/zip/juce_ZipFile.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/modules/juce_core/zip/juce_ZipFile.cpp b/modules/juce_core/zip/juce_ZipFile.cpp index 4bdd518fd7..eeaf210e17 100644 --- a/modules/juce_core/zip/juce_ZipFile.cpp +++ b/modules/juce_core/zip/juce_ZipFile.cpp @@ -51,6 +51,28 @@ struct ZipFile::ZipEntryHolder entry.isSymbolicLink = (fileType == 0xA); entry.filename = String::fromUTF8 (buffer + 46, fileNameLen); + + auto const extraFieldLength = ByteOrder::littleEndianShort(buffer + 30); + if (extraFieldLength != 0) + { + auto extraFieldOffset = 0; + auto* extraHeaderPtr = buffer + 46 + fileNameLen; + auto* extraSectionPtr = extraHeaderPtr; + while (extraFieldOffset < extraFieldLength) { + auto extraHeaderTag = ByteOrder::littleEndianShort(extraSectionPtr); + auto extraFieldSectionLength = ByteOrder::littleEndianShort(extraSectionPtr + 2); + if (extraHeaderTag == 0x0001) // Zip64 Tag + { + entry.uncompressedSize = (int64)ByteOrder::littleEndianInt64(extraSectionPtr + 4); + if (extraFieldSectionLength > 8) + compressedSize = (int64)ByteOrder::littleEndianInt64(extraHeaderPtr + 12); + if (extraFieldSectionLength > 16) + streamOffset = (int64)ByteOrder::littleEndianInt64(extraHeaderPtr + 20); + } + extraFieldOffset += extraFieldSectionLength + 4; + extraSectionPtr = extraHeaderPtr + extraFieldOffset; + } + } } static Time parseFileTime (uint32 time, uint32 date) noexcept