diff options
| author | 2013-12-16 18:18:03 +0000 | |
|---|---|---|
| committer | 2013-12-16 18:18:03 +0000 | |
| commit | 03a9f3b0a1dc2c7f85a773f250d58cc6fdc975fb (patch) | |
| tree | 3efece5d148b0a2f34edc6b6e9d5cc4ca51dda78 | |
| parent | 07dc96d370c4844c7a279c01cedf24a272b9f4f3 (diff) | |
| parent | 2d7e5aa6c707537f1906ed77b0ff29ec3dd261f7 (diff) | |
Merge "Add classes that fail verification early to rejected class list."
| -rw-r--r-- | runtime/verifier/method_verifier.cc | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc index 9183b5f53c..59ead892e1 100644 --- a/runtime/verifier/method_verifier.cc +++ b/runtime/verifier/method_verifier.cc @@ -90,28 +90,28 @@ MethodVerifier::FailureKind MethodVerifier::VerifyClass(const mirror::Class* kla if (klass->IsVerified()) { return kNoFailure; } - mirror::Class* super = klass->GetSuperClass(); - if (super == NULL && strcmp("Ljava/lang/Object;", ClassHelper(klass).GetDescriptor()) != 0) { - *error = "Verifier rejected class "; - *error += PrettyDescriptor(klass); - *error += " that has no super class"; - return kHardFailure; - } - if (super != NULL && super->IsFinal()) { - *error = "Verifier rejected class "; - *error += PrettyDescriptor(klass); - *error += " that attempts to sub-class final class "; - *error += PrettyDescriptor(super); - return kHardFailure; - } + bool early_failure = false; + std::string failure_message; ClassHelper kh(klass); const DexFile& dex_file = kh.GetDexFile(); const DexFile::ClassDef* class_def = kh.GetClassDef(); - if (class_def == NULL) { - *error = "Verifier rejected class "; - *error += PrettyDescriptor(klass); - *error += " that isn't present in dex file "; - *error += dex_file.GetLocation(); + mirror::Class* super = klass->GetSuperClass(); + if (super == NULL && strcmp("Ljava/lang/Object;", kh.GetDescriptor()) != 0) { + early_failure = true; + failure_message = " that has no super class"; + } else if (super != NULL && super->IsFinal()) { + early_failure = true; + failure_message = " that attempts to sub-class final class " + PrettyDescriptor(super); + } else if (class_def == NULL) { + early_failure = true; + failure_message = " that isn't present in dex file " + dex_file.GetLocation(); + } + if (early_failure) { + *error = "Verifier rejected class " + PrettyDescriptor(klass) + failure_message; + if (Runtime::Current()->IsCompiler()) { + ClassReference ref(&dex_file, klass->GetDexClassDefIndex()); + AddRejectedClass(ref); + } return kHardFailure; } Thread* self = Thread::Current(); |