From 323813985b71c63c915cdfce5221fc65a2ad043d Mon Sep 17 00:00:00 2001 From: Naoto Sato Date: Mon, 30 Jan 2023 17:06:44 +0000 Subject: [PATCH] 8300916: Re-examine the initialization of JNU Charset in StaticProperty Reviewed-by: mchung, alanb --- .../share/classes/java/nio/charset/Charset.java | 13 ++++++------- .../classes/jdk/internal/util/StaticProperty.java | 15 +-------------- .../classes/java/lang/ProcessEnvironment.java | 15 +++++++-------- .../unix/classes/java/lang/ProcessImpl.java | 14 +++++++++----- 4 files changed, 23 insertions(+), 34 deletions(-) diff --git a/src/java.base/share/classes/java/nio/charset/Charset.java b/src/java.base/share/classes/java/nio/charset/Charset.java index da62c13b881..dbaa2a2f12d 100644 --- a/src/java.base/share/classes/java/nio/charset/Charset.java +++ b/src/java.base/share/classes/java/nio/charset/Charset.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,8 +27,9 @@ package java.nio.charset; import jdk.internal.misc.ThreadTracker; import jdk.internal.misc.VM; +import jdk.internal.util.StaticProperty; +import jdk.internal.vm.annotation.Stable; import sun.nio.cs.ThreadLocalCoders; -import sun.security.action.GetPropertyAction; import java.nio.ByteBuffer; import java.nio.CharBuffer; @@ -48,7 +49,6 @@ import java.util.ServiceLoader; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; -import java.util.jar.JarFile; /** @@ -628,7 +628,7 @@ public abstract class Charset }); } - private static volatile Charset defaultCharset; + private @Stable static Charset defaultCharset; /** * Returns the default charset of this Java virtual machine. @@ -651,9 +651,8 @@ public abstract class Charset public static Charset defaultCharset() { if (defaultCharset == null) { synchronized (Charset.class) { - String csn = GetPropertyAction - .privilegedGetProperty("file.encoding"); - Charset cs = lookup(csn); + // do not look for providers other than the standard one + Charset cs = standardProvider.charsetForName(StaticProperty.fileEncoding()); if (cs != null) defaultCharset = cs; else diff --git a/src/java.base/share/classes/jdk/internal/util/StaticProperty.java b/src/java.base/share/classes/jdk/internal/util/StaticProperty.java index 8460fbbd448..10d062f1ab8 100644 --- a/src/java.base/share/classes/jdk/internal/util/StaticProperty.java +++ b/src/java.base/share/classes/jdk/internal/util/StaticProperty.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,6 @@ package jdk.internal.util; import java.util.Properties; -import java.nio.charset.Charset; /** * System Property access for internal use only. @@ -54,7 +53,6 @@ public final class StaticProperty { private static final String FILE_ENCODING; private static final String JAVA_PROPERTIES_DATE; private static final String SUN_JNU_ENCODING; - private static final Charset jnuCharset; private static final String JAVA_LOCALE_USE_OLD_ISO_CODES; private StaticProperty() {} @@ -74,7 +72,6 @@ public final class StaticProperty { FILE_ENCODING = getProperty(props, "file.encoding"); JAVA_PROPERTIES_DATE = getProperty(props, "java.properties.date", null); SUN_JNU_ENCODING = getProperty(props, "sun.jnu.encoding"); - jnuCharset = Charset.forName(SUN_JNU_ENCODING, Charset.defaultCharset()); JAVA_LOCALE_USE_OLD_ISO_CODES = getProperty(props, "java.locale.useOldISOCodes", ""); } @@ -236,16 +233,6 @@ public final class StaticProperty { return SUN_JNU_ENCODING; } - /** - * {@return {@code Charset} for {@code sun.jnu.encoding} system property} - * - * If {@code sun.jnu.encoding} system property has invalid - * encoding name, {@link Charset#defaultCharset()} is returned. - */ - public static Charset jnuCharset() { - return jnuCharset; - } - /** * {@return the {@code java.locale.useOldISOCodes} system property} * diff --git a/src/java.base/unix/classes/java/lang/ProcessEnvironment.java b/src/java.base/unix/classes/java/lang/ProcessEnvironment.java index 802e5b6a6f0..d9aa774aa16 100644 --- a/src/java.base/unix/classes/java/lang/ProcessEnvironment.java +++ b/src/java.base/unix/classes/java/lang/ProcessEnvironment.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,10 +54,9 @@ package java.lang; -import java.io.*; -import java.nio.charset.Charset; import java.util.*; -import jdk.internal.util.StaticProperty; + +import static java.lang.ProcessImpl.JNU_CHARSET; final class ProcessEnvironment @@ -165,7 +164,7 @@ final class ProcessEnvironment } public static Variable valueOfQueryOnly(String str) { - return new Variable(str, str.getBytes(StaticProperty.jnuCharset())); + return new Variable(str, str.getBytes(JNU_CHARSET)); } public static Variable valueOf(String str) { @@ -174,7 +173,7 @@ final class ProcessEnvironment } public static Variable valueOf(byte[] bytes) { - return new Variable(new String(bytes, StaticProperty.jnuCharset()), bytes); + return new Variable(new String(bytes, JNU_CHARSET), bytes); } public int compareTo(Variable variable) { @@ -198,7 +197,7 @@ final class ProcessEnvironment } public static Value valueOfQueryOnly(String str) { - return new Value(str, str.getBytes(StaticProperty.jnuCharset())); + return new Value(str, str.getBytes(JNU_CHARSET)); } public static Value valueOf(String str) { @@ -207,7 +206,7 @@ final class ProcessEnvironment } public static Value valueOf(byte[] bytes) { - return new Value(new String(bytes, StaticProperty.jnuCharset()), bytes); + return new Value(new String(bytes, JNU_CHARSET), bytes); } public int compareTo(Value value) { diff --git a/src/java.base/unix/classes/java/lang/ProcessImpl.java b/src/java.base/unix/classes/java/lang/ProcessImpl.java index 4edb4ce7bfe..898ec9f398c 100644 --- a/src/java.base/unix/classes/java/lang/ProcessImpl.java +++ b/src/java.base/unix/classes/java/lang/ProcessImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -69,6 +69,10 @@ final class ProcessImpl extends Process { // Linux platforms support a normal (non-forcible) kill signal. static final boolean SUPPORTS_NORMAL_TERMINATION = true; + // Cache for JNU Charset. The encoding name is guaranteed + // to be supported in this environment. + static final Charset JNU_CHARSET = Charset.forName(StaticProperty.jnuEncoding()); + private final int pid; private final ProcessHandleImpl processHandle; private int exitcode; @@ -114,11 +118,11 @@ final class ProcessImpl extends Process { LaunchMechanism lm; if (s == null) { lm = defaultLaunchMechanism; - s = lm.name().toLowerCase(Locale.ENGLISH); + s = lm.name().toLowerCase(Locale.ROOT); } else { try { lm = LaunchMechanism.valueOf( - s.toUpperCase(Locale.ENGLISH)); + s.toUpperCase(Locale.ROOT)); } catch (IllegalArgumentException e) { lm = null; } @@ -152,7 +156,7 @@ final class ProcessImpl extends Process { private static byte[] toCString(String s) { if (s == null) return null; - byte[] bytes = s.getBytes(StaticProperty.jnuCharset()); + byte[] bytes = s.getBytes(JNU_CHARSET); byte[] result = new byte[bytes.length + 1]; System.arraycopy(bytes, 0, result, 0, @@ -176,7 +180,7 @@ final class ProcessImpl extends Process { byte[][] args = new byte[cmdarray.length-1][]; int size = args.length; // For added NUL bytes for (int i = 0; i < args.length; i++) { - args[i] = cmdarray[i+1].getBytes(StaticProperty.jnuCharset()); + args[i] = cmdarray[i+1].getBytes(JNU_CHARSET); size += args[i].length; } byte[] argBlock = new byte[size];