RFR: 8303814: getLastErrorString should avoid charset conversions

Roger Riggs rriggs at openjdk.org
Fri Mar 10 22:05:16 UTC 2023


On Wed, 8 Mar 2023 11:30:27 GMT, Daniel Jeliński <djelinski at openjdk.org> wrote:

> This patch modifies the `getLastErrorString` method to return a `jstring`. Thanks to that we can avoid unnecessary back and forth conversions between Unicode and other charsets on Windows.
> 
> Other changes include:
> - the Windows implementation of `getLastErrorString` no longer checks `errno`. I verified all uses of the method and confirmed that `errno` is not used anywhere. 
> - While at it, I found and fixed a few calls to `JNU_ThrowIOExceptionWithLastError` that were done in context where `LastError` was not set.
> - jdk.hotspot.agent was modified to use `JNU_ThrowByNameWithLastError` and `JNU_ThrowByName` instead of `getLastErrorString`; the code is expected to have identical behavior.
> - zip_util was modified to return static messages instead of generated ones. The generated messages were not observed anywhere, because they were replaced by a static message in ZIP_Open, which is the only method used by other native code.
> - `getLastErrorString` is no longer exported by libjava.
> 
> Tier1-3 tests continue to pass.
> 
> No new automated regression test; testing this requires installing a language pack that cannot be displayed in the current code page.
> Tested this manually by installing Chinese language pack on English Windows 11, selecting Chinese language, then checking if the message on exception thrown by `InetAddress.getByName("nonexistent.local");` starts with `"不知道这样的主机。"` (or `"\u4e0d\u77e5\u9053\u8fd9\u6837\u7684\u4e3b\u673a\u3002"`). Without the change, the exception message started with a row of question marks.

src/java.base/share/native/libjava/jni_util.c line 133:

> 131:     if (s != NULL) {
> 132:         jobject x = NULL;
> 133:         if (messagelen) {

Avoid implicit compare with 0; use `messagelen > 0` or similar.

src/java.base/share/native/libjava/jni_util.c line 137:

> 135:             size_t messageextlen = messagelen + 4;
> 136:             char *str1 = (char *)malloc((messageextlen) * sizeof(char));
> 137:             if (str1 == 0) {

Use NULL when comparing to a pointer.

src/java.base/unix/native/libjava/jni_util_md.c line 69:

> 67:     if (errno == 0) return NULL;
> 68:     getErrorString(errno, buf, sizeof(buf));
> 69:     return (*buf) ? JNU_NewStringPlatform(env, buf) : NULL;

I would have used `buf[0] != 0` since its declared as a local buffer; but this file doesn't have much of a style to follow.

-------------

PR: https://git.openjdk.org/jdk/pull/12922


More information about the serviceability-dev mailing list