Fix zip files made with non-seekable output. (issue #335)

This commit is contained in:
Guenter Obiltschnig 2015-10-08 15:33:24 +02:00
parent 327e4eee81
commit 26e3dd273b
3 changed files with 11 additions and 5 deletions

View File

@ -54,6 +54,9 @@ ZipFileInfo::ZipFileInfo(const ZipLocalFileHeader& header):
setUnixAttributes();
_rawInfo[GENERAL_PURPOSE_POS+1] |= 0x08; // Set "language encoding flag" to indicate that filenames and paths are in UTF-8.
if (header.searchCRCAndSizesAfterData())
_rawInfo[GENERAL_PURPOSE_POS] |= 0x08;
}

View File

@ -215,6 +215,13 @@ void ZipStreamBuf::close()
poco_assert (*_pOstr);
// write an extra datablock if required
// or fix the crc entries
poco_check_ptr(_pHeader);
_pHeader->setCRC(_crc32.checksum());
_pHeader->setUncompressedSize(_bytesWritten);
_pHeader->setCompressedSize(_ptrOHelper->bytesWritten());
_pHeader->setStartPos(_pHeader->getStartPos()); // This resets EndPos now that compressed Size is known
if (_pHeader->searchCRCAndSizesAfterData())
{
ZipDataInfo info;
@ -225,10 +232,6 @@ void ZipStreamBuf::close()
}
else
{
poco_check_ptr (_pHeader);
_pHeader->setCRC(_crc32.checksum());
_pHeader->setUncompressedSize(_bytesWritten);
_pHeader->setCompressedSize(static_cast<Poco::UInt32>(_ptrOHelper->bytesWritten()));
_pOstr->seekp(_pHeader->getStartPos(), std::ios_base::beg);
poco_assert (*_pOstr);
std::string header = _pHeader->createHeader();

View File

@ -13,6 +13,6 @@ objects = ZipTestSuite Driver \
target = testrunner
target_version = 1
target_libs = PocoZip PocoNet PocoFoundation CppUnit
target_libs = PocoZip PocoFoundation CppUnit
include $(POCO_BASE)/build/rules/exec