RFR: 8285517: System.getenv() returns unexpected value if environment variable has non ASCII character

Roger Riggs rriggs at openjdk.java.net
Wed Apr 27 17:56:59 UTC 2022


On Sun, 24 Apr 2022 09:18:54 GMT, Ichiroh Takiguchi <itakiguchi at openjdk.org> wrote:

> On JDK19 with Linux ja_JP.eucjp locale,
> System.getenv() returns unexpected value if environment variable has Japanese EUC characters.
> It seems this issue happens because of JEP 400.
> Arguments for ProcessBuilder have same kind of issue.

src/java.base/unix/classes/java/lang/ProcessEnvironment.java line 68:

> 66:     private static final Map<String,String> theUnmodifiableEnvironment;
> 67:     static final int MIN_NAME_LENGTH = 0;
> 68:     static final Charset cs = Charset.forName(StaticProperty.nativeEncoding(),

cs should have an all-CAPS name to make it clear its a static value throughout the implementation.
And `private` too.

test/jdk/java/lang/System/i18nEnvArg.java line 41:

> 39: 
> 40: public class i18nEnvArg {
> 41:     final static String text = "\u6F22\u5B57";

Can this be renamed to indicate it is the string under test?  like KANJI_TEXT or EUC_JP_TEXT or similar.

test/jdk/java/lang/System/i18nEnvArg.java line 49:

> 47:     final static int maxSize = 4096;
> 48: 
> 49:     public static void main(String[] args) throws Exception {

There are 3 main()'s in this test; it would be useful to add a comment indicating the purpose of each.

test/jdk/java/lang/System/i18nEnvArg.java line 60:

> 58:         Process p = pb.start();
> 59:         InputStream is = p.getInputStream();
> 60:         byte[] ba = new byte[maxSize];

You can use `InputStream.readAllBytes()` here to return a byte buffer.

Its not clear why all the bytes are read?  I assume its only for a possible error from the child.

test/jdk/java/lang/System/i18nEnvArg.java line 128:

> 126:             Method enviorn_mid = cls.getDeclaredMethod("environ");
> 127:             enviorn_mid.setAccessible(true);
> 128:             byte[][] environ = (byte[][]) enviorn_mid.invoke(null,

typo: "enviorn_mid" -> "environ_mid".

test/jdk/java/lang/System/i18nEnvArg.java line 138:

> 136:                 bb.put(environ[i+1]);
> 137:                 byte[] envb = Arrays.copyOf(ba, bb.position());
> 138:                 if (Arrays.equals(kanji, envb)) return;

It seems odd to exit the loop on the first match.

I think AIX always has environment variables not set by the caller.

test/jdk/java/lang/System/i18nEnvArg.java line 146:

> 144:                         sb.append((char)b);
> 145:                     } else {
> 146:                         sb.append(String.format("\\x%02X", (int)b & 0xFF));

The methods of java.util.HexFormat may be useful here.
It seems that the "5C" would fit into this "else" clause and not need a separate statement.

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

PR: https://git.openjdk.java.net/jdk/pull/8378


More information about the core-libs-dev mailing list