summaryrefslogtreecommitdiff
path: root/runtime/native/java_lang_Class.cc
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/native/java_lang_Class.cc')
-rw-r--r--runtime/native/java_lang_Class.cc90
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;",