Merge "ZipWriter: Keep LFH and CFH in sync"
This commit is contained in:
commit
a309bc491d
2 changed files with 14 additions and 1 deletions
|
@ -563,6 +563,17 @@ static int32_t FindEntry(const ZipArchive* archive, const int ent,
|
|||
|
||||
// Paranoia: Match the values specified in the local file header
|
||||
// to those specified in the central directory.
|
||||
|
||||
// Verify that the central directory and local file header agree on the use of a trailing
|
||||
// Data Descriptor.
|
||||
if ((lfh->gpb_flags & kGPBDDFlagMask) != (cdr->gpb_flags & kGPBDDFlagMask)) {
|
||||
ALOGW("Zip: gpb flag mismatch. expected {%04" PRIx16 "}, was {%04" PRIx16 "}",
|
||||
cdr->gpb_flags, lfh->gpb_flags);
|
||||
return kInconsistentInformation;
|
||||
}
|
||||
|
||||
// If there is no trailing data descriptor, verify that the central directory and local file
|
||||
// header agree on the crc, compressed, and uncompressed sizes of the entry.
|
||||
if ((lfh->gpb_flags & kGPBDDFlagMask) == 0) {
|
||||
data->has_data_descriptor = 0;
|
||||
if (data->compressed_length != lfh->compressed_size
|
||||
|
|
|
@ -479,7 +479,9 @@ int32_t ZipWriter::Finish() {
|
|||
for (FileEntry& file : files_) {
|
||||
CentralDirectoryRecord cdr = {};
|
||||
cdr.record_signature = CentralDirectoryRecord::kSignature;
|
||||
cdr.gpb_flags |= kGPBDDFlagMask;
|
||||
if ((file.compression_method & kCompressDeflated) || !seekable_) {
|
||||
cdr.gpb_flags |= kGPBDDFlagMask;
|
||||
}
|
||||
cdr.compression_method = file.compression_method;
|
||||
cdr.last_mod_time = file.last_mod_time;
|
||||
cdr.last_mod_date = file.last_mod_date;
|
||||
|
|
Loading…
Reference in a new issue