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