RFR: 8275007: Java fails to start with null charset if LC_ALL is set to certain locales

Naoto Sato naoto at openjdk.java.net
Wed Nov 10 17:26:34 UTC 2021


On Wed, 10 Nov 2021 03:31:11 GMT, Ichiroh Takiguchi <itakiguchi at openjdk.org> wrote:

>>> There may be an argument that the JDK should emit a warning at startup.
>> 
>> Updated to emit a warning, if `sun.jnu.encoding` is not supported.
>
> Hello @naotoj .
> I appreciate your code update.
> I'd like to confirm one thing.
> If you could not recreate this issue on your test machine, please ignore this message.
> 
> I tested your code on my CentOS7 x86_64.
> I saw following exception.
> 
> $ git log --oneline | head
> e91e9d85327 8276721: G1: Refine G1EvacFailureObjectsSet::iterate
> 8822d41fdcc 8274736: Concurrent read/close of SSLSockets causes SSLSessions to be invalidated unnecessarily
> c1e41fe38bb 8276842: G1: Only calculate size in bytes from words when needed
> c8b0ee6b8a0 8276833: G1: Make G1EvacFailureRegions::par_iterate const
> 0699220830a 8268882: C2: assert(n->outcnt() != 0 || C->top() == n || n->is_Proj()) failed: No dead instructions after post-alloc
> d7012fbd604 8276880: Remove java/lang/RuntimeTests/exec/ExecWithDir as unnecessary
> f9024d0606e 8230130: javadoc search result dialog shows cut off headers for long results
> 055de6f5662 8223358: Incorrect HTML structure in annotation pages
> a60e91259ba 8198626: java/awt/KeyboardFocusmanager/TypeAhead/TestDialogTypeAhead.html fails on mac
> dde959dfcef 8276808: java/nio/channels/Channels/TransferTo.java timed out
> $ git status -s
>  M src/java.base/share/classes/java/lang/System.java
>  M src/java.base/share/classes/sun/nio/fs/Util.java
>  M src/java.base/share/native/libjava/jni_util.c
> ?? 8275007.patch
> ?? Hello.java
> $ cat Hello.java
> public class Hello {
>   public static void main(String[] args) throws Exception {
>     System.out.println("Hello");
>   }
> }
> $ env LC_ALL=kk_KZ.pt154 locale
> LANG=ja_JP.UTF-8
> LC_CTYPE="kk_KZ.pt154"
> LC_NUMERIC="kk_KZ.pt154"
> LC_TIME="kk_KZ.pt154"
> LC_COLLATE="kk_KZ.pt154"
> LC_MONETARY="kk_KZ.pt154"
> LC_MESSAGES="kk_KZ.pt154"
> LC_PAPER="kk_KZ.pt154"
> LC_NAME="kk_KZ.pt154"
> LC_ADDRESS="kk_KZ.pt154"
> LC_TELEPHONE="kk_KZ.pt154"
> LC_MEASUREMENT="kk_KZ.pt154"
> LC_IDENTIFICATION="kk_KZ.pt154"
> LC_ALL=kk_KZ.pt154
> $ env LC_ALL=kk_KZ.pt154 ./build/linux-x86_64-server-release/images/jdk/bin/java Hello.java
> WARNING: The encoding of the underlying platform's file system is not supported by the JVM: PT154
> Error: A JNI error has occurred, please check your installation and try again
> Exception in thread "main" java.util.ServiceConfigurationError: java.nio.charset.spi.CharsetProvider: Unable to load sun.nio.cs.ext.ExtendedCharsets
> 	at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:586)
> 	at java.base/java.util.ServiceLoader.loadProvider(ServiceLoader.java:861)
> 	at java.base/java.util.ServiceLoader$ModuleServicesLookupIterator.hasNext(ServiceLoader.java:1084)
> 	at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1309)
> 	at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1393)
> 	at java.base/java.nio.charset.Charset$ExtendedProviderHolder$1.run(Charset.java:428)
> 	at java.base/java.nio.charset.Charset$ExtendedProviderHolder$1.run(Charset.java:422)
> 	at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
> 	at java.base/java.nio.charset.Charset$ExtendedProviderHolder.extendedProviders(Charset.java:422)
> 	at java.base/java.nio.charset.Charset$ExtendedProviderHolder.<clinit>(Charset.java:418)
> 	at java.base/java.nio.charset.Charset.lookupExtendedCharset(Charset.java:442)
> 	at java.base/java.nio.charset.Charset.lookup2(Charset.java:472)
> 	at java.base/java.nio.charset.Charset.lookup(Charset.java:460)
> 	at java.base/java.nio.charset.Charset.isSupported(Charset.java:501)
> 	at java.base/sun.launcher.LauncherHelper.makePlatformString(LauncherHelper.java:891)
> Caused by: java.lang.ExceptionInInitializerError
> 	at java.base/sun.nio.fs.UnixFileSystem.<init>(UnixFileSystem.java:51)
> 	at java.base/sun.nio.fs.LinuxFileSystem.<init>(LinuxFileSystem.java:39)
> 	at java.base/sun.nio.fs.LinuxFileSystemProvider.newFileSystem(LinuxFileSystemProvider.java:46)
> 	at java.base/sun.nio.fs.LinuxFileSystemProvider.newFileSystem(LinuxFileSystemProvider.java:39)
> 	at java.base/sun.nio.fs.UnixFileSystemProvider.<init>(UnixFileSystemProvider.java:55)
> 	at java.base/sun.nio.fs.LinuxFileSystemProvider.<init>(LinuxFileSystemProvider.java:41)
> 	at java.base/sun.nio.fs.DefaultFileSystemProvider.<clinit>(DefaultFileSystemProvider.java:35)
> 	at java.base/java.nio.file.FileSystems$DefaultFileSystemHolder.getDefaultProvider(FileSystems.java:114)
> 	at java.base/java.nio.file.FileSystems$DefaultFileSystemHolder$1.run(FileSystems.java:103)
> 	at java.base/java.nio.file.FileSystems$DefaultFileSystemHolder$1.run(FileSystems.java:101)
> 	at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
> 	at java.base/java.nio.file.FileSystems$DefaultFileSystemHolder.defaultFileSystem(FileSystems.java:101)
> 	at java.base/java.nio.file.FileSystems$DefaultFileSystemHolder.<clinit>(FileSystems.java:94)
> 	at java.base/java.nio.file.FileSystems.getDefault(FileSystems.java:183)
> 	at java.base/java.nio.file.Path.of(Path.java:147)
> 	at java.base/java.nio.file.Paths.get(Paths.java:69)
> 	at java.base/jdk.internal.jimage.ImageReaderFactory.<clinit>(ImageReaderFactory.java:51)
> 	at java.base/jdk.internal.module.SystemModuleFinders$SystemImage.<clinit>(SystemModuleFinders.java:385)
> 	at java.base/jdk.internal.module.SystemModuleFinders$SystemModuleReader.findImageLocation(SystemModuleFinders.java:429)
> 	at java.base/jdk.internal.module.SystemModuleFinders$SystemModuleReader.read(SystemModuleFinders.java:483)
> 	at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:809)
> 	at java.base/jdk.internal.loader.BuiltinClassLoader.findClassInModuleOrNull(BuiltinClassLoader.java:741)
> 	at java.base/jdk.internal.loader.BuiltinClassLoader.findClass(BuiltinClassLoader.java:621)
> 	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:633)
> 	at java.base/java.lang.Class.forName(Class.java:577)
> 	at java.base/java.lang.Class.forName(Class.java:552)
> 	at java.base/java.util.ServiceLoader.loadProvider(ServiceLoader.java:859)
> 	... 13 more
> Caused by: java.lang.NullPointerException: Cannot read the array length because "<local2>" is null
> 	at java.base/java.nio.charset.Charset.lookupExtendedCharset(Charset.java:443)
> 	at java.base/java.nio.charset.Charset.lookup2(Charset.java:472)
> 	at java.base/java.nio.charset.Charset.lookup(Charset.java:460)
> 	at java.base/java.nio.charset.Charset.forName(Charset.java:556)
> 	at java.base/sun.nio.fs.Util.<clinit>(Util.java:41)
> 	... 40 more

@takiguc, thank you for trying out the fix and informing us of the issue. I've been using Oracle Linux 7.6 with the same locale setting as yours, but I've never seen that failure. Will need to recreate the error and investigate.

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

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


More information about the core-libs-dev mailing list