Mercurial > hg > truffle
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 */ |