diff options
Diffstat (limited to 'runtime/dex_file.cc')
| -rw-r--r-- | runtime/dex_file.cc | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/runtime/dex_file.cc b/runtime/dex_file.cc index 16087a572f..a6eb5f6261 100644 --- a/runtime/dex_file.cc +++ b/runtime/dex_file.cc @@ -63,7 +63,9 @@ const uint8_t DexFile::kDexMagicVersions[DexFile::kNumDexVersions][DexFile::kDex {'0', '3', '5', '\0'}, // Dex version 036 skipped because of an old dalvik bug on some versions of android where dex // files with that version number would erroneously be accepted and run. - {'0', '3', '7', '\0'} + {'0', '3', '7', '\0'}, + // Dex version 038: Android "O" and beyond. + {'0', '3', '8', '\0'} }; bool DexFile::GetChecksum(const char* filename, uint32_t* checksum, std::string* error_msg) { @@ -336,6 +338,11 @@ std::unique_ptr<const DexFile> DexFile::Open(const ZipArchive& zip_archive, *error_code = ZipOpenErrorCode::kEntryNotFound; return nullptr; } + if (zip_entry->GetUncompressedLength() == 0) { + *error_msg = StringPrintf("Dex file '%s' has zero length", location.c_str()); + *error_code = ZipOpenErrorCode::kDexFileError; + return nullptr; + } std::unique_ptr<MemMap> map(zip_entry->ExtractToMemMap(location.c_str(), entry_name, error_msg)); if (map.get() == nullptr) { *error_msg = StringPrintf("Failed to extract '%s' from '%s': %s", entry_name, location.c_str(), @@ -433,6 +440,8 @@ std::unique_ptr<const DexFile> DexFile::OpenMemory(const uint8_t* base, MemMap* mem_map, const OatDexFile* oat_dex_file, std::string* error_msg) { + DCHECK(base != nullptr); + DCHECK_NE(size, 0U); CHECK_ALIGNED(base, 4); // various dex file structures must be word aligned std::unique_ptr<DexFile> dex_file( new DexFile(base, size, location, location_checksum, mem_map, oat_dex_file)); |