diff options
Diffstat (limited to 'libunwindstack/DexFile.cpp')
-rw-r--r-- | libunwindstack/DexFile.cpp | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/libunwindstack/DexFile.cpp b/libunwindstack/DexFile.cpp index bf63abf1cf..8fc3d23ecb 100644 --- a/libunwindstack/DexFile.cpp +++ b/libunwindstack/DexFile.cpp @@ -50,6 +50,22 @@ static bool HasDexSupport() { std::unique_ptr<DexFile> DexFile::Create(uint64_t dex_file_offset_in_memory, Memory* memory, MapInfo* info) { + if (UNLIKELY(!HasDexSupport())) { + return nullptr; + } + + size_t max_size = info->end - dex_file_offset_in_memory; + if (memory->IsLocal()) { + size_t size = max_size; + + std::string err_msg; + std::unique_ptr<art_api::dex::DexFile> art_dex_file = DexFile::OpenFromMemory( + reinterpret_cast<void const*>(dex_file_offset_in_memory), &size, info->name, &err_msg); + if (art_dex_file != nullptr && size <= max_size) { + return std::unique_ptr<DexFile>(new DexFile(art_dex_file)); + } + } + if (!info->name.empty()) { std::unique_ptr<DexFile> dex_file = DexFileFromFile::Create(dex_file_offset_in_memory - info->start + info->offset, info->name); @@ -57,7 +73,7 @@ std::unique_ptr<DexFile> DexFile::Create(uint64_t dex_file_offset_in_memory, Mem return dex_file; } } - return DexFileFromMemory::Create(dex_file_offset_in_memory, memory, info->name); + return DexFileFromMemory::Create(dex_file_offset_in_memory, memory, info->name, max_size); } bool DexFile::GetMethodInformation(uint64_t dex_offset, std::string* method_name, @@ -94,7 +110,8 @@ std::unique_ptr<DexFileFromFile> DexFileFromFile::Create(uint64_t dex_file_offse std::unique_ptr<DexFileFromMemory> DexFileFromMemory::Create(uint64_t dex_file_offset_in_memory, Memory* memory, - const std::string& name) { + const std::string& name, + size_t max_size) { if (UNLIKELY(!HasDexSupport())) { return nullptr; } @@ -105,6 +122,9 @@ std::unique_ptr<DexFileFromMemory> DexFileFromMemory::Create(uint64_t dex_file_o std::string error_msg; std::unique_ptr<art_api::dex::DexFile> art_dex_file = OpenFromMemory(backing_memory.data(), &size, name, &error_msg); + if (size > max_size) { + return nullptr; + } if (art_dex_file != nullptr) { return std::unique_ptr<DexFileFromMemory>( |