From 318888339bdc2ee6a632e4850a980d91bff79e79 Mon Sep 17 00:00:00 2001 From: jyxzwd <978344408@qq.com> Date: Thu, 17 Oct 2024 11:33:54 +0800 Subject: [PATCH 1/3] 8331467: Fix JDK-8331467 ImageReaderFactory can cause a ClassNotFoundException if the default FileSystemProvider is not the system-default provider --- .../aix/classes/sun/nio/fs/DefaultFileSystemProvider.java | 8 ++++++++ .../classes/sun/nio/fs/DefaultFileSystemProvider.java | 8 ++++++++ .../classes/sun/nio/fs/DefaultFileSystemProvider.java | 8 ++++++++ .../classes/jdk/internal/jimage/ImageReaderFactory.java | 2 +- .../classes/sun/nio/fs/DefaultFileSystemProvider.java | 8 ++++++++ 5 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/java.base/aix/classes/sun/nio/fs/DefaultFileSystemProvider.java b/src/java.base/aix/classes/sun/nio/fs/DefaultFileSystemProvider.java index 5bc5b88254273..bacbf642b0f81 100644 --- a/src/java.base/aix/classes/sun/nio/fs/DefaultFileSystemProvider.java +++ b/src/java.base/aix/classes/sun/nio/fs/DefaultFileSystemProvider.java @@ -50,4 +50,12 @@ public static AixFileSystemProvider instance() { public static FileSystem theFileSystem() { return INSTANCE.theFileSystem(); } + + /** + * This method is from java8 API to be compatible against runtime. + * Returns the default FileSystemProvider. + */ + public static FileSystemProvider create() { + return INSTANCE; + } } diff --git a/src/java.base/linux/classes/sun/nio/fs/DefaultFileSystemProvider.java b/src/java.base/linux/classes/sun/nio/fs/DefaultFileSystemProvider.java index 17afe262fe0b6..74c0d28b0a9ff 100644 --- a/src/java.base/linux/classes/sun/nio/fs/DefaultFileSystemProvider.java +++ b/src/java.base/linux/classes/sun/nio/fs/DefaultFileSystemProvider.java @@ -50,4 +50,12 @@ public static LinuxFileSystemProvider instance() { public static FileSystem theFileSystem() { return INSTANCE.theFileSystem(); } + + /** + * This method is from java8 API to be compatible against runtime. + * Returns the default FileSystemProvider. + */ + public static FileSystemProvider create() { + return INSTANCE; + } } diff --git a/src/java.base/macosx/classes/sun/nio/fs/DefaultFileSystemProvider.java b/src/java.base/macosx/classes/sun/nio/fs/DefaultFileSystemProvider.java index acb95b93cc89d..7665fc137e5ff 100644 --- a/src/java.base/macosx/classes/sun/nio/fs/DefaultFileSystemProvider.java +++ b/src/java.base/macosx/classes/sun/nio/fs/DefaultFileSystemProvider.java @@ -50,4 +50,12 @@ public static MacOSXFileSystemProvider instance() { public static FileSystem theFileSystem() { return INSTANCE.theFileSystem(); } + + /** + * This method is from java8 API to be compatible against runtime. + * Returns the default FileSystemProvider. + */ + public static FileSystemProvider create() { + return INSTANCE; + } } diff --git a/src/java.base/share/classes/jdk/internal/jimage/ImageReaderFactory.java b/src/java.base/share/classes/jdk/internal/jimage/ImageReaderFactory.java index 24ac9bfc18aff..01e9473af7e3f 100644 --- a/src/java.base/share/classes/jdk/internal/jimage/ImageReaderFactory.java +++ b/src/java.base/share/classes/jdk/internal/jimage/ImageReaderFactory.java @@ -48,7 +48,7 @@ private ImageReaderFactory() {} private static final String JAVA_HOME = System.getProperty("java.home"); private static final Path BOOT_MODULES_JIMAGE = - Paths.get(JAVA_HOME, "lib", "modules"); + sun.nio.fs.DefaultFileSystemProvider.create().getPath(JAVA_HOME, "lib", "modules"); private static final Map readers = new ConcurrentHashMap<>(); diff --git a/src/java.base/windows/classes/sun/nio/fs/DefaultFileSystemProvider.java b/src/java.base/windows/classes/sun/nio/fs/DefaultFileSystemProvider.java index bee8a08ee460b..b679e839df0dc 100644 --- a/src/java.base/windows/classes/sun/nio/fs/DefaultFileSystemProvider.java +++ b/src/java.base/windows/classes/sun/nio/fs/DefaultFileSystemProvider.java @@ -49,4 +49,12 @@ public static WindowsFileSystemProvider instance() { public static FileSystem theFileSystem() { return INSTANCE.theFileSystem(); } + + /** + * This method is from java8 API to be compatible against runtime. + * Returns the default FileSystemProvider. + */ + public static FileSystemProvider create() { + return INSTANCE; + } } From 583b063450f65e40c5a0831860effc7f530b4d90 Mon Sep 17 00:00:00 2001 From: jyxzwd <978344408@qq.com> Date: Sun, 10 Nov 2024 21:39:54 +0800 Subject: [PATCH 2/3] Revert "8331467: Fix JDK-8331467 ImageReaderFactory can cause a ClassNotFoundException if the default FileSystemProvider is not the system-default provider" This reverts commit 318888339bdc2ee6a632e4850a980d91bff79e79. --- .../aix/classes/sun/nio/fs/DefaultFileSystemProvider.java | 8 -------- .../classes/sun/nio/fs/DefaultFileSystemProvider.java | 8 -------- .../classes/sun/nio/fs/DefaultFileSystemProvider.java | 8 -------- .../classes/jdk/internal/jimage/ImageReaderFactory.java | 2 +- .../classes/sun/nio/fs/DefaultFileSystemProvider.java | 8 -------- 5 files changed, 1 insertion(+), 33 deletions(-) diff --git a/src/java.base/aix/classes/sun/nio/fs/DefaultFileSystemProvider.java b/src/java.base/aix/classes/sun/nio/fs/DefaultFileSystemProvider.java index bacbf642b0f81..5bc5b88254273 100644 --- a/src/java.base/aix/classes/sun/nio/fs/DefaultFileSystemProvider.java +++ b/src/java.base/aix/classes/sun/nio/fs/DefaultFileSystemProvider.java @@ -50,12 +50,4 @@ public static AixFileSystemProvider instance() { public static FileSystem theFileSystem() { return INSTANCE.theFileSystem(); } - - /** - * This method is from java8 API to be compatible against runtime. - * Returns the default FileSystemProvider. - */ - public static FileSystemProvider create() { - return INSTANCE; - } } diff --git a/src/java.base/linux/classes/sun/nio/fs/DefaultFileSystemProvider.java b/src/java.base/linux/classes/sun/nio/fs/DefaultFileSystemProvider.java index 74c0d28b0a9ff..17afe262fe0b6 100644 --- a/src/java.base/linux/classes/sun/nio/fs/DefaultFileSystemProvider.java +++ b/src/java.base/linux/classes/sun/nio/fs/DefaultFileSystemProvider.java @@ -50,12 +50,4 @@ public static LinuxFileSystemProvider instance() { public static FileSystem theFileSystem() { return INSTANCE.theFileSystem(); } - - /** - * This method is from java8 API to be compatible against runtime. - * Returns the default FileSystemProvider. - */ - public static FileSystemProvider create() { - return INSTANCE; - } } diff --git a/src/java.base/macosx/classes/sun/nio/fs/DefaultFileSystemProvider.java b/src/java.base/macosx/classes/sun/nio/fs/DefaultFileSystemProvider.java index 7665fc137e5ff..acb95b93cc89d 100644 --- a/src/java.base/macosx/classes/sun/nio/fs/DefaultFileSystemProvider.java +++ b/src/java.base/macosx/classes/sun/nio/fs/DefaultFileSystemProvider.java @@ -50,12 +50,4 @@ public static MacOSXFileSystemProvider instance() { public static FileSystem theFileSystem() { return INSTANCE.theFileSystem(); } - - /** - * This method is from java8 API to be compatible against runtime. - * Returns the default FileSystemProvider. - */ - public static FileSystemProvider create() { - return INSTANCE; - } } diff --git a/src/java.base/share/classes/jdk/internal/jimage/ImageReaderFactory.java b/src/java.base/share/classes/jdk/internal/jimage/ImageReaderFactory.java index 01e9473af7e3f..24ac9bfc18aff 100644 --- a/src/java.base/share/classes/jdk/internal/jimage/ImageReaderFactory.java +++ b/src/java.base/share/classes/jdk/internal/jimage/ImageReaderFactory.java @@ -48,7 +48,7 @@ private ImageReaderFactory() {} private static final String JAVA_HOME = System.getProperty("java.home"); private static final Path BOOT_MODULES_JIMAGE = - sun.nio.fs.DefaultFileSystemProvider.create().getPath(JAVA_HOME, "lib", "modules"); + Paths.get(JAVA_HOME, "lib", "modules"); private static final Map readers = new ConcurrentHashMap<>(); diff --git a/src/java.base/windows/classes/sun/nio/fs/DefaultFileSystemProvider.java b/src/java.base/windows/classes/sun/nio/fs/DefaultFileSystemProvider.java index b679e839df0dc..bee8a08ee460b 100644 --- a/src/java.base/windows/classes/sun/nio/fs/DefaultFileSystemProvider.java +++ b/src/java.base/windows/classes/sun/nio/fs/DefaultFileSystemProvider.java @@ -49,12 +49,4 @@ public static WindowsFileSystemProvider instance() { public static FileSystem theFileSystem() { return INSTANCE.theFileSystem(); } - - /** - * This method is from java8 API to be compatible against runtime. - * Returns the default FileSystemProvider. - */ - public static FileSystemProvider create() { - return INSTANCE; - } } From 10bae79bd7af30714dde17344eb4512b29d9c20f Mon Sep 17 00:00:00 2001 From: jyxzwd <978344408@qq.com> Date: Wed, 20 Nov 2024 21:40:40 +0800 Subject: [PATCH 3/3] 8331467: Fix JDK-8331467 ImageReaderFactory can cause a ClassNotFoundException if the default FileSystemProvider is not the system-default provider --- .../share/classes/java/lang/System.java | 15 +++++++++++++++ .../classes/java/nio/file/FileSystems.java | 2 +- .../share/classes/jdk/internal/misc/VM.java | 17 +++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/java.base/share/classes/java/lang/System.java b/src/java.base/share/classes/java/lang/System.java index 930b6b7f611b5..e7801b48d3aa9 100644 --- a/src/java.base/share/classes/java/lang/System.java +++ b/src/java.base/share/classes/java/lang/System.java @@ -2429,6 +2429,21 @@ private static void initPhase3() { // system is fully initialized VM.initLevel(4); + + // if the property java.nio.file.spi.DefaultFileSystemProvider is + // set then load the default provider (or a list) + String prop = "java.nio.file.spi.DefaultFileSystemProvider"; + String propValue = System.getProperty(prop); + if (propValue != null) { + for (String cn: propValue.split(",")) { + try { + Class.forName(cn, true, ClassLoader.getSystemClassLoader()); + } catch (Exception x) { + throw new Error(x); + } + } + } + VM.setCustomDefaultFileSystemProviderLoaded(); } private static void setJavaLangAccess() { diff --git a/src/java.base/share/classes/java/nio/file/FileSystems.java b/src/java.base/share/classes/java/nio/file/FileSystems.java index 6a69150255147..6a401eb55dd4e 100644 --- a/src/java.base/share/classes/java/nio/file/FileSystems.java +++ b/src/java.base/share/classes/java/nio/file/FileSystems.java @@ -179,7 +179,7 @@ private static FileSystemProvider getDefaultProvider() { * @return the default file system */ public static FileSystem getDefault() { - if (VM.isModuleSystemInited()) { + if (VM.isModuleSystemInited() && VM.isCustomDefaultFileSystemProviderLoaded()) { return DefaultFileSystemHolder.defaultFileSystem; } else { // always use the platform's default file system during startup diff --git a/src/java.base/share/classes/jdk/internal/misc/VM.java b/src/java.base/share/classes/jdk/internal/misc/VM.java index 1c31ef5a184e2..25f6eb1b63fd6 100644 --- a/src/java.base/share/classes/jdk/internal/misc/VM.java +++ b/src/java.base/share/classes/jdk/internal/misc/VM.java @@ -49,6 +49,7 @@ public class VM { // 0, 1, 2, ... private static volatile int initLevel; + private static volatile boolean isCustomDefaultFileSystemProviderLoaded = false; private static final Object lock = new Object(); /** @@ -67,6 +68,22 @@ public static void initLevel(int value) { } } + /** + * control the CustomDefaultFileSystemProvider loading status + * + * @see java.lang.System#initPhase3 + */ + public static void setCustomDefaultFileSystemProviderLoaded() { + isCustomDefaultFileSystemProviderLoaded = true; + } + + /** + * Returns the current customDefaultFileSystemProvider loading status + */ + public static boolean isCustomDefaultFileSystemProviderLoaded() { + return isCustomDefaultFileSystemProviderLoaded; + } + /** * Returns the current init level. */