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.
(cherry-pick of commit e0eca55fe6
)
Test: make ziparchive-tests
Bug: 36686974
Change-Id: Ied167570abcf6426b1c678cd40123e5ad65909db
This commit is contained in:
parent
625a098573
commit
d987c9dd9e
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