< prev index next >
src/hotspot/share/prims/jniCheck.cpp
Print this page
@@ -446,20 +446,20 @@
Method* jniCheck::validate_jmethod_id(JavaThread* thr, jmethodID method_id) {
ASSERT_OOPS_ALLOWED;
// do the fast jmethodID check first
- Method* moop = Method::checked_resolve_jmethod_id(method_id);
- if (moop == NULL) {
+ Method* m = Method::checked_resolve_jmethod_id(method_id);
+ if (m == NULL) {
ReportJNIFatalError(thr, fatal_wrong_class_or_method);
}
- // jmethodIDs are supposed to be weak handles in the class loader data,
+ // jmethodIDs are handles in the class loader data,
// but that can be expensive so check it last
else if (!Method::is_method_id(method_id)) {
ReportJNIFatalError(thr, fatal_non_weak_method);
}
- return moop;
+ return m;
}
oop jniCheck::validate_object(JavaThread* thr, jobject obj) {
if (obj == NULL) return NULL;
@@ -523,15 +523,22 @@
ASSERT_OOPS_ALLOWED;
jniCheck::validate_jmethod_id(thr, method_id);
jniCheck::validate_object(thr, obj);
}
-void jniCheck::validate_call_class(JavaThread* thr, jclass clazz, jmethodID method_id) {
- /* validate the class being passed */
+void jniCheck::validate_call_class(JavaThread* thr, jclass clazz, jmethodID method_id, jobject obj) {
ASSERT_OOPS_ALLOWED;
- jniCheck::validate_jmethod_id(thr, method_id);
- jniCheck::validate_class(thr, clazz, false);
+ Method* m = jniCheck::validate_jmethod_id(thr, method_id);
+ Klass* k = jniCheck::validate_class(thr, clazz, false);
+ if (obj != NULL) {
+ jniCheck::validate_object(thr, obj);
+ }
+
+ // Check that method is in the class, must be InstanceKlass
+ if (!InstanceKlass::cast(k)->is_subtype_of(m->method_holder())) {
+ ReportJNIFatalError(thr, fatal_wrong_class_or_method);
+ }
}
/*
* IMPLEMENTATION OF FUNCTIONS IN CHECKED TABLE
@@ -593,12 +600,11 @@
jclass cls,
jmethodID methodID,
jboolean isStatic))
functionEnter(thr);
IN_VM(
- jniCheck::validate_class(thr, cls, false);
- jniCheck::validate_jmethod_id(thr, methodID);
+ jniCheck::validate_call_class(thr, cls, methodID);
)
jobject result = UNCHECKED()->ToReflectedMethod(env, cls, methodID,
isStatic);
functionExit(thr);
return result;
@@ -850,12 +856,11 @@
jmethodID methodID,
...))
functionEnter(thr);
va_list args;
IN_VM(
- jniCheck::validate_class(thr, clazz, false);
- jniCheck::validate_jmethod_id(thr, methodID);
+ jniCheck::validate_call_class(thr, clazz, methodID);
)
va_start(args, methodID);
jobject result = UNCHECKED()->NewObjectV(env,clazz,methodID,args);
va_end(args);
functionExit(thr);
@@ -867,12 +872,11 @@
jclass clazz,
jmethodID methodID,
va_list args))
functionEnter(thr);
IN_VM(
- jniCheck::validate_class(thr, clazz, false);
- jniCheck::validate_jmethod_id(thr, methodID);
+ jniCheck::validate_call_class(thr, clazz, methodID);
)
jobject result = UNCHECKED()->NewObjectV(env,clazz,methodID,args);
functionExit(thr);
return result;
JNI_END
@@ -882,12 +886,11 @@
jclass clazz,
jmethodID methodID,
const jvalue *args))
functionEnter(thr);
IN_VM(
- jniCheck::validate_class(thr, clazz, false);
- jniCheck::validate_jmethod_id(thr, methodID);
+ jniCheck::validate_call_class(thr, clazz, methodID);
)
jobject result = UNCHECKED()->NewObjectA(env,clazz,methodID,args);
functionExit(thr);
return result;
JNI_END
@@ -1047,12 +1050,11 @@
jmethodID methodID, \
...)) \
functionEnter(thr); \
va_list args; \
IN_VM( \
- jniCheck::validate_call_object(thr, obj, methodID); \
- jniCheck::validate_call_class(thr, clazz, methodID); \
+ jniCheck::validate_call_class(thr, clazz, methodID, obj); \
) \
va_start(args,methodID); \
ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodV(env, \
obj, \
clazz, \
@@ -1070,12 +1072,11 @@
jclass clazz, \
jmethodID methodID, \
va_list args)) \
functionEnter(thr); \
IN_VM( \
- jniCheck::validate_call_object(thr, obj, methodID); \
- jniCheck::validate_call_class(thr, clazz, methodID); \
+ jniCheck::validate_call_class(thr, clazz, methodID, obj); \
) \
ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodV(env, \
obj, \
clazz, \
methodID,\
@@ -1091,12 +1092,11 @@
jclass clazz, \
jmethodID methodID, \
const jvalue * args)) \
functionEnter(thr); \
IN_VM( \
- jniCheck::validate_call_object(thr, obj, methodID); \
- jniCheck::validate_call_class(thr, clazz, methodID); \
+ jniCheck::validate_call_class(thr, clazz, methodID, obj); \
) \
ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodA(env, \
obj, \
clazz, \
methodID,\
@@ -1123,12 +1123,11 @@
jmethodID methodID,
...))
functionEnter(thr);
va_list args;
IN_VM(
- jniCheck::validate_call_object(thr, obj, methodID);
- jniCheck::validate_call_class(thr, clazz, methodID);
+ jniCheck::validate_call_class(thr, clazz, methodID, obj);
)
va_start(args,methodID);
UNCHECKED()->CallNonvirtualVoidMethodV(env,obj,clazz,methodID,args);
va_end(args);
thr->set_pending_jni_exception_check("CallNonvirtualVoidMethod");
@@ -1141,12 +1140,11 @@
jclass clazz,
jmethodID methodID,
va_list args))
functionEnter(thr);
IN_VM(
- jniCheck::validate_call_object(thr, obj, methodID);
- jniCheck::validate_call_class(thr, clazz, methodID);
+ jniCheck::validate_call_class(thr, clazz, methodID, obj);
)
UNCHECKED()->CallNonvirtualVoidMethodV(env,obj,clazz,methodID,args);
thr->set_pending_jni_exception_check("CallNonvirtualVoidMethodV");
functionExit(thr);
JNI_END
@@ -1157,12 +1155,11 @@
jclass clazz,
jmethodID methodID,
const jvalue * args))
functionEnter(thr);
IN_VM(
- jniCheck::validate_call_object(thr, obj, methodID);
- jniCheck::validate_call_class(thr, clazz, methodID);
+ jniCheck::validate_call_class(thr, clazz, methodID, obj);
)
UNCHECKED()->CallNonvirtualVoidMethodA(env,obj,clazz,methodID,args);
thr->set_pending_jni_exception_check("CallNonvirtualVoidMethodA");
functionExit(thr);
JNI_END
@@ -1251,12 +1248,11 @@
jmethodID methodID, \
...)) \
functionEnter(thr); \
va_list args; \
IN_VM( \
- jniCheck::validate_jmethod_id(thr, methodID); \
- jniCheck::validate_class(thr, clazz, false); \
+ jniCheck::validate_call_class(thr, clazz, methodID); \
) \
va_start(args,methodID); \
ReturnType result = UNCHECKED()->CallStatic##Result##MethodV(env, \
clazz, \
methodID, \
@@ -1272,12 +1268,11 @@
jclass clazz, \
jmethodID methodID,\
va_list args)) \
functionEnter(thr); \
IN_VM( \
- jniCheck::validate_jmethod_id(thr, methodID); \
- jniCheck::validate_class(thr, clazz, false); \
+ jniCheck::validate_call_class(thr, clazz, methodID); \
) \
ReturnType result = UNCHECKED()->CallStatic##Result##MethodV(env, \
clazz, \
methodID, \
args); \
@@ -1291,12 +1286,11 @@
jclass clazz, \
jmethodID methodID, \
const jvalue *args)) \
functionEnter(thr); \
IN_VM( \
- jniCheck::validate_jmethod_id(thr, methodID); \
- jniCheck::validate_class(thr, clazz, false); \
+ jniCheck::validate_call_class(thr, clazz, methodID); \
) \
ReturnType result = UNCHECKED()->CallStatic##Result##MethodA(env, \
clazz, \
methodID, \
args); \
@@ -1321,12 +1315,11 @@
jmethodID methodID,
...))
functionEnter(thr);
va_list args;
IN_VM(
- jniCheck::validate_jmethod_id(thr, methodID);
- jniCheck::validate_class(thr, cls, false);
+ jniCheck::validate_call_class(thr, cls, methodID);
)
va_start(args,methodID);
UNCHECKED()->CallStaticVoidMethodV(env,cls,methodID,args);
va_end(args);
thr->set_pending_jni_exception_check("CallStaticVoidMethod");
@@ -1338,12 +1331,11 @@
jclass cls,
jmethodID methodID,
va_list args))
functionEnter(thr);
IN_VM(
- jniCheck::validate_jmethod_id(thr, methodID);
- jniCheck::validate_class(thr, cls, false);
+ jniCheck::validate_call_class(thr, cls, methodID);
)
UNCHECKED()->CallStaticVoidMethodV(env,cls,methodID,args);
thr->set_pending_jni_exception_check("CallStaticVoidMethodV");
functionExit(thr);
JNI_END
@@ -1353,12 +1345,11 @@
jclass cls,
jmethodID methodID,
const jvalue * args))
functionEnter(thr);
IN_VM(
- jniCheck::validate_jmethod_id(thr, methodID);
- jniCheck::validate_class(thr, cls, false);
+ jniCheck::validate_call_class(thr, cls, methodID);
)
UNCHECKED()->CallStaticVoidMethodA(env,cls,methodID,args);
thr->set_pending_jni_exception_check("CallStaticVoidMethodA");
functionExit(thr);
JNI_END
< prev index next >