Fix missing receiver NPE checks for field get/set MH
Bug: 236815690
Test: art/test/run-test --host 959
Change-Id: Ief4713290c83291c3d538501c83a7239bf2daf10
diff --git a/runtime/method_handles.cc b/runtime/method_handles.cc
index 1327a24..286e097 100644
--- a/runtime/method_handles.cc
+++ b/runtime/method_handles.cc
@@ -625,6 +625,10 @@
case mirror::MethodHandle::kInstanceGet: {
size_t obj_reg = operands->GetOperand(0);
ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(obj_reg);
+ if (obj == nullptr) {
+ ThrowNullPointerException("Receiver is null");
+ return false;
+ }
MethodHandleFieldGet(self, shadow_frame, obj, field, field_type, result);
return true;
}
@@ -648,6 +652,10 @@
callsite_type->GetPTypes()->Get(kPTypeIndex)->GetPrimitiveType(),
value_reg);
ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(obj_reg);
+ if (obj == nullptr) {
+ ThrowNullPointerException("Receiver is null");
+ return false;
+ }
return MethodHandleFieldPut(self, shadow_frame, obj, field, field_type, value);
}
case mirror::MethodHandle::kStaticPut: {
diff --git a/test/959-invoke-polymorphic-accessors/src/Main.java b/test/959-invoke-polymorphic-accessors/src/Main.java
index 03fd285..e4a6f94 100644
--- a/test/959-invoke-polymorphic-accessors/src/Main.java
+++ b/test/959-invoke-polymorphic-accessors/src/Main.java
@@ -793,6 +793,10 @@
Long z = (Long) h0.invoke(valueHolder);
fail();
} catch (WrongMethodTypeException expected) {}
+ try {
+ int x = (int) h0.invokeExact((ValueHolder) null);
+ fail();
+ } catch (NullPointerException expected) {}
}
/*package*/ static Number getDoubleAsNumber() {
@@ -822,6 +826,10 @@
h0.invoke(valueHolder, (Float) null);
fail();
} catch (NullPointerException expected) {}
+ try {
+ h0.invoke((ValueHolder) null, Float.valueOf(1.0f));
+ fail();
+ } catch (NullPointerException expected) {}
// Test that type conversion checks work on small field types.
short temp = (short) s0.invoke(valueHolder, new Byte((byte) 45));