< prev index next >

src/java.base/windows/native/libjava/WinNTFileSystem_md.c

Print this page
rev 52921 : 8211752: JNU_ThrowIOExceptionWithLastErrorAndPath - enhance some IOExceptions with path causing the issue

*** 76,85 **** --- 76,104 ---- GetFinalPathNameByHandle_func = (GetFinalPathNameByHandleProc) GetProcAddress(handle, "GetFinalPathNameByHandleW"); } } + static int extendExceptionsWithPath = -1; + + static int checkExtendExceptionsWithPath(JNIEnv *env) { + if (extendExceptionsWithPath == -1) { + jclass cls = (*env)->FindClass(env, "java/io/FileSystem"); + if (cls == NULL) return -1; + jmethodID hasPathInExceptionsMethod = (*env)->GetStaticMethodID(env, cls, + "hasPathInExceptions", "()Z"); + if (hasPathInExceptionsMethod == NULL) return -1; + jboolean res = (*env)->CallStaticBooleanMethod(env, cls, hasPathInExceptionsMethod); + if (res == JNI_TRUE) { + extendExceptionsWithPath = 1; + } else { + extendExceptionsWithPath = 0; + } + } + return extendExceptionsWithPath; + } + /* -- Path operations -- */ extern int wcanonicalize(const WCHAR *path, WCHAR *out, int len); extern int wcanonicalizeWithPrefix(const WCHAR *canonicalPrefix, const WCHAR *pathWithCanonicalPrefix, WCHAR *out, int len);
*** 254,265 **** --- 273,290 ---- } else if (wcanonicalize(path, canonicalPath, MAX_PATH_LENGTH) >= 0) { rv = (*env)->NewString(env, canonicalPath, (jsize)wcslen(canonicalPath)); } } END_UNICODE_STRING(env, path); if (rv == NULL && !(*env)->ExceptionCheck(env)) { + if (checkExtendExceptionsWithPath(env) == 1) { + WITH_PLATFORM_STRING(env, pathname, pathstr) { + JNU_ThrowByNameWithTwoMessagesAndLastError(env, "java/io/IOException", "Bad pathname", pathstr); + } END_PLATFORM_STRING(env, pathstr); + } else { JNU_ThrowIOExceptionWithLastError(env, "Bad pathname"); } + } return rv; } JNIEXPORT jstring JNICALL
*** 290,301 **** --- 315,332 ---- rv = (*env)->NewString(env, canonicalPath, (jsize)wcslen(canonicalPath)); } } END_UNICODE_STRING(env, pathWithCanonicalPrefix); } END_UNICODE_STRING(env, canonicalPrefix); if (rv == NULL && !(*env)->ExceptionCheck(env)) { + if (checkExtendExceptionsWithPath(env) == 1) { + WITH_PLATFORM_STRING(env, pathWithCanonicalPrefixString, path) { + JNU_ThrowByNameWithTwoMessagesAndLastError(env, "java/io/IOException", "Bad pathname", path); + } END_PLATFORM_STRING(env, path); + } else { JNU_ThrowIOExceptionWithLastError(env, "Bad pathname"); } + } return rv; } /* -- Attribute accessors -- */
*** 582,594 **** --- 613,631 ---- // return false rather than throwing an exception when there is // an existing file. DWORD a = GetFileAttributesW(pathbuf); if (a == INVALID_FILE_ATTRIBUTES) { SetLastError(error); + if (checkExtendExceptionsWithPath(env) == 1) { + WITH_PLATFORM_STRING(env, path, pathstr) { + JNU_ThrowByNameWithTwoMessagesAndLastError(env, "java/io/IOException", "Could not open file", pathstr); + } END_PLATFORM_STRING(env, pathstr); + } else { JNU_ThrowIOExceptionWithLastError(env, "Could not open file"); } } + } free(pathbuf); return JNI_FALSE; } free(pathbuf); CloseHandle(h);
< prev index next >