comparison src/share/vm/prims/jni.cpp @ 12819:f9be370a7d54

8025922: JNI access to Strings need to check if the value field is non-null Reviewed-by: dholmes, dcubed
author sla
date Sat, 05 Oct 2013 15:18:57 +0200
parents 03f493ce3a71
children ac9cb1d5a202
comparison
equal deleted inserted replaced
12818:763705f0fec3 12819:f9be370a7d54
3208 DTRACE_PROBE2(hotspot_jni, GetStringLength__entry, env, string); 3208 DTRACE_PROBE2(hotspot_jni, GetStringLength__entry, env, string);
3209 #else /* USDT2 */ 3209 #else /* USDT2 */
3210 HOTSPOT_JNI_GETSTRINGLENGTH_ENTRY( 3210 HOTSPOT_JNI_GETSTRINGLENGTH_ENTRY(
3211 env, string); 3211 env, string);
3212 #endif /* USDT2 */ 3212 #endif /* USDT2 */
3213 jsize ret = java_lang_String::length(JNIHandles::resolve_non_null(string)); 3213 jsize ret = 0;
3214 oop s = JNIHandles::resolve_non_null(string);
3215 if (java_lang_String::value(s) != NULL) {
3216 ret = java_lang_String::length(s);
3217 }
3214 #ifndef USDT2 3218 #ifndef USDT2
3215 DTRACE_PROBE1(hotspot_jni, GetStringLength__return, ret); 3219 DTRACE_PROBE1(hotspot_jni, GetStringLength__return, ret);
3216 #else /* USDT2 */ 3220 #else /* USDT2 */
3217 HOTSPOT_JNI_GETSTRINGLENGTH_RETURN( 3221 HOTSPOT_JNI_GETSTRINGLENGTH_RETURN(
3218 ret); 3222 ret);
3228 DTRACE_PROBE3(hotspot_jni, GetStringChars__entry, env, string, isCopy); 3232 DTRACE_PROBE3(hotspot_jni, GetStringChars__entry, env, string, isCopy);
3229 #else /* USDT2 */ 3233 #else /* USDT2 */
3230 HOTSPOT_JNI_GETSTRINGCHARS_ENTRY( 3234 HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(
3231 env, string, (uintptr_t *) isCopy); 3235 env, string, (uintptr_t *) isCopy);
3232 #endif /* USDT2 */ 3236 #endif /* USDT2 */
3237 jchar* buf = NULL;
3233 oop s = JNIHandles::resolve_non_null(string); 3238 oop s = JNIHandles::resolve_non_null(string);
3234 int s_len = java_lang_String::length(s);
3235 typeArrayOop s_value = java_lang_String::value(s); 3239 typeArrayOop s_value = java_lang_String::value(s);
3236 int s_offset = java_lang_String::offset(s); 3240 if (s_value != NULL) {
3237 jchar* buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal); // add one for zero termination 3241 int s_len = java_lang_String::length(s);
3238 /* JNI Specification states return NULL on OOM */ 3242 int s_offset = java_lang_String::offset(s);
3239 if (buf != NULL) { 3243 buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal); // add one for zero termination
3240 if (s_len > 0) { 3244 /* JNI Specification states return NULL on OOM */
3241 memcpy(buf, s_value->char_at_addr(s_offset), sizeof(jchar)*s_len); 3245 if (buf != NULL) {
3242 } 3246 if (s_len > 0) {
3243 buf[s_len] = 0; 3247 memcpy(buf, s_value->char_at_addr(s_offset), sizeof(jchar)*s_len);
3244 //%note jni_5 3248 }
3245 if (isCopy != NULL) { 3249 buf[s_len] = 0;
3246 *isCopy = JNI_TRUE; 3250 //%note jni_5
3251 if (isCopy != NULL) {
3252 *isCopy = JNI_TRUE;
3253 }
3247 } 3254 }
3248 } 3255 }
3249 #ifndef USDT2 3256 #ifndef USDT2
3250 DTRACE_PROBE1(hotspot_jni, GetStringChars__return, buf); 3257 DTRACE_PROBE1(hotspot_jni, GetStringChars__return, buf);
3251 #else /* USDT2 */ 3258 #else /* USDT2 */
3311 DTRACE_PROBE2(hotspot_jni, GetStringUTFLength__entry, env, string); 3318 DTRACE_PROBE2(hotspot_jni, GetStringUTFLength__entry, env, string);
3312 #else /* USDT2 */ 3319 #else /* USDT2 */
3313 HOTSPOT_JNI_GETSTRINGUTFLENGTH_ENTRY( 3320 HOTSPOT_JNI_GETSTRINGUTFLENGTH_ENTRY(
3314 env, string); 3321 env, string);
3315 #endif /* USDT2 */ 3322 #endif /* USDT2 */
3316 jsize ret = java_lang_String::utf8_length(JNIHandles::resolve_non_null(string)); 3323 jsize ret = 0;
3324 oop java_string = JNIHandles::resolve_non_null(string);
3325 if (java_lang_String::value(java_string) != NULL) {
3326 ret = java_lang_String::utf8_length(java_string);
3327 }
3317 #ifndef USDT2 3328 #ifndef USDT2
3318 DTRACE_PROBE1(hotspot_jni, GetStringUTFLength__return, ret); 3329 DTRACE_PROBE1(hotspot_jni, GetStringUTFLength__return, ret);
3319 #else /* USDT2 */ 3330 #else /* USDT2 */
3320 HOTSPOT_JNI_GETSTRINGUTFLENGTH_RETURN( 3331 HOTSPOT_JNI_GETSTRINGUTFLENGTH_RETURN(
3321 ret); 3332 ret);
3330 DTRACE_PROBE3(hotspot_jni, GetStringUTFChars__entry, env, string, isCopy); 3341 DTRACE_PROBE3(hotspot_jni, GetStringUTFChars__entry, env, string, isCopy);
3331 #else /* USDT2 */ 3342 #else /* USDT2 */
3332 HOTSPOT_JNI_GETSTRINGUTFCHARS_ENTRY( 3343 HOTSPOT_JNI_GETSTRINGUTFCHARS_ENTRY(
3333 env, string, (uintptr_t *) isCopy); 3344 env, string, (uintptr_t *) isCopy);
3334 #endif /* USDT2 */ 3345 #endif /* USDT2 */
3346 char* result = NULL;
3335 oop java_string = JNIHandles::resolve_non_null(string); 3347 oop java_string = JNIHandles::resolve_non_null(string);
3336 size_t length = java_lang_String::utf8_length(java_string); 3348 if (java_lang_String::value(java_string) != NULL) {
3337 /* JNI Specification states return NULL on OOM */ 3349 size_t length = java_lang_String::utf8_length(java_string);
3338 char* result = AllocateHeap(length + 1, mtInternal, 0, AllocFailStrategy::RETURN_NULL); 3350 /* JNI Specification states return NULL on OOM */
3339 if (result != NULL) { 3351 result = AllocateHeap(length + 1, mtInternal, 0, AllocFailStrategy::RETURN_NULL);
3340 java_lang_String::as_utf8_string(java_string, result, (int) length + 1); 3352 if (result != NULL) {
3341 if (isCopy != NULL) { 3353 java_lang_String::as_utf8_string(java_string, result, (int) length + 1);
3342 *isCopy = JNI_TRUE; 3354 if (isCopy != NULL) {
3355 *isCopy = JNI_TRUE;
3356 }
3343 } 3357 }
3344 } 3358 }
3345 #ifndef USDT2 3359 #ifndef USDT2
3346 DTRACE_PROBE1(hotspot_jni, GetStringUTFChars__return, result); 3360 DTRACE_PROBE1(hotspot_jni, GetStringUTFChars__return, result);
3347 #else /* USDT2 */ 3361 #else /* USDT2 */