ZipWriter: Keep LFH and CFH in sync
We change the GPB in the LocalFileHeader if the entry can not have a trailing DataDescriptor. Make sure to patch the CentralFileHeader to have the same bits set. Modify ZipArchive to check that the data descriptor bit is consistent between Central and Local file headers. Test: make ziparchive-tests Bug: 36686974 Change-Id: Ied167570abcf6426b1c678cd40123e5ad65909db
This commit is contained in:
parent
40ed56c70b
commit
e0eca55fe6
|
@ -573,6 +573,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 New Issue