# HG changeset patch # User sherman # Date 1530117918 25200 # Node ID 31dfb7a229ba473055180eb2c3132e1856f6b681 # Parent 35f52a3cd6bd65fc68abbda64b8eff5ae85102c6 8200243: System error message is decoded as invalid encoding in Windows. Reviewed-by: alanb diff -r 35f52a3cd6bd -r 31dfb7a229ba src/java.base/windows/native/libjava/jni_util_md.c --- a/src/java.base/windows/native/libjava/jni_util_md.c Wed Jun 27 09:31:51 2018 -0700 +++ b/src/java.base/windows/native/libjava/jni_util_md.c Wed Jun 27 09:45:18 2018 -0700 @@ -75,73 +75,33 @@ } JNIEXPORT size_t JNICALL -getLastErrorString(char *utf8_jvmErrorMsg, size_t cbErrorMsg) -{ - size_t n = 0; - if (cbErrorMsg > 0) { - BOOLEAN noError = FALSE; - WCHAR *utf16_osErrorMsg = (WCHAR *)malloc(cbErrorMsg*sizeof(WCHAR)); - if (utf16_osErrorMsg == NULL) { - // OOM accident - strncpy(utf8_jvmErrorMsg, "Out of memory", cbErrorMsg); - // truncate if too long - utf8_jvmErrorMsg[cbErrorMsg - 1] = '\0'; - n = strlen(utf8_jvmErrorMsg); - } else { - DWORD errval = GetLastError(); - if (errval != 0) { - // WIN32 error - n = (size_t)FormatMessageW( - FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - errval, - 0, - utf16_osErrorMsg, - (DWORD)cbErrorMsg, - NULL); - if (n > 3) { - // Drop final '.', CR, LF - if (utf16_osErrorMsg[n - 1] == L'\n') --n; - if (utf16_osErrorMsg[n - 1] == L'\r') --n; - if (utf16_osErrorMsg[n - 1] == L'.') --n; - utf16_osErrorMsg[n] = L'\0'; - } - } else if (errno != 0) { - // C runtime error that has no corresponding WIN32 error code - int ret = _wcserror_s(utf16_osErrorMsg, cbErrorMsg, errno); - if (ret == 0) - n = wcslen(utf16_osErrorMsg); - } else - noError = TRUE; //OS has no error to report +getLastErrorString(char *buf, size_t len) { + + DWORD errval; - if (!noError) { - if (n > 0) { - n = WideCharToMultiByte( - CP_UTF8, - 0, - utf16_osErrorMsg, - (int)n, - utf8_jvmErrorMsg, - (int)cbErrorMsg, - NULL, - NULL); + if ((errval = GetLastError()) != 0) { + // DOS error + size_t n = (size_t)FormatMessage( + FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + errval, + 0, + buf, + (DWORD)len, + NULL); + if (n > 3) { + // Drop final '.', CR, LF + if (buf[n - 1] == '\n') n--; + if (buf[n - 1] == '\r') n--; + if (buf[n - 1] == '.') n--; + buf[n] = '\0'; + } + return n; + } - // no way to die - if (n > 0) - utf8_jvmErrorMsg[min(cbErrorMsg - 1, n)] = '\0'; - } - - if (n <= 0) { - strncpy(utf8_jvmErrorMsg, "Secondary error while OS message extraction", cbErrorMsg); - // truncate if too long - utf8_jvmErrorMsg[cbErrorMsg - 1] = '\0'; - n = strlen(utf8_jvmErrorMsg); - } - } - free(utf16_osErrorMsg); - } - } - return n; + // C runtime error that has no corresponding DOS error code + if (errno == 0 || len < 1) return 0; + return strerror_s(buf, len, errno); } JNIEXPORT int JNICALL