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:
Piotr Jastrzebski 2014-08-13 09:03:11 +00:00 committed by Android Git Automerger
commit b720c8d601
2 changed files with 25 additions and 1 deletions

View file

@ -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

View file

@ -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) {