diff options
Diffstat (limited to 'runtime/native/java_lang_Class.cc')
-rw-r--r-- | runtime/native/java_lang_Class.cc | 90 |
1 files changed, 88 insertions, 2 deletions
diff --git a/runtime/native/java_lang_Class.cc b/runtime/native/java_lang_Class.cc index 4967f9eebe..4516d1ba9a 100644 --- a/runtime/native/java_lang_Class.cc +++ b/runtime/native/java_lang_Class.cc @@ -218,6 +218,10 @@ static jobjectArray Class_getInterfacesInternal(JNIEnv* env, jobject javaThis) { ScopedFastNativeObjectAccess soa(env); StackHandleScope<1> hs(soa.Self()); Handle<mirror::Class> klass = hs.NewHandle(DecodeClass(soa, javaThis)); + if (klass->IsObsoleteObject()) { + ThrowRuntimeException("Obsolete Object!"); + return nullptr; + } if (klass->IsProxyClass()) { StackHandleScope<1> hs2(soa.Self()); @@ -262,6 +266,10 @@ static ObjPtr<mirror::ObjectArray<mirror::Field>> GetDeclaredFields( ObjPtr<mirror::Class> klass, bool public_only, bool force_resolve) REQUIRES_SHARED(Locks::mutator_lock_) { + if (UNLIKELY(klass->IsObsoleteObject())) { + ThrowRuntimeException("Obsolete Object!"); + return nullptr; + } StackHandleScope<1> hs(self); IterationRange<StrideIterator<ArtField>> ifields = klass->GetIFields(); IterationRange<StrideIterator<ArtField>> sfields = klass->GetSFields(); @@ -386,6 +394,10 @@ ALWAYS_INLINE static inline ObjPtr<mirror::Field> GetDeclaredField(Thread* self, ObjPtr<mirror::Class> c, ObjPtr<mirror::String> name) REQUIRES_SHARED(Locks::mutator_lock_) { + if (UNLIKELY(c->IsObsoleteObject())) { + ThrowRuntimeException("Obsolete Object!"); + return nullptr; + } ArtField* art_field = FindFieldByName(name, c->GetIFieldsPtr()); if (art_field != nullptr) { return mirror::Field::CreateFromArtField<kRuntimePointerSize>(self, art_field, true); @@ -404,6 +416,10 @@ static ObjPtr<mirror::Field> GetPublicFieldRecursive( DCHECK(name != nullptr); DCHECK(self != nullptr); + if (UNLIKELY(clazz->IsObsoleteObject())) { + ThrowRuntimeException("Obsolete Object!"); + return nullptr; + } StackHandleScope<2> hs(self); MutableHandle<mirror::Class> h_clazz(hs.NewHandle(clazz)); Handle<mirror::String> h_name(hs.NewHandle(name)); @@ -501,10 +517,15 @@ static jobject Class_getDeclaredConstructorInternal( DCHECK(!Runtime::Current()->IsActiveTransaction()); StackHandleScope<1> hs(soa.Self()); + ObjPtr<mirror::Class> klass = DecodeClass(soa, javaThis); + if (UNLIKELY(klass->IsObsoleteObject())) { + ThrowRuntimeException("Obsolete Object!"); + return nullptr; + } Handle<mirror::Constructor> result = hs.NewHandle( mirror::Class::GetDeclaredConstructorInternal<kRuntimePointerSize, false>( soa.Self(), - DecodeClass(soa, javaThis), + klass, soa.Decode<mirror::ObjectArray<mirror::Class>>(args))); if (result == nullptr || ShouldDenyAccessToMember(result->GetArtMethod(), soa.Self())) { return nullptr; @@ -529,6 +550,10 @@ static jobjectArray Class_getDeclaredConstructorsInternal( bool public_only = (publicOnly != JNI_FALSE); hiddenapi::AccessContext hiddenapi_context = GetReflectionCaller(soa.Self()); Handle<mirror::Class> h_klass = hs.NewHandle(DecodeClass(soa, javaThis)); + if (UNLIKELY(h_klass->IsObsoleteObject())) { + ThrowRuntimeException("Obsolete Object!"); + return nullptr; + } size_t constructor_count = 0; // Two pass approach for speed. for (auto& m : h_klass->GetDirectMethods(kRuntimePointerSize)) { @@ -563,10 +588,15 @@ static jobject Class_getDeclaredMethodInternal(JNIEnv* env, jobject javaThis, StackHandleScope<1> hs(soa.Self()); DCHECK_EQ(Runtime::Current()->GetClassLinker()->GetImagePointerSize(), kRuntimePointerSize); DCHECK(!Runtime::Current()->IsActiveTransaction()); + ObjPtr<mirror::Class> klass = DecodeClass(soa, javaThis); + if (UNLIKELY(klass->IsObsoleteObject())) { + ThrowRuntimeException("Obsolete Object!"); + return nullptr; + } Handle<mirror::Method> result = hs.NewHandle( mirror::Class::GetDeclaredMethodInternal<kRuntimePointerSize, false>( soa.Self(), - DecodeClass(soa, javaThis), + klass, soa.Decode<mirror::String>(name), soa.Decode<mirror::ObjectArray<mirror::Class>>(args), GetHiddenapiAccessContextFunction(soa.Self()))); @@ -585,6 +615,10 @@ static jobjectArray Class_getDeclaredMethodsUnchecked(JNIEnv* env, jobject javaT bool public_only = (publicOnly != JNI_FALSE); Handle<mirror::Class> klass = hs.NewHandle(DecodeClass(soa, javaThis)); + if (klass->IsObsoleteObject()) { + ThrowRuntimeException("Obsolete Object!"); + return nullptr; + } size_t num_methods = 0; for (ArtMethod& m : klass->GetDeclaredMethods(kRuntimePointerSize)) { uint32_t modifiers = m.GetAccessFlags(); @@ -623,6 +657,10 @@ static jobject Class_getDeclaredAnnotation(JNIEnv* env, jobject javaThis, jclass ScopedFastNativeObjectAccess soa(env); StackHandleScope<2> hs(soa.Self()); Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis))); + if (klass->IsObsoleteObject()) { + ThrowRuntimeException("Obsolete Object!"); + return nullptr; + } // Handle public contract to throw NPE if the "annotationClass" argument was null. if (UNLIKELY(annotationClass == nullptr)) { @@ -642,6 +680,10 @@ static jobjectArray Class_getDeclaredAnnotations(JNIEnv* env, jobject javaThis) ScopedFastNativeObjectAccess soa(env); StackHandleScope<1> hs(soa.Self()); Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis))); + if (klass->IsObsoleteObject()) { + ThrowRuntimeException("Obsolete Object!"); + return nullptr; + } if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) { // Return an empty array instead of a null pointer. ObjPtr<mirror::Class> annotation_array_class = @@ -659,6 +701,10 @@ static jobjectArray Class_getDeclaredClasses(JNIEnv* env, jobject javaThis) { ScopedFastNativeObjectAccess soa(env); StackHandleScope<1> hs(soa.Self()); Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis))); + if (klass->IsObsoleteObject()) { + ThrowRuntimeException("Obsolete Object!"); + return nullptr; + } ObjPtr<mirror::ObjectArray<mirror::Class>> classes = nullptr; if (!klass->IsProxyClass() && klass->GetDexCache() != nullptr) { classes = annotations::GetDeclaredClasses(klass); @@ -682,6 +728,10 @@ static jclass Class_getEnclosingClass(JNIEnv* env, jobject javaThis) { ScopedFastNativeObjectAccess soa(env); StackHandleScope<1> hs(soa.Self()); Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis))); + if (klass->IsObsoleteObject()) { + ThrowRuntimeException("Obsolete Object!"); + return nullptr; + } if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) { return nullptr; } @@ -692,6 +742,10 @@ static jobject Class_getEnclosingConstructorNative(JNIEnv* env, jobject javaThis ScopedFastNativeObjectAccess soa(env); StackHandleScope<1> hs(soa.Self()); Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis))); + if (klass->IsObsoleteObject()) { + ThrowRuntimeException("Obsolete Object!"); + return nullptr; + } if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) { return nullptr; } @@ -708,6 +762,10 @@ static jobject Class_getEnclosingMethodNative(JNIEnv* env, jobject javaThis) { ScopedFastNativeObjectAccess soa(env); StackHandleScope<1> hs(soa.Self()); Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis))); + if (klass->IsObsoleteObject()) { + ThrowRuntimeException("Obsolete Object!"); + return nullptr; + } if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) { return nullptr; } @@ -724,6 +782,10 @@ static jint Class_getInnerClassFlags(JNIEnv* env, jobject javaThis, jint default ScopedFastNativeObjectAccess soa(env); StackHandleScope<1> hs(soa.Self()); Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis))); + if (klass->IsObsoleteObject()) { + ThrowRuntimeException("Obsolete Object!"); + return 0; + } return mirror::Class::GetInnerClassFlags(klass, defaultValue); } @@ -731,6 +793,10 @@ static jstring Class_getInnerClassName(JNIEnv* env, jobject javaThis) { ScopedFastNativeObjectAccess soa(env); StackHandleScope<1> hs(soa.Self()); Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis))); + if (klass->IsObsoleteObject()) { + ThrowRuntimeException("Obsolete Object!"); + return nullptr; + } if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) { return nullptr; } @@ -745,6 +811,10 @@ static jobjectArray Class_getSignatureAnnotation(JNIEnv* env, jobject javaThis) ScopedFastNativeObjectAccess soa(env); StackHandleScope<1> hs(soa.Self()); Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis))); + if (klass->IsObsoleteObject()) { + ThrowRuntimeException("Obsolete Object!"); + return nullptr; + } if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) { return nullptr; } @@ -756,6 +826,10 @@ static jboolean Class_isAnonymousClass(JNIEnv* env, jobject javaThis) { ScopedFastNativeObjectAccess soa(env); StackHandleScope<1> hs(soa.Self()); Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis))); + if (klass->IsObsoleteObject()) { + ThrowRuntimeException("Obsolete Object!"); + return 0; + } if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) { return false; } @@ -771,6 +845,10 @@ static jboolean Class_isDeclaredAnnotationPresent(JNIEnv* env, jobject javaThis, ScopedFastNativeObjectAccess soa(env); StackHandleScope<2> hs(soa.Self()); Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis))); + if (klass->IsObsoleteObject()) { + ThrowRuntimeException("Obsolete Object!"); + return false; + } if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) { return false; } @@ -782,6 +860,10 @@ static jclass Class_getDeclaringClass(JNIEnv* env, jobject javaThis) { ScopedFastNativeObjectAccess soa(env); StackHandleScope<1> hs(soa.Self()); Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis))); + if (klass->IsObsoleteObject()) { + ThrowRuntimeException("Obsolete Object!"); + return nullptr; + } if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) { return nullptr; } @@ -796,6 +878,10 @@ static jobject Class_newInstance(JNIEnv* env, jobject javaThis) { ScopedFastNativeObjectAccess soa(env); StackHandleScope<4> hs(soa.Self()); Handle<mirror::Class> klass = hs.NewHandle(DecodeClass(soa, javaThis)); + if (klass->IsObsoleteObject()) { + ThrowRuntimeException("Obsolete Object!"); + return nullptr; + } if (UNLIKELY(klass->GetPrimitiveType() != 0 || klass->IsInterface() || klass->IsArrayClass() || klass->IsAbstract())) { soa.Self()->ThrowNewExceptionF("Ljava/lang/InstantiationException;", |