< prev index next >

src/hotspot/share/prims/jniCheck.cpp

Print this page

 238   fieldDescriptor fd;
 239 
 240   /* make sure it is a static field */
 241   if (!jfieldIDWorkaround::is_static_jfieldID(fid))
 242     ReportJNIFatalError(thr, fatal_should_be_static);
 243 
 244   /* validate the class being passed */
 245   ASSERT_OOPS_ALLOWED;
 246   Klass* k_oop = jniCheck::validate_class(thr, cls, false);
 247 
 248   /* check for proper subclass hierarchy */
 249   JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fid);
 250   Klass* f_oop = id->holder();
 251   if (!k_oop->is_subtype_of(f_oop))
 252     ReportJNIFatalError(thr, fatal_wrong_static_field);
 253 
 254   /* check for proper field type */
 255   if (!id->find_local_field(&fd))
 256     ReportJNIFatalError(thr, fatal_static_field_not_found);
 257   if ((fd.field_type() != ftype) &&
 258       !(fd.field_type() == T_ARRAY && ftype == T_OBJECT)) {
 259     ReportJNIFatalError(thr, fatal_static_field_mismatch);
 260   }
 261 }
 262 
 263 static inline void
 264 checkInstanceFieldID(JavaThread* thr, jfieldID fid, jobject obj, int ftype)
 265 {
 266   fieldDescriptor fd;
 267 
 268   /* make sure it is an instance field */
 269   if (jfieldIDWorkaround::is_static_jfieldID(fid))
 270     ReportJNIFatalError(thr, fatal_should_be_nonstatic);
 271 
 272   /* validate the object being passed and then get its class */
 273   ASSERT_OOPS_ALLOWED;
 274   oop oopObj = jniCheck::validate_object(thr, obj);
 275   if (oopObj == nullptr) {
 276     ReportJNIFatalError(thr, fatal_null_object);
 277   }
 278   Klass* k_oop = oopObj->klass();

 326   if (!aOop->is_typeArray()) {
 327      ReportJNIFatalError(thr, fatal_prim_type_array_expected);
 328   }
 329   return aOop;
 330 }
 331 
 332 static inline void
 333 check_primitive_array_type(JavaThread* thr, jarray jArray, BasicType elementType)
 334 {
 335   BasicType array_type;
 336   arrayOop aOop;
 337 
 338   aOop = check_is_primitive_array(thr, jArray);
 339   array_type = TypeArrayKlass::cast(aOop->klass())->element_type();
 340   if (array_type != elementType) {
 341     ReportJNIFatalError(thr, fatal_element_type_mismatch);
 342   }
 343 }
 344 
 345 static inline void
 346 check_is_obj_array(JavaThread* thr, jarray jArray) {
 347   arrayOop aOop = check_is_array(thr, jArray);
 348   if (!aOop->is_objArray()) {
 349     ReportJNIFatalError(thr, fatal_object_array_expected);
 350   }
 351 }
 352 
 353 // Arbitrary (but well-known) tag for GetStringChars
 354 const void* STRING_TAG = (void*)0x47114711;
 355 
 356 // Arbitrary (but well-known) tag for GetStringUTFChars
 357 const void* STRING_UTF_TAG = (void*) 0x48124812;
 358 
 359 // Arbitrary (but well-known) tag for GetPrimitiveArrayCritical
 360 const void* CRITICAL_TAG = (void*)0x49134913;
 361 
 362 /*
 363  * Copy and wrap array elements for bounds checking.
 364  * Remember the original elements (GuardedMemory::get_tag())
 365  */
 366 static void* check_jni_wrap_copy_array(JavaThread* thr, jarray array,
 367                                        void* orig_elements, jboolean is_critical = JNI_FALSE) {
 368   void* result;

1635     return result;
1636 JNI_END
1637 
1638 JNI_ENTRY_CHECKED(jobjectArray,
1639   checked_jni_NewObjectArray(JNIEnv *env,
1640                              jsize len,
1641                              jclass clazz,
1642                              jobject init))
1643     functionEnter(thr);
1644     jobjectArray result = UNCHECKED()->NewObjectArray(env,len,clazz,init);
1645     functionExit(thr);
1646     return result;
1647 JNI_END
1648 
1649 JNI_ENTRY_CHECKED(jobject,
1650   checked_jni_GetObjectArrayElement(JNIEnv *env,
1651                                     jobjectArray array,
1652                                     jsize index))
1653     functionEnter(thr);
1654     IN_VM(
1655       check_is_obj_array(thr, array);
1656     )
1657     jobject result = UNCHECKED()->GetObjectArrayElement(env,array,index);
1658     functionExit(thr);
1659     return result;
1660 JNI_END
1661 
1662 JNI_ENTRY_CHECKED(void,
1663   checked_jni_SetObjectArrayElement(JNIEnv *env,
1664                                     jobjectArray array,
1665                                     jsize index,
1666                                     jobject val))
1667     functionEnter(thr);
1668     IN_VM(
1669       check_is_obj_array(thr, array);
1670     )
1671     UNCHECKED()->SetObjectArrayElement(env,array,index,val);
1672     functionExit(thr);
1673 JNI_END
1674 
1675 #define WRAPPER_NewScalarArray(Return, Result) \
1676 JNI_ENTRY_CHECKED(Return, \
1677   checked_jni_New##Result##Array(JNIEnv *env, \
1678                                  jsize len)) \
1679     functionEnter(thr); \
1680     Return result = UNCHECKED()->New##Result##Array(env,len); \
1681     functionExit(thr); \
1682     return (Return) result; \
1683 JNI_END
1684 
1685 WRAPPER_NewScalarArray(jbooleanArray, Boolean)
1686 WRAPPER_NewScalarArray(jbyteArray, Byte)
1687 WRAPPER_NewScalarArray(jshortArray, Short)
1688 WRAPPER_NewScalarArray(jcharArray, Char)
1689 WRAPPER_NewScalarArray(jintArray, Int)

 238   fieldDescriptor fd;
 239 
 240   /* make sure it is a static field */
 241   if (!jfieldIDWorkaround::is_static_jfieldID(fid))
 242     ReportJNIFatalError(thr, fatal_should_be_static);
 243 
 244   /* validate the class being passed */
 245   ASSERT_OOPS_ALLOWED;
 246   Klass* k_oop = jniCheck::validate_class(thr, cls, false);
 247 
 248   /* check for proper subclass hierarchy */
 249   JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fid);
 250   Klass* f_oop = id->holder();
 251   if (!k_oop->is_subtype_of(f_oop))
 252     ReportJNIFatalError(thr, fatal_wrong_static_field);
 253 
 254   /* check for proper field type */
 255   if (!id->find_local_field(&fd))
 256     ReportJNIFatalError(thr, fatal_static_field_not_found);
 257   if ((fd.field_type() != ftype) &&
 258       !(fd.field_type() == T_ARRAY && ftype == T_OBJECT))  {
 259     ReportJNIFatalError(thr, fatal_static_field_mismatch);
 260   }
 261 }
 262 
 263 static inline void
 264 checkInstanceFieldID(JavaThread* thr, jfieldID fid, jobject obj, int ftype)
 265 {
 266   fieldDescriptor fd;
 267 
 268   /* make sure it is an instance field */
 269   if (jfieldIDWorkaround::is_static_jfieldID(fid))
 270     ReportJNIFatalError(thr, fatal_should_be_nonstatic);
 271 
 272   /* validate the object being passed and then get its class */
 273   ASSERT_OOPS_ALLOWED;
 274   oop oopObj = jniCheck::validate_object(thr, obj);
 275   if (oopObj == nullptr) {
 276     ReportJNIFatalError(thr, fatal_null_object);
 277   }
 278   Klass* k_oop = oopObj->klass();

 326   if (!aOop->is_typeArray()) {
 327      ReportJNIFatalError(thr, fatal_prim_type_array_expected);
 328   }
 329   return aOop;
 330 }
 331 
 332 static inline void
 333 check_primitive_array_type(JavaThread* thr, jarray jArray, BasicType elementType)
 334 {
 335   BasicType array_type;
 336   arrayOop aOop;
 337 
 338   aOop = check_is_primitive_array(thr, jArray);
 339   array_type = TypeArrayKlass::cast(aOop->klass())->element_type();
 340   if (array_type != elementType) {
 341     ReportJNIFatalError(thr, fatal_element_type_mismatch);
 342   }
 343 }
 344 
 345 static inline void
 346 check_is_obj_or_inline_array(JavaThread* thr, jarray jArray) {
 347   arrayOop aOop = check_is_array(thr, jArray);
 348   if (!aOop->is_objArray() && !aOop->is_flatArray()) {
 349     ReportJNIFatalError(thr, fatal_object_array_expected);
 350   }
 351 }
 352 
 353 // Arbitrary (but well-known) tag for GetStringChars
 354 const void* STRING_TAG = (void*)0x47114711;
 355 
 356 // Arbitrary (but well-known) tag for GetStringUTFChars
 357 const void* STRING_UTF_TAG = (void*) 0x48124812;
 358 
 359 // Arbitrary (but well-known) tag for GetPrimitiveArrayCritical
 360 const void* CRITICAL_TAG = (void*)0x49134913;
 361 
 362 /*
 363  * Copy and wrap array elements for bounds checking.
 364  * Remember the original elements (GuardedMemory::get_tag())
 365  */
 366 static void* check_jni_wrap_copy_array(JavaThread* thr, jarray array,
 367                                        void* orig_elements, jboolean is_critical = JNI_FALSE) {
 368   void* result;

1635     return result;
1636 JNI_END
1637 
1638 JNI_ENTRY_CHECKED(jobjectArray,
1639   checked_jni_NewObjectArray(JNIEnv *env,
1640                              jsize len,
1641                              jclass clazz,
1642                              jobject init))
1643     functionEnter(thr);
1644     jobjectArray result = UNCHECKED()->NewObjectArray(env,len,clazz,init);
1645     functionExit(thr);
1646     return result;
1647 JNI_END
1648 
1649 JNI_ENTRY_CHECKED(jobject,
1650   checked_jni_GetObjectArrayElement(JNIEnv *env,
1651                                     jobjectArray array,
1652                                     jsize index))
1653     functionEnter(thr);
1654     IN_VM(
1655       check_is_obj_or_inline_array(thr, array);
1656     )
1657     jobject result = UNCHECKED()->GetObjectArrayElement(env,array,index);
1658     functionExit(thr);
1659     return result;
1660 JNI_END
1661 
1662 JNI_ENTRY_CHECKED(void,
1663   checked_jni_SetObjectArrayElement(JNIEnv *env,
1664                                     jobjectArray array,
1665                                     jsize index,
1666                                     jobject val))
1667     functionEnter(thr);
1668     IN_VM(
1669       check_is_obj_or_inline_array(thr, array);
1670     )
1671     UNCHECKED()->SetObjectArrayElement(env,array,index,val);
1672     functionExit(thr);
1673 JNI_END
1674 
1675 #define WRAPPER_NewScalarArray(Return, Result) \
1676 JNI_ENTRY_CHECKED(Return, \
1677   checked_jni_New##Result##Array(JNIEnv *env, \
1678                                  jsize len)) \
1679     functionEnter(thr); \
1680     Return result = UNCHECKED()->New##Result##Array(env,len); \
1681     functionExit(thr); \
1682     return (Return) result; \
1683 JNI_END
1684 
1685 WRAPPER_NewScalarArray(jbooleanArray, Boolean)
1686 WRAPPER_NewScalarArray(jbyteArray, Byte)
1687 WRAPPER_NewScalarArray(jshortArray, Short)
1688 WRAPPER_NewScalarArray(jcharArray, Char)
1689 WRAPPER_NewScalarArray(jintArray, Int)
< prev index next >