From e06e2e4cf96aaba6510255f8fe5bc5bcd702482f Mon Sep 17 00:00:00 2001 From: Andrew Steinborn Date: Fri, 29 Nov 2019 14:26:59 -0500 Subject: [PATCH] Introduce velocity.natives-tmpdir property for properly handling noexec /tmp --- .../com/velocitypowered/natives/util/Natives.java | 12 +++++++++++- .../java/com/velocitypowered/proxy/Velocity.java | 6 ++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/native/src/main/java/com/velocitypowered/natives/util/Natives.java b/native/src/main/java/com/velocitypowered/natives/util/Natives.java index a3a229037..9545bf9d6 100644 --- a/native/src/main/java/com/velocitypowered/natives/util/Natives.java +++ b/native/src/main/java/com/velocitypowered/natives/util/Natives.java @@ -12,6 +12,7 @@ import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.nio.file.StandardCopyOption; public class Natives { @@ -23,12 +24,12 @@ public class Natives { private static Runnable copyAndLoadNative(String path) { return () -> { try { - Path tempFile = Files.createTempFile("native-", path.substring(path.lastIndexOf('.'))); InputStream nativeLib = Natives.class.getResourceAsStream(path); if (nativeLib == null) { throw new IllegalStateException("Native library " + path + " not found."); } + Path tempFile = createTemporaryNativeFilename(path.substring(path.lastIndexOf('.'))); Files.copy(nativeLib, tempFile, StandardCopyOption.REPLACE_EXISTING); Runtime.getRuntime().addShutdownHook(new Thread(() -> { try { @@ -49,6 +50,15 @@ public class Natives { }; } + private static Path createTemporaryNativeFilename(String ext) throws IOException { + String temporaryFolderPath = System.getProperty("velocity.natives-tmpdir"); + if (temporaryFolderPath != null) { + return Files.createTempFile(Paths.get(temporaryFolderPath), "native-", ext); + } else { + return Files.createTempFile("native-", ext); + } + } + public static final NativeCodeLoader compress = new NativeCodeLoader<>( ImmutableList.of( new NativeCodeLoader.Variant<>(NativeConstraints.MACOS, diff --git a/proxy/src/main/java/com/velocitypowered/proxy/Velocity.java b/proxy/src/main/java/com/velocitypowered/proxy/Velocity.java index d00274735..1a7e33c65 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/Velocity.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/Velocity.java @@ -23,6 +23,12 @@ public class Velocity { if (System.getProperty("io.netty.allocator.maxOrder") == null) { System.setProperty("io.netty.allocator.maxOrder", "9"); } + + // If Velocity's natives are being extracted to a different temporary directory, make sure the + // Netty natives are extracted there as well + if (System.getProperty("velocity.natives-tmpdir") != null) { + System.setProperty("io.netty.native.workdir", System.getProperty("velocity.natives-tmpdir")); + } } /**