am b0206765: Merge "Make sure that names of all entries have the same encoding."
* commit 'b020676566f38380f4303eaa7d196d6fef019dd9': Make sure that names of all entries have the same encoding.
This commit is contained in:
commit
b720c8d601
2 changed files with 25 additions and 1 deletions
|
|
@ -157,6 +157,11 @@ int32_t Next(void* cookie, ZipEntry* data, ZipEntryName *name);
|
||||||
*/
|
*/
|
||||||
void EndIteration(void* cookie);
|
void EndIteration(void* cookie);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Whether entry names in an archive are encoded in UTF-8.
|
||||||
|
*/
|
||||||
|
bool HasUTF8Names(const ZipArchiveHandle handle);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Uncompress and write an entry to an open file identified by |fd|.
|
* Uncompress and write an entry to an open file identified by |fd|.
|
||||||
* |entry->uncompressed_length| bytes will be written to the file at
|
* |entry->uncompressed_length| bytes will be written to the file at
|
||||||
|
|
|
||||||
|
|
@ -192,8 +192,11 @@ struct DataDescriptor {
|
||||||
|
|
||||||
#undef DISALLOW_IMPLICIT_CONSTRUCTORS
|
#undef DISALLOW_IMPLICIT_CONSTRUCTORS
|
||||||
|
|
||||||
static const uint32_t kGPBDDFlagMask = 0x0008; // mask value that signifies that the entry has a DD
|
// mask value that signifies that the entry has a DD
|
||||||
|
static const uint32_t kGPBDDFlagMask = 0x0008;
|
||||||
static const uint32_t kMaxErrorLen = 1024;
|
static const uint32_t kMaxErrorLen = 1024;
|
||||||
|
// mask value that signifies that the entry names are encoded in UTF-8
|
||||||
|
static const uint32_t kGPBEFSFlagMask = 0x0800;
|
||||||
|
|
||||||
// The maximum size of a central directory or a file
|
// The maximum size of a central directory or a file
|
||||||
// comment in bytes.
|
// comment in bytes.
|
||||||
|
|
@ -295,6 +298,7 @@ struct ZipArchive {
|
||||||
|
|
||||||
/* number of entries in the Zip archive */
|
/* number of entries in the Zip archive */
|
||||||
uint16_t num_entries;
|
uint16_t num_entries;
|
||||||
|
bool utf8_names_encoding;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We know how many entries are in the Zip archive, so we can have a
|
* We know how many entries are in the Zip archive, so we can have a
|
||||||
|
|
@ -310,6 +314,7 @@ struct ZipArchive {
|
||||||
directory_offset(0),
|
directory_offset(0),
|
||||||
directory_map(NULL),
|
directory_map(NULL),
|
||||||
num_entries(0),
|
num_entries(0),
|
||||||
|
utf8_names_encoding(false),
|
||||||
hash_table_size(0),
|
hash_table_size(0),
|
||||||
hash_table(NULL) {}
|
hash_table(NULL) {}
|
||||||
|
|
||||||
|
|
@ -655,6 +660,15 @@ static int32_t ParseZipArchive(ZipArchive* archive) {
|
||||||
ptr - cd_ptr, cd_length, i);
|
ptr - cd_ptr, cd_length, i);
|
||||||
goto bail;
|
goto bail;
|
||||||
}
|
}
|
||||||
|
if (i == 0) {
|
||||||
|
archive->utf8_names_encoding = cdr->gpb_flags & kGPBEFSFlagMask;
|
||||||
|
} else {
|
||||||
|
bool has_utf8_name_encoding = cdr->gpb_flags & kGPBEFSFlagMask;
|
||||||
|
if (archive->utf8_names_encoding != has_utf8_name_encoding) {
|
||||||
|
ALOGW("Zip: Entry names encoded with different encoding");
|
||||||
|
goto bail;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ALOGV("+++ zip good scan %" PRIu16 " entries", num_entries);
|
ALOGV("+++ zip good scan %" PRIu16 " entries", num_entries);
|
||||||
|
|
||||||
|
|
@ -976,6 +990,11 @@ int32_t Next(void* cookie, ZipEntry* data, ZipEntryName* name) {
|
||||||
return kIterationEnd;
|
return kIterationEnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool HasUTF8Names(const ZipArchiveHandle handle) {
|
||||||
|
const ZipArchive* archive = reinterpret_cast<ZipArchive*>(handle);
|
||||||
|
return archive->utf8_names_encoding;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t InflateToFile(int fd, const ZipEntry* entry,
|
static int32_t InflateToFile(int fd, const ZipEntry* entry,
|
||||||
uint8_t* begin, uint32_t length,
|
uint8_t* begin, uint32_t length,
|
||||||
uint64_t* crc_out) {
|
uint64_t* crc_out) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue