diff options
author | Andreas Gampe <agampe@google.com> | 2014-07-29 23:07:05 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-07-25 21:16:27 +0000 |
commit | f90283f61d6ca37abf3a9fb8447d05e79caf0160 (patch) | |
tree | acb71cf90f57a28176ff5cc050cb55a30ee5023a | |
parent | 58e17cea2da3e541610e9bcdf8ef3efd983e1390 (diff) | |
parent | 0ba238dcc21ae3544e1e8cb5d108725db8a1c134 (diff) | |
download | art-f90283f61d6ca37abf3a9fb8447d05e79caf0160.zip art-f90283f61d6ca37abf3a9fb8447d05e79caf0160.tar.gz art-f90283f61d6ca37abf3a9fb8447d05e79caf0160.tar.bz2 |
Merge "ART: Check for duplicate class definitions in dex file verifier"
-rw-r--r-- | runtime/dex_file_verifier.cc | 7 | ||||
-rw-r--r-- | runtime/dex_file_verifier.h | 5 |
2 files changed, 12 insertions, 0 deletions
diff --git a/runtime/dex_file_verifier.cc b/runtime/dex_file_verifier.cc index 48dcdca..7e6bdfa 100644 --- a/runtime/dex_file_verifier.cc +++ b/runtime/dex_file_verifier.cc @@ -1655,6 +1655,13 @@ bool DexFileVerifier::CheckInterMethodIdItem() { bool DexFileVerifier::CheckInterClassDefItem() { const DexFile::ClassDef* item = reinterpret_cast<const DexFile::ClassDef*>(ptr_); + // Check for duplicate class def. + if (defined_classes_.find(item->class_idx_) != defined_classes_.end()) { + ErrorStringPrintf("Redefinition of class with type idx: '%d'", item->class_idx_); + return false; + } + defined_classes_.insert(item->class_idx_); + LOAD_STRING_BY_TYPE(class_descriptor, item->class_idx_, "inter_class_def_item class_idx") if (UNLIKELY(!IsValidDescriptor(class_descriptor) || class_descriptor[0] != 'L')) { ErrorStringPrintf("Invalid class descriptor: '%s'", class_descriptor); diff --git a/runtime/dex_file_verifier.h b/runtime/dex_file_verifier.h index cae1063..0af3549 100644 --- a/runtime/dex_file_verifier.h +++ b/runtime/dex_file_verifier.h @@ -17,6 +17,8 @@ #ifndef ART_RUNTIME_DEX_FILE_VERIFIER_H_ #define ART_RUNTIME_DEX_FILE_VERIFIER_H_ +#include <unordered_set> + #include "dex_file.h" #include "safe_map.h" @@ -114,6 +116,9 @@ class DexFileVerifier { const void* previous_item_; std::string failure_reason_; + + // Set of type ids for which there are ClassDef elements in the dex file. + std::unordered_set<decltype(DexFile::ClassDef::class_idx_)> defined_classes_; }; } // namespace art |