diff options
| author | 2012-01-11 15:19:49 -0800 | |
|---|---|---|
| committer | 2012-01-11 15:22:43 -0800 | |
| commit | be125a931c8cf7274345c69b2bf35fb6e66e4001 (patch) | |
| tree | 88afd5db04694ae2ca02a59a07a572645be3635b | |
| parent | ab7661375c717fdaac1c03f81d9687dfe6a82f78 (diff) | |
Fixes for 068-classloader
Check access to super class during linkage.
Don't allow findLoadedClasses to return erroneous classes.
068-classloader still needs a fix to validate method signatues before it will
run successfully.
Change-Id: I9c3cfcfc1357c94300fddad7d16de3cd670e2f80
| -rw-r--r-- | src/class_linker.cc | 8 | ||||
| -rw-r--r-- | src/java_lang_VMClassLoader.cc | 8 |
2 files changed, 15 insertions, 1 deletions
diff --git a/src/class_linker.cc b/src/class_linker.cc index 1c9f064d84..17f80d4ac5 100644 --- a/src/class_linker.cc +++ b/src/class_linker.cc @@ -2326,6 +2326,14 @@ bool ClassLinker::LoadSuperAndInterfaces(SirtRef<Class>& klass, const DexFile& d DCHECK(Thread::Current()->IsExceptionPending()); return false; } + // Verify + if (!klass->CanAccess(super_class)) { + Thread::Current()->ThrowNewExceptionF("Ljava/lang/IllegalAccessError;", + "Class %s extended by class %s is inaccessible", + PrettyDescriptor(super_class).c_str(), + PrettyDescriptor(klass.get()).c_str()); + return false; + } klass->SetSuperClass(super_class); } const DexFile::TypeList* interfaces = dex_file.GetInterfacesList(*class_def); diff --git a/src/java_lang_VMClassLoader.cc b/src/java_lang_VMClassLoader.cc index 28421b48f0..9d2e2a876f 100644 --- a/src/java_lang_VMClassLoader.cc +++ b/src/java_lang_VMClassLoader.cc @@ -34,7 +34,13 @@ jclass VMClassLoader_findLoadedClass(JNIEnv* env, jclass, jobject javaLoader, js std::string descriptor(DotToDescriptor(name.c_str())); Class* c = Runtime::Current()->GetClassLinker()->LookupClass(descriptor.c_str(), loader); - return AddLocalReference<jclass>(env, c); + if (c != NULL && c->IsResolved()) { + return AddLocalReference<jclass>(env, c); + } else { + // Class wasn't resolved so it may be erroneous or not yet ready, force the caller to go into + // the regular loadClass code. + return NULL; + } } jint VMClassLoader_getBootClassPathSize(JNIEnv* env, jclass) { |