From 167350d9c781c5e3893714bb26ab5cb1c4abf6b4 Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Wed, 20 Aug 2014 12:09:38 -0700 Subject: [PATCH] Add null check to CheckVirtualMethod There was a runtime SIGSEGV that should have been a check jni failure. Also added regression test. Bug: 16320699 Change-Id: If6c8e73959cefb24e4703f1562cdddb343d86630 --- runtime/check_jni.cc | 4 +++- runtime/jni_internal_test.cc | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/runtime/check_jni.cc b/runtime/check_jni.cc index a530594d7..9036e3daa 100644 --- a/runtime/check_jni.cc +++ b/runtime/check_jni.cc @@ -353,7 +353,9 @@ class ScopedCheck { return; } mirror::Object* o = soa_.Decode(java_object); - if (!o->InstanceOf(m->GetDeclaringClass())) { + if (o == nullptr) { + JniAbortF(function_name_, "can't call %s on null object", PrettyMethod(m).c_str()); + } else if (!o->InstanceOf(m->GetDeclaringClass())) { JniAbortF(function_name_, "can't call %s on instance of %s", PrettyMethod(m).c_str(), PrettyTypeOf(o).c_str()); } diff --git a/runtime/jni_internal_test.cc b/runtime/jni_internal_test.cc index da3080f21..bb4632166 100644 --- a/runtime/jni_internal_test.cc +++ b/runtime/jni_internal_test.cc @@ -314,6 +314,22 @@ TEST_F(JniInternalTest, GetMethodID) { check_jni_abort_catcher.Check("sig == null"); } +TEST_F(JniInternalTest, CallVoidMethodNullReceiver) { + jclass jlobject = env_->FindClass("java/lang/Object"); + jmethodID method; + + // Check that GetMethodID for java.lang.NoSuchMethodError.(String) finds the constructor. + method = env_->GetMethodID(jlobject, "", "()V"); + EXPECT_NE(nullptr, method); + EXPECT_FALSE(env_->ExceptionCheck()); + + // Null object to CallVoidMethod. + CheckJniAbortCatcher check_jni_abort_catcher; + method = env_->GetMethodID(nullptr, "", "(Ljava/lang/String;)V"); + 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"); -- 2.11.0