From c92a7a14ce44c4bb7e63e4c447a008b558bc0bca Mon Sep 17 00:00:00 2001 From: Jeff Hao Date: Mon, 6 Jun 2016 11:09:20 -0700 Subject: Wrap certain exception types when loading an erroneous class. Bug: 28787733 (cherry-picked from commit 7c8aa8357196781c811a73d2eb66aaaa1681ce36) Change-Id: Iea55486c4b95ee16e1f19c8ba2d24c18b9100c97 --- runtime/native/java_lang_VMClassLoader.cc | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'runtime/native/java_lang_VMClassLoader.cc') diff --git a/runtime/native/java_lang_VMClassLoader.cc b/runtime/native/java_lang_VMClassLoader.cc index 15156301c8..6f735aa6df 100644 --- a/runtime/native/java_lang_VMClassLoader.cc +++ b/runtime/native/java_lang_VMClassLoader.cc @@ -41,6 +41,23 @@ static jclass VMClassLoader_findLoadedClass(JNIEnv* env, jclass, jobject javaLoa if (c != nullptr && c->IsResolved()) { return soa.AddLocalReference(c); } + // If class is erroneous, throw the earlier failure, wrapped in certain cases. See b/28787733. + if (c != nullptr && c->IsErroneous()) { + cl->ThrowEarlierClassFailure(c); + Thread* self = soa.Self(); + mirror::Class* eiie_class = + self->DecodeJObject(WellKnownClasses::java_lang_ExceptionInInitializerError)->AsClass(); + mirror::Class* iae_class = + self->DecodeJObject(WellKnownClasses::java_lang_IllegalAccessError)->AsClass(); + mirror::Class* ncdfe_class = + self->DecodeJObject(WellKnownClasses::java_lang_NoClassDefFoundError)->AsClass(); + mirror::Class* exception = self->GetException()->GetClass(); + if (exception == eiie_class || exception == iae_class || exception == ncdfe_class) { + self->ThrowNewWrappedException("Ljava/lang/ClassNotFoundException;", + PrettyDescriptor(c).c_str()); + } + return nullptr; + } if (loader != nullptr) { // Try the common case. StackHandleScope<1> hs(soa.Self()); -- cgit v1.2.3-59-g8ed1b