From b174117278890a81b021abe2716742e406f4ef16 Mon Sep 17 00:00:00 2001 From: andreas Date: Mon, 19 Aug 2024 21:40:21 +1000 Subject: [PATCH 1/2] Fix for issue #2302 - NativeLibraryLoader fails due to no write permissions Extract native library to a folder directly beneath the user temp folder. Do not use an intermediate /jme subfolder. Check the result of the call to mkdir. Use UserCache if creation failed. Check if the extraction folder is actually writable. If not use the UserCache. Updated log message: since a previous change we no longer extract to the working directory. --- .../java/com/jme3/system/NativeLibraryLoader.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java b/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java index c0eb8613e6..e05107a674 100644 --- a/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java +++ b/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java @@ -198,14 +198,15 @@ public static File getExtractionFolder() { setExtractionFolderToUserCache(); } else { try { - File jmeTempDir = new File(userTempDir, "jme3"); - if (!jmeTempDir.exists()) { - jmeTempDir.mkdir(); - } - extractionFolder = new File(jmeTempDir, "natives_" + Integer.toHexString(computeNativesHash())); + extractionFolder = new File(userTempDir, "jme3_natives_" + Integer.toHexString(computeNativesHash())); if (!extractionFolder.exists()) { - extractionFolder.mkdir(); + if(!extractionFolder.mkdir()) { + throw new IOException("Failed to create folder "+extractionFolder); + } + } + if(!extractionFolder.canWrite()) { + setExtractionFolderToUserCache(); } } catch (Exception e) { setExtractionFolderToUserCache(); @@ -268,7 +269,7 @@ private static void setExtractionFolderToUserCache() { extractionFolder.mkdir(); } - logger.log(Level.WARNING, "Working directory is not writable. " + logger.log(Level.WARNING, "Temp directory is not writable. " + "Natives will be extracted to:\n{0}", extractionFolder); } From 7df685b0f58b07e1a9068382d8a1766751f7bf31 Mon Sep 17 00:00:00 2001 From: andreas Date: Wed, 27 Nov 2024 22:34:29 +1100 Subject: [PATCH 2/2] Switch to a smaller change. Simply check if jmeTempDir is writable. If not, use user cache folder instead. --- .../com/jme3/system/NativeLibraryLoader.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java b/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java index e05107a674..0ec507fb7a 100644 --- a/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java +++ b/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java @@ -198,15 +198,18 @@ public static File getExtractionFolder() { setExtractionFolderToUserCache(); } else { try { - extractionFolder = new File(userTempDir, "jme3_natives_" + Integer.toHexString(computeNativesHash())); - - if (!extractionFolder.exists()) { - if(!extractionFolder.mkdir()) { - throw new IOException("Failed to create folder "+extractionFolder); - } + File jmeTempDir = new File(userTempDir, "jme3"); + if (!jmeTempDir.exists()) { + jmeTempDir.mkdir(); } - if(!extractionFolder.canWrite()) { + if(!jmeTempDir.canWrite()) { setExtractionFolderToUserCache(); + } else { + extractionFolder = new File(jmeTempDir, "natives_" + Integer.toHexString(computeNativesHash())); + + if (!extractionFolder.exists()) { + extractionFolder.mkdir(); + } } } catch (Exception e) { setExtractionFolderToUserCache();