fix(Zip): Zip 64-bit extensions not set #2590 (tentative) (#3604)

This commit is contained in:
Aleksandar Fabijanic 2022-06-13 14:48:34 -05:00 committed by GitHub
parent 2bd71b4ea4
commit 08fe7fd200
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 11 additions and 5 deletions

View File

@ -22,7 +22,6 @@
#include "Poco/Zip/ZipCommon.h"
#include "Poco/Zip/ZipUtil.h"
namespace Poco {
namespace Zip {

View File

@ -83,6 +83,12 @@ void Compress::addEntry(std::istream& in, const Poco::DateTime& lastModifiedAt,
std::streamoff localHeaderOffset = _offset;
ZipLocalFileHeader hdr(fileName, lastModifiedAt, cm, cl, _forceZip64);
std::streampos pos = in.tellg();
in.seekg(0, in.end);
std::streampos length = in.tellg();
in.seekg(pos);
if (length >= ZipCommon::ZIP64_MAGIC)
hdr.setZip64Data();
hdr.setStartPos(localHeaderOffset);
ZipOutputStream zipOut(_out, hdr, _seekableOut);
@ -321,11 +327,11 @@ ZipArchive Compress::close()
ZipArchive::FileInfos::const_iterator it = _infos.begin();
ZipArchive::FileInfos::const_iterator itEnd = _infos.end();
bool needZip64 = _forceZip64;
needZip64 = needZip64 || _files.size() >= ZipCommon::ZIP64_MAGIC_SHORT || centralDirStart64 >= ZipCommon::ZIP64_MAGIC;
needZip64 = needZip64 || _files.size() >= ZipCommon::ZIP64_MAGIC_SHORT || centralDirStart64 >= ZipCommon::ZIP64_MAGIC;
for (; it != itEnd; ++it)
{
const ZipFileInfo& nfo = it->second;
needZip64 = needZip64 || nfo.needsZip64();
needZip64 = needZip64 || nfo.needsZip64();
std::string info(nfo.createHeader());
_out.write(info.c_str(), static_cast<std::streamsize>(info.size()));
@ -336,7 +342,7 @@ ZipArchive Compress::close()
if (!_out) throw Poco::IOException("Bad output stream");
Poco::UInt64 numEntries64 = _infos.size();
needZip64 = needZip64 || _offset >= ZipCommon::ZIP64_MAGIC;
needZip64 = needZip64 || _offset >= ZipCommon::ZIP64_MAGIC;
if (needZip64)
{
ZipArchiveInfo64 central;

View File

@ -243,7 +243,8 @@ void ZipLocalFileHeader::init(const Poco::Path& fName, ZipCommon::CompressionMet
}
else
setCompressionMethod(ZipCommon::CM_STORE);
if (_forceZip64)
if (needsZip64())
setZip64Data();
_rawHeader[GENERAL_PURPOSE_POS+1] |= 0x08; // Set "language encoding flag" to indicate that filenames and paths are in UTF-8.