RFR: 8349254: Disable "best-fit" mapping on Windows environment variables [v2]

Justin Lu jlu at openjdk.org
Fri Feb 7 19:21:14 UTC 2025


On Fri, 7 Feb 2025 18:32:26 GMT, Naoto Sato <naoto at openjdk.org> wrote:

>> This is a follow-on fix to [JDK-8337506](https://bugs.openjdk.org/browse/JDK-8337506). The Java launcher can take arguments from "JDK_JAVA_OPTIONS" environment variable, so the same processing is needed. Also, obsolete code for Windows 9x has been removed.
>
> Naoto Sato has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Reflects review

Logic to get the UTF-16 string env value, and map back to a code page string looks good to me. All conversions are done with the `WC_NO_BEST_FIT_CHARS` flag, so indeed there should be no best-fit mappings done. All the failure checks on the return values of `MultiByteToWideChar` and `WideCharToMultiByte` look appropriate as well.

I left a few comments.

src/java.base/share/native/libjli/args.c line 603:

> 601: /*
> 602:  * getenv() without best-fit mapping
> 603:  */

I think a quick comment that says something along the lines of 


env variable name: code page -> UTF-16 
variable value : UTF-16 -> code page


would be helpful to overview what is happening here.

src/java.base/share/native/libjli/args.c line 611:

> 609:         LPWSTR wcVarName = JLI_MemAlloc(wcCount * sizeof(wchar_t));
> 610:         if (MultiByteToWideChar(CP_ACP, 0, var_name, -1, wcVarName, wcCount) != 0) {
> 611:             LPWSTR wcEnvVar = _wgetenv(wcVarName);

Since we are in Windows specific code, would it make sense to call `GetEnvironmentVariableW` over `_wgetenv`? It won't be as concise since we will have to follow the 2-call style of determining the size, then filling the buffer; but I presume it avoids some overhead, since it's directly apart of the Win32 API? I am also guessing it's the convention for Windows native code, although I'm not fully sure.

test/jdk/tools/launcher/DisableBestFitMappingTest.java line 32:

> 30:  * @requires (os.family == "windows")
> 31:  * @library /test/lib
> 32:  * @run junit DisableBestFitMappingTest

I think it might be best to re-write this test as a non Junit test. Through IntelliJ it's hard to run this test, I presume because of the combination of it being a Junit test and having a `main` method? If I run the 'launcher' suite of tests, this test does not seem to be included.

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

PR Review: https://git.openjdk.org/jdk/pull/23498#pullrequestreview-2602530119
PR Review Comment: https://git.openjdk.org/jdk/pull/23498#discussion_r1947013548
PR Review Comment: https://git.openjdk.org/jdk/pull/23498#discussion_r1946999296
PR Review Comment: https://git.openjdk.org/jdk/pull/23498#discussion_r1947024510


More information about the core-libs-dev mailing list