< 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 >