8300916: Re-examine the initialization of JNU Charset in StaticProperty
Reviewed-by: mchung, alanb
This commit is contained in:
parent
f4592b1471
commit
323813985b
@ -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.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* 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.ThreadTracker;
|
||||||
import jdk.internal.misc.VM;
|
import jdk.internal.misc.VM;
|
||||||
|
import jdk.internal.util.StaticProperty;
|
||||||
|
import jdk.internal.vm.annotation.Stable;
|
||||||
import sun.nio.cs.ThreadLocalCoders;
|
import sun.nio.cs.ThreadLocalCoders;
|
||||||
import sun.security.action.GetPropertyAction;
|
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.nio.CharBuffer;
|
import java.nio.CharBuffer;
|
||||||
@ -48,7 +49,6 @@ import java.util.ServiceLoader;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.SortedMap;
|
import java.util.SortedMap;
|
||||||
import java.util.TreeMap;
|
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.
|
* Returns the default charset of this Java virtual machine.
|
||||||
@ -651,9 +651,8 @@ public abstract class Charset
|
|||||||
public static Charset defaultCharset() {
|
public static Charset defaultCharset() {
|
||||||
if (defaultCharset == null) {
|
if (defaultCharset == null) {
|
||||||
synchronized (Charset.class) {
|
synchronized (Charset.class) {
|
||||||
String csn = GetPropertyAction
|
// do not look for providers other than the standard one
|
||||||
.privilegedGetProperty("file.encoding");
|
Charset cs = standardProvider.charsetForName(StaticProperty.fileEncoding());
|
||||||
Charset cs = lookup(csn);
|
|
||||||
if (cs != null)
|
if (cs != null)
|
||||||
defaultCharset = cs;
|
defaultCharset = cs;
|
||||||
else
|
else
|
||||||
|
@ -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.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -26,7 +26,6 @@
|
|||||||
package jdk.internal.util;
|
package jdk.internal.util;
|
||||||
|
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.nio.charset.Charset;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* System Property access for internal use only.
|
* 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 FILE_ENCODING;
|
||||||
private static final String JAVA_PROPERTIES_DATE;
|
private static final String JAVA_PROPERTIES_DATE;
|
||||||
private static final String SUN_JNU_ENCODING;
|
private static final String SUN_JNU_ENCODING;
|
||||||
private static final Charset jnuCharset;
|
|
||||||
private static final String JAVA_LOCALE_USE_OLD_ISO_CODES;
|
private static final String JAVA_LOCALE_USE_OLD_ISO_CODES;
|
||||||
|
|
||||||
private StaticProperty() {}
|
private StaticProperty() {}
|
||||||
@ -74,7 +72,6 @@ public final class StaticProperty {
|
|||||||
FILE_ENCODING = getProperty(props, "file.encoding");
|
FILE_ENCODING = getProperty(props, "file.encoding");
|
||||||
JAVA_PROPERTIES_DATE = getProperty(props, "java.properties.date", null);
|
JAVA_PROPERTIES_DATE = getProperty(props, "java.properties.date", null);
|
||||||
SUN_JNU_ENCODING = getProperty(props, "sun.jnu.encoding");
|
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", "");
|
JAVA_LOCALE_USE_OLD_ISO_CODES = getProperty(props, "java.locale.useOldISOCodes", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,16 +233,6 @@ public final class StaticProperty {
|
|||||||
return SUN_JNU_ENCODING;
|
return SUN_JNU_ENCODING;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* {@return {@code Charset} for {@code sun.jnu.encoding} system property}
|
|
||||||
*
|
|
||||||
* <strong>If {@code sun.jnu.encoding} system property has invalid
|
|
||||||
* encoding name, {@link Charset#defaultCharset()} is returned.</strong>
|
|
||||||
*/
|
|
||||||
public static Charset jnuCharset() {
|
|
||||||
return jnuCharset;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@return the {@code java.locale.useOldISOCodes} system property}
|
* {@return the {@code java.locale.useOldISOCodes} system property}
|
||||||
*
|
*
|
||||||
|
@ -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.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -54,10 +54,9 @@
|
|||||||
|
|
||||||
package java.lang;
|
package java.lang;
|
||||||
|
|
||||||
import java.io.*;
|
|
||||||
import java.nio.charset.Charset;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import jdk.internal.util.StaticProperty;
|
|
||||||
|
import static java.lang.ProcessImpl.JNU_CHARSET;
|
||||||
|
|
||||||
|
|
||||||
final class ProcessEnvironment
|
final class ProcessEnvironment
|
||||||
@ -165,7 +164,7 @@ final class ProcessEnvironment
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Variable valueOfQueryOnly(String str) {
|
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) {
|
public static Variable valueOf(String str) {
|
||||||
@ -174,7 +173,7 @@ final class ProcessEnvironment
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Variable valueOf(byte[] bytes) {
|
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) {
|
public int compareTo(Variable variable) {
|
||||||
@ -198,7 +197,7 @@ final class ProcessEnvironment
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Value valueOfQueryOnly(String str) {
|
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) {
|
public static Value valueOf(String str) {
|
||||||
@ -207,7 +206,7 @@ final class ProcessEnvironment
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Value valueOf(byte[] bytes) {
|
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) {
|
public int compareTo(Value value) {
|
||||||
|
@ -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.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* 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.
|
// Linux platforms support a normal (non-forcible) kill signal.
|
||||||
static final boolean SUPPORTS_NORMAL_TERMINATION = true;
|
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 int pid;
|
||||||
private final ProcessHandleImpl processHandle;
|
private final ProcessHandleImpl processHandle;
|
||||||
private int exitcode;
|
private int exitcode;
|
||||||
@ -114,11 +118,11 @@ final class ProcessImpl extends Process {
|
|||||||
LaunchMechanism lm;
|
LaunchMechanism lm;
|
||||||
if (s == null) {
|
if (s == null) {
|
||||||
lm = defaultLaunchMechanism;
|
lm = defaultLaunchMechanism;
|
||||||
s = lm.name().toLowerCase(Locale.ENGLISH);
|
s = lm.name().toLowerCase(Locale.ROOT);
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
lm = LaunchMechanism.valueOf(
|
lm = LaunchMechanism.valueOf(
|
||||||
s.toUpperCase(Locale.ENGLISH));
|
s.toUpperCase(Locale.ROOT));
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
lm = null;
|
lm = null;
|
||||||
}
|
}
|
||||||
@ -152,7 +156,7 @@ final class ProcessImpl extends Process {
|
|||||||
private static byte[] toCString(String s) {
|
private static byte[] toCString(String s) {
|
||||||
if (s == null)
|
if (s == null)
|
||||||
return null;
|
return null;
|
||||||
byte[] bytes = s.getBytes(StaticProperty.jnuCharset());
|
byte[] bytes = s.getBytes(JNU_CHARSET);
|
||||||
byte[] result = new byte[bytes.length + 1];
|
byte[] result = new byte[bytes.length + 1];
|
||||||
System.arraycopy(bytes, 0,
|
System.arraycopy(bytes, 0,
|
||||||
result, 0,
|
result, 0,
|
||||||
@ -176,7 +180,7 @@ final class ProcessImpl extends Process {
|
|||||||
byte[][] args = new byte[cmdarray.length-1][];
|
byte[][] args = new byte[cmdarray.length-1][];
|
||||||
int size = args.length; // For added NUL bytes
|
int size = args.length; // For added NUL bytes
|
||||||
for (int i = 0; i < args.length; i++) {
|
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;
|
size += args[i].length;
|
||||||
}
|
}
|
||||||
byte[] argBlock = new byte[size];
|
byte[] argBlock = new byte[size];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user