提交 b80e0660 编写于 作者: A alanb

8034102: Check solaris/native/sun/nio/fs/MacOSXNativeDispatcher.c for JNI pending exceptions

Reviewed-by: chegar, henryjen
上级 b1b5e7ba
...@@ -39,12 +39,15 @@ Java_sun_nio_fs_MacOSXNativeDispatcher_normalizepath(JNIEnv* env, jclass this, ...@@ -39,12 +39,15 @@ Java_sun_nio_fs_MacOSXNativeDispatcher_normalizepath(JNIEnv* env, jclass this,
jint form) jint form)
{ {
jcharArray result = NULL; jcharArray result = NULL;
char chars_buf[(PATH_MAX + 1) * 2]; // utf16 + zero padding char *chars;
CFMutableStringRef csref = CFStringCreateMutable(NULL, 0); CFMutableStringRef csref = CFStringCreateMutable(NULL, 0);
if (csref == NULL) { if (csref == NULL) {
JNU_ThrowOutOfMemoryError(env, "native heap"); JNU_ThrowOutOfMemoryError(env, "native heap");
} else { return NULL;
char *chars = (char*)(*env)->GetPrimitiveArrayCritical(env, path, 0); }
chars = (char*)(*env)->GetPrimitiveArrayCritical(env, path, 0);
if (chars != NULL) {
char chars_buf[(PATH_MAX + 1) * 2]; // utf16 + zero padding
jsize len = (*env)->GetArrayLength(env, path); jsize len = (*env)->GetArrayLength(env, path);
CFStringAppendCharacters(csref, (const UniChar*)chars, len); CFStringAppendCharacters(csref, (const UniChar*)chars, len);
(*env)->ReleasePrimitiveArrayCritical(env, path, chars, 0); (*env)->ReleasePrimitiveArrayCritical(env, path, chars, 0);
...@@ -53,24 +56,26 @@ Java_sun_nio_fs_MacOSXNativeDispatcher_normalizepath(JNIEnv* env, jclass this, ...@@ -53,24 +56,26 @@ Java_sun_nio_fs_MacOSXNativeDispatcher_normalizepath(JNIEnv* env, jclass this,
if (len < PATH_MAX) { if (len < PATH_MAX) {
if (CFStringGetCString(csref, chars_buf, sizeof(chars_buf), kCFStringEncodingUTF16)) { if (CFStringGetCString(csref, chars_buf, sizeof(chars_buf), kCFStringEncodingUTF16)) {
result = (*env)->NewCharArray(env, len); result = (*env)->NewCharArray(env, len);
(*env)->SetCharArrayRegion(env, result, 0, len, (jchar*)&chars_buf); if (result != NULL) {
(*env)->SetCharArrayRegion(env, result, 0, len, (jchar*)&chars_buf);
}
} }
} else { } else {
int ulen = (len + 1) * 2; int ulen = (len + 1) * 2;
chars = malloc(ulen); chars = malloc(ulen);
if (chars == NULL) { if (chars == NULL) {
CFRelease(csref);
JNU_ThrowOutOfMemoryError(env, "native heap"); JNU_ThrowOutOfMemoryError(env, "native heap");
return result;
} else { } else {
if (CFStringGetCString(csref, chars, ulen, kCFStringEncodingUTF16)) { if (CFStringGetCString(csref, chars, ulen, kCFStringEncodingUTF16)) {
result = (*env)->NewCharArray(env, len); result = (*env)->NewCharArray(env, len);
(*env)->SetCharArrayRegion(env, result, 0, len, (jchar*)chars); if (result != NULL) {
(*env)->SetCharArrayRegion(env, result, 0, len, (jchar*)chars);
}
} }
free(chars); free(chars);
} }
} }
CFRelease(csref);
} }
CFRelease(csref);
return result; return result;
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册