/hg/icedtea7-forest/hotspot: 3 new changesets
andrew at icedtea.classpath.org
andrew at icedtea.classpath.org
Thu Jul 23 03:40:41 UTC 2015
changeset a48816d3673e in /hg/icedtea7-forest/hotspot
details: http://icedtea.classpath.org/hg/icedtea7-forest/hotspot?cmd=changeset;node=a48816d3673e
author: mgronlun
date: Thu Jul 23 03:28:58 2015 +0100
8016105, PR2560: Add complementary RETURN_NULL allocation macros in allocation.hpp
Reviewed-by: sla, rbackman
changeset 103cbbb66872 in /hg/icedtea7-forest/hotspot
details: http://icedtea.classpath.org/hg/icedtea7-forest/hotspot?cmd=changeset;node=103cbbb66872
author: dsimms
date: Mon Aug 26 09:33:01 2013 +0200
8022683, PR2560: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
Summary: Return NULL on OOM from GetStringChars, GetStringUTFChars and Get<PrimitiveType>ArrayElements family of functions.
Reviewed-by: dholmes, coleenp
changeset aea5b566bfab in /hg/icedtea7-forest/hotspot
details: http://icedtea.classpath.org/hg/icedtea7-forest/hotspot?cmd=changeset;node=aea5b566bfab
author: sla
date: Sat Oct 05 15:18:57 2013 +0200
8025922, PR2560: JNI access to Strings need to check if the value field is non-null
Reviewed-by: dholmes, dcubed
diffstat:
src/share/vm/memory/allocation.hpp | 37 +++++++++++++---
src/share/vm/prims/jni.cpp | 84 ++++++++++++++++++++++++++-----------
src/share/vm/prims/jniCheck.cpp | 42 +++++++++---------
3 files changed, 109 insertions(+), 54 deletions(-)
diffs (262 lines):
diff -r 4ce44f68d86d -r aea5b566bfab src/share/vm/memory/allocation.hpp
--- a/src/share/vm/memory/allocation.hpp Sun Jul 19 18:19:32 2015 +0100
+++ b/src/share/vm/memory/allocation.hpp Sat Oct 05 15:18:57 2013 +0200
@@ -515,8 +515,15 @@
#define NEW_RESOURCE_ARRAY_IN_THREAD(thread, type, size)\
(type*) resource_allocate_bytes(thread, (size) * sizeof(type))
+#define NEW_RESOURCE_ARRAY_IN_THREAD_RETURN_NULL(thread, type, size)\
+ (type*) resource_allocate_bytes(thread, (size) * sizeof(type), AllocFailStrategy::RETURN_NULL)
+
#define REALLOC_RESOURCE_ARRAY(type, old, old_size, new_size)\
- (type*) resource_reallocate_bytes((char*)(old), (old_size) * sizeof(type), (new_size) * sizeof(type) )
+ (type*) resource_reallocate_bytes((char*)(old), (old_size) * sizeof(type), (new_size) * sizeof(type))
+
+#define REALLOC_RESOURCE_ARRAY_RETURN_NULL(type, old, old_size, new_size)\
+ (type*) resource_reallocate_bytes((char*)(old), (old_size) * sizeof(type),\
+ (new_size) * sizeof(type), AllocFailStrategy::RETURN_NULL)
#define FREE_RESOURCE_ARRAY(type, old, size)\
resource_free_bytes((char*)(old), (size) * sizeof(type))
@@ -527,11 +534,29 @@
#define NEW_RESOURCE_OBJ(type)\
NEW_RESOURCE_ARRAY(type, 1)
+#define NEW_RESOURCE_OBJ_RETURN_NULL(type)\
+ NEW_RESOURCE_ARRAY_RETURN_NULL(type, 1)
+
+#define NEW_C_HEAP_ARRAY3(type, size, memflags, pc, allocfail)\
+ (type*) AllocateHeap((size) * sizeof(type), memflags, pc, allocfail)
+
+#define NEW_C_HEAP_ARRAY2(type, size, memflags, pc)\
+ (type*) (AllocateHeap((size) * sizeof(type), memflags, pc))
+
#define NEW_C_HEAP_ARRAY(type, size, memflags)\
(type*) (AllocateHeap((size) * sizeof(type), memflags))
+#define NEW_C_HEAP_ARRAY2_RETURN_NULL(type, size, memflags, pc)\
+ NEW_C_HEAP_ARRAY3(type, (size), memflags, pc, AllocFailStrategy::RETURN_NULL)
+
+#define NEW_C_HEAP_ARRAY_RETURN_NULL(type, size, memflags)\
+ NEW_C_HEAP_ARRAY3(type, (size), memflags, (address)0, AllocFailStrategy::RETURN_NULL)
+
#define REALLOC_C_HEAP_ARRAY(type, old, size, memflags)\
- (type*) (ReallocateHeap((char*)old, (size) * sizeof(type), memflags))
+ (type*) (ReallocateHeap((char*)(old), (size) * sizeof(type), memflags))
+
+#define REALLOC_C_HEAP_ARRAY_RETURN_NULL(type, old, size, memflags)\
+ (type*) (ReallocateHeap((char*)(old), (size) * sizeof(type), memflags, AllocFailStrategy::RETURN_NULL))
#define FREE_C_HEAP_ARRAY(type,old,memflags) \
FreeHeap((char*)(old), memflags)
@@ -539,12 +564,8 @@
#define NEW_C_HEAP_OBJ(type, memflags)\
NEW_C_HEAP_ARRAY(type, 1, memflags)
-
-#define NEW_C_HEAP_ARRAY2(type, size, memflags, pc)\
- (type*) (AllocateHeap((size) * sizeof(type), memflags, pc))
-
-#define REALLOC_C_HEAP_ARRAY2(type, old, size, memflags, pc)\
- (type*) (ReallocateHeap((char*)old, (size) * sizeof(type), memflags, pc))
+#define NEW_C_HEAP_OBJ_RETURN_NULL(type, memflags)\
+ NEW_C_HEAP_ARRAY_RETURN_NULL(type, 1, memflags)
#define NEW_C_HEAP_OBJ2(type, memflags, pc)\
NEW_C_HEAP_ARRAY2(type, 1, memflags, pc)
diff -r 4ce44f68d86d -r aea5b566bfab src/share/vm/prims/jni.cpp
--- a/src/share/vm/prims/jni.cpp Sun Jul 19 18:19:32 2015 +0100
+++ b/src/share/vm/prims/jni.cpp Sat Oct 05 15:18:57 2013 +0200
@@ -3243,7 +3243,11 @@
HOTSPOT_JNI_GETSTRINGLENGTH_ENTRY(
env, string);
#endif /* USDT2 */
- jsize ret = java_lang_String::length(JNIHandles::resolve_non_null(string));
+ jsize ret = 0;
+ oop s = JNIHandles::resolve_non_null(string);
+ if (java_lang_String::value(s) != NULL) {
+ ret = java_lang_String::length(s);
+ }
#ifndef USDT2
DTRACE_PROBE1(hotspot_jni, GetStringLength__return, ret);
#else /* USDT2 */
@@ -3263,19 +3267,25 @@
HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(
env, string, (uintptr_t *) isCopy);
#endif /* USDT2 */
- //%note jni_5
- if (isCopy != NULL) {
- *isCopy = JNI_TRUE;
+ jchar* buf = NULL;
+ oop s = JNIHandles::resolve_non_null(string);
+ typeArrayOop s_value = java_lang_String::value(s);
+ if (s_value != NULL) {
+ int s_len = java_lang_String::length(s);
+ int s_offset = java_lang_String::offset(s);
+ buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal); // add one for zero termination
+ /* JNI Specification states return NULL on OOM */
+ if (buf != NULL) {
+ if (s_len > 0) {
+ memcpy(buf, s_value->char_at_addr(s_offset), sizeof(jchar)*s_len);
+ }
+ buf[s_len] = 0;
+ //%note jni_5
+ if (isCopy != NULL) {
+ *isCopy = JNI_TRUE;
+ }
+ }
}
- oop s = JNIHandles::resolve_non_null(string);
- int s_len = java_lang_String::length(s);
- typeArrayOop s_value = java_lang_String::value(s);
- int s_offset = java_lang_String::offset(s);
- jchar* buf = NEW_C_HEAP_ARRAY(jchar, s_len + 1, mtInternal); // add one for zero termination
- if (s_len > 0) {
- memcpy(buf, s_value->char_at_addr(s_offset), sizeof(jchar)*s_len);
- }
- buf[s_len] = 0;
#ifndef USDT2
DTRACE_PROBE1(hotspot_jni, GetStringChars__return, buf);
#else /* USDT2 */
@@ -3343,7 +3353,11 @@
HOTSPOT_JNI_GETSTRINGUTFLENGTH_ENTRY(
env, string);
#endif /* USDT2 */
- jsize ret = java_lang_String::utf8_length(JNIHandles::resolve_non_null(string));
+ jsize ret = 0;
+ oop java_string = JNIHandles::resolve_non_null(string);
+ if (java_lang_String::value(java_string) != NULL) {
+ ret = java_lang_String::utf8_length(java_string);
+ }
#ifndef USDT2
DTRACE_PROBE1(hotspot_jni, GetStringUTFLength__return, ret);
#else /* USDT2 */
@@ -3362,11 +3376,19 @@
HOTSPOT_JNI_GETSTRINGUTFCHARS_ENTRY(
env, string, (uintptr_t *) isCopy);
#endif /* USDT2 */
+ char* result = NULL;
oop java_string = JNIHandles::resolve_non_null(string);
- size_t length = java_lang_String::utf8_length(java_string);
- char* result = AllocateHeap(length + 1, mtInternal);
- java_lang_String::as_utf8_string(java_string, result, (int) length + 1);
- if (isCopy != NULL) *isCopy = JNI_TRUE;
+ if (java_lang_String::value(java_string) != NULL) {
+ size_t length = java_lang_String::utf8_length(java_string);
+ /* JNI Specification states return NULL on OOM */
+ result = AllocateHeap(length + 1, mtInternal, 0, AllocFailStrategy::RETURN_NULL);
+ if (result != NULL) {
+ java_lang_String::as_utf8_string(java_string, result, (int) length + 1);
+ if (isCopy != NULL) {
+ *isCopy = JNI_TRUE;
+ }
+ }
+ }
#ifndef USDT2
DTRACE_PROBE1(hotspot_jni, GetStringUTFChars__return, result);
#else /* USDT2 */
@@ -3620,11 +3642,16 @@
* Avoid asserts in typeArrayOop. */ \
result = (ElementType*)get_bad_address(); \
} else { \
- result = NEW_C_HEAP_ARRAY(ElementType, len, mtInternal); \
- /* copy the array to the c chunk */ \
- memcpy(result, a->Tag##_at_addr(0), sizeof(ElementType)*len); \
+ /* JNI Specification states return NULL on OOM */ \
+ result = NEW_C_HEAP_ARRAY_RETURN_NULL(ElementType, len, mtInternal); \
+ if (result != NULL) { \
+ /* copy the array to the c chunk */ \
+ memcpy(result, a->Tag##_at_addr(0), sizeof(ElementType)*len); \
+ if (isCopy) { \
+ *isCopy = JNI_TRUE; \
+ } \
+ } \
} \
- if (isCopy) *isCopy = JNI_TRUE; \
DTRACE_PROBE1(hotspot_jni, Get##Result##ArrayElements__return, result);\
return result; \
JNI_END
@@ -3657,11 +3684,16 @@
* Avoid asserts in typeArrayOop. */ \
result = (ElementType*)get_bad_address(); \
} else { \
- result = NEW_C_HEAP_ARRAY(ElementType, len, mtInternal); \
- /* copy the array to the c chunk */ \
- memcpy(result, a->Tag##_at_addr(0), sizeof(ElementType)*len); \
+ /* JNI Specification states return NULL on OOM */ \
+ result = NEW_C_HEAP_ARRAY_RETURN_NULL(ElementType, len, mtInternal); \
+ if (result != NULL) { \
+ /* copy the array to the c chunk */ \
+ memcpy(result, a->Tag##_at_addr(0), sizeof(ElementType)*len); \
+ if (isCopy) { \
+ *isCopy = JNI_TRUE; \
+ } \
+ } \
} \
- if (isCopy) *isCopy = JNI_TRUE; \
ReturnProbe; \
return result; \
JNI_END
diff -r 4ce44f68d86d -r aea5b566bfab src/share/vm/prims/jniCheck.cpp
--- a/src/share/vm/prims/jniCheck.cpp Sun Jul 19 18:19:32 2015 +0100
+++ b/src/share/vm/prims/jniCheck.cpp Sat Oct 05 15:18:57 2013 +0200
@@ -1307,18 +1307,19 @@
IN_VM(
checkString(thr, str);
)
+ jchar* newResult = NULL;
const jchar *result = UNCHECKED()->GetStringChars(env,str,isCopy);
assert (isCopy == NULL || *isCopy == JNI_TRUE, "GetStringChars didn't return a copy as expected");
-
- size_t len = UNCHECKED()->GetStringLength(env,str) + 1; // + 1 for NULL termination
- jint* tagLocation = (jint*) AllocateHeap(len * sizeof(jchar) + sizeof(jint), mtInternal);
- *tagLocation = STRING_TAG;
- jchar* newResult = (jchar*) (tagLocation + 1);
- memcpy(newResult, result, len * sizeof(jchar));
- // Avoiding call to UNCHECKED()->ReleaseStringChars() since that will fire unexpected dtrace probes
- // Note that the dtrace arguments for the allocated memory will not match up with this solution.
- FreeHeap((char*)result);
-
+ if (result != NULL) {
+ size_t len = UNCHECKED()->GetStringLength(env,str) + 1; // + 1 for NULL termination
+ jint* tagLocation = (jint*) AllocateHeap(len * sizeof(jchar) + sizeof(jint), mtInternal);
+ *tagLocation = STRING_TAG;
+ newResult = (jchar*) (tagLocation + 1);
+ memcpy(newResult, result, len * sizeof(jchar));
+ // Avoiding call to UNCHECKED()->ReleaseStringChars() since that will fire unexpected dtrace probes
+ // Note that the dtrace arguments for the allocated memory will not match up with this solution.
+ FreeHeap((char*)result);
+ }
functionExit(env);
return newResult;
JNI_END
@@ -1377,18 +1378,19 @@
IN_VM(
checkString(thr, str);
)
+ char* newResult = NULL;
const char *result = UNCHECKED()->GetStringUTFChars(env,str,isCopy);
assert (isCopy == NULL || *isCopy == JNI_TRUE, "GetStringUTFChars didn't return a copy as expected");
-
- size_t len = strlen(result) + 1; // + 1 for NULL termination
- jint* tagLocation = (jint*) AllocateHeap(len + sizeof(jint), mtInternal);
- *tagLocation = STRING_UTF_TAG;
- char* newResult = (char*) (tagLocation + 1);
- strcpy(newResult, result);
- // Avoiding call to UNCHECKED()->ReleaseStringUTFChars() since that will fire unexpected dtrace probes
- // Note that the dtrace arguments for the allocated memory will not match up with this solution.
- FreeHeap((char*)result, mtInternal);
-
+ if (result != NULL) {
+ size_t len = strlen(result) + 1; // + 1 for NULL termination
+ jint* tagLocation = (jint*) AllocateHeap(len + sizeof(jint), mtInternal);
+ *tagLocation = STRING_UTF_TAG;
+ newResult = (char*) (tagLocation + 1);
+ strcpy(newResult, result);
+ // Avoiding call to UNCHECKED()->ReleaseStringUTFChars() since that will fire unexpected dtrace probes
+ // Note that the dtrace arguments for the allocated memory will not match up with this solution.
+ FreeHeap((char*)result, mtInternal);
+ }
functionExit(env);
return newResult;
JNI_END
More information about the distro-pkg-dev
mailing list