diff options
| -rw-r--r-- | runtime/check_jni.cc | 10 | ||||
| -rw-r--r-- | runtime/jni_internal_test.cc | 15 |
2 files changed, 23 insertions, 2 deletions
diff --git a/runtime/check_jni.cc b/runtime/check_jni.cc index 99277a0629..b0f8e22ab2 100644 --- a/runtime/check_jni.cc +++ b/runtime/check_jni.cc @@ -228,7 +228,10 @@ class ScopedCheck { } if (invoke != kStatic) { mirror::Object* o = soa.Decode<mirror::Object*>(jobj); - if (!o->InstanceOf(m->GetDeclaringClass())) { + if (o == nullptr) { + AbortF("can't call %s on null object", PrettyMethod(m).c_str()); + return false; + } else if (!o->InstanceOf(m->GetDeclaringClass())) { AbortF("can't call %s on instance of %s", PrettyMethod(m).c_str(), PrettyTypeOf(o).c_str()); return false; } @@ -292,7 +295,10 @@ class ScopedCheck { return false; } mirror::Object* o = soa.Decode<mirror::Object*>(java_object); - if (!o->InstanceOf(m->GetDeclaringClass())) { + if (o == nullptr) { + AbortF("can't call %s on null object", PrettyMethod(m).c_str()); + return false; + } else if (!o->InstanceOf(m->GetDeclaringClass())) { AbortF("can't call %s on instance of %s", PrettyMethod(m).c_str(), PrettyTypeOf(o).c_str()); return false; } diff --git a/runtime/jni_internal_test.cc b/runtime/jni_internal_test.cc index 844d14a063..b236edea9e 100644 --- a/runtime/jni_internal_test.cc +++ b/runtime/jni_internal_test.cc @@ -746,6 +746,21 @@ TEST_F(JniInternalTest, GetMethodID) { GetMethodIdBadArgumentTest(true); } +TEST_F(JniInternalTest, CallVoidMethodNullReceiver) { + jclass jlobject = env_->FindClass("java/lang/Object"); + jmethodID method; + + // Check that GetMethodID for java.lang.NoSuchMethodError.<init>(String) finds the constructor. + method = env_->GetMethodID(jlobject, "<init>", "()V"); + EXPECT_NE(nullptr, method); + EXPECT_FALSE(env_->ExceptionCheck()); + + // Null object to CallVoidMethod. + CheckJniAbortCatcher check_jni_abort_catcher; + env_->CallVoidMethod(nullptr, method); + check_jni_abort_catcher.Check("null"); +} + TEST_F(JniInternalTest, GetStaticMethodID) { jclass jlobject = env_->FindClass("java/lang/Object"); jclass jlnsme = env_->FindClass("java/lang/NoSuchMethodError"); |