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
diff --git a/src/class_linker.cc b/src/class_linker.cc
index 1c9f064..17f80d4 100644
--- a/src/class_linker.cc
+++ b/src/class_linker.cc
@@ -2326,6 +2326,14 @@
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 28421b4..9d2e2a8 100644
--- a/src/java_lang_VMClassLoader.cc
+++ b/src/java_lang_VMClassLoader.cc
@@ -34,7 +34,13 @@
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) {