From 0130676b42efa0c5e6a7193915b55d98e6b5406f Mon Sep 17 00:00:00 2001 From: Glavo Date: Sat, 14 Jan 2023 02:16:20 +0800 Subject: [PATCH] fix #1999: Add overrideJavaArguments to LaunchOptions (#2000) * fix #1999: Add overrideJavaArguments to LaunchOptions * fix checkstyle --- .../hmcl/game/HMCLGameRepository.java | 2 +- .../jackhuang/hmcl/game/LaunchOptions.java | 28 +++++++++++++++++-- .../hmcl/launch/DefaultLauncher.java | 20 +++++++------ 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java index 70e06f858..b50f1efc8 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -327,7 +327,7 @@ public class HMCLGameRepository extends DefaultGameRepository { .setVersionName(version) .setProfileName(Metadata.TITLE) .setGameArguments(StringUtils.tokenize(vs.getMinecraftArgs())) - .setJavaArguments(StringUtils.tokenize(vs.getJavaArgs())) + .setOverrideJavaArguments(StringUtils.tokenize(vs.getJavaArgs())) .setMaxMemory(vs.isNoJVMArgs() && vs.isAutoMemory() ? null : (int)(getAllocatedMemory( vs.getMaxMemory() * 1024L * 1024L, OperatingSystem.getPhysicalMemoryStatus().orElse(OperatingSystem.PhysicalMemoryStatus.INVALID).getAvailable(), diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java index 6c0e12055..d1174a26c 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java @@ -38,9 +38,10 @@ public class LaunchOptions implements Serializable { private String versionName; private String versionType; private String profileName; - private List gameArguments = new ArrayList<>(); - private List javaArguments = new ArrayList<>(); - private List javaAgents = new ArrayList<>(0); + private final List gameArguments = new ArrayList<>(); + private final List overrideJavaArguments = new ArrayList<>(); + private final List javaArguments = new ArrayList<>(); + private final List javaAgents = new ArrayList<>(0); private Integer minMemory; private Integer maxMemory; private Integer metaspace; @@ -108,6 +109,14 @@ public class LaunchOptions implements Serializable { return Collections.unmodifiableList(gameArguments); } + /** + * The highest priority JVM arguments (overrides the version setting) + */ + @NotNull + public List getOverrideJavaArguments() { + return Collections.unmodifiableList(overrideJavaArguments); + } + /** * User custom additional java virtual machine command line arguments. */ @@ -314,6 +323,13 @@ public class LaunchOptions implements Serializable { return options.gameArguments; } + /** + * The highest priority JVM arguments (overrides the version setting) + */ + public List getOverrideJavaArguments() { + return options.overrideJavaArguments; + } + /** * User custom additional java virtual machine command line arguments. */ @@ -473,6 +489,12 @@ public class LaunchOptions implements Serializable { return this; } + public Builder setOverrideJavaArguments(List overrideJavaArguments) { + options.overrideJavaArguments.clear(); + options.overrideJavaArguments.addAll(overrideJavaArguments); + return this; + } + public Builder setJavaArguments(List javaArguments) { options.javaArguments.clear(); options.javaArguments.addAll(javaArguments); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java index bd7bf039e..d5cbb3acf 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -105,15 +105,7 @@ public class DefaultLauncher extends Launcher { res.add(options.getJava().getBinary().toString()); - // Fix RCE vulnerability of log4j2 - res.addDefault("-Djava.rmi.server.useCodebaseOnly=", "true"); - res.addDefault("-Dcom.sun.jndi.rmi.object.trustURLCodebase=", "false"); - res.addDefault("-Dcom.sun.jndi.cosnaming.object.trustURLCodebase=", "false"); - - String formatMsgNoLookups = res.addDefault("-Dlog4j2.formatMsgNoLookups=", "true"); - if (!"-Dlog4j2.formatMsgNoLookups=false".equals(formatMsgNoLookups) && isUsingLog4j()) { - res.addDefault("-Dlog4j.configurationFile=", getLog4jConfigurationFile().getAbsolutePath()); - } + res.addAllWithoutParsing(options.getOverrideJavaArguments()); Proxy proxy = options.getProxy(); if (proxy != null && StringUtils.isBlank(options.getProxyUser()) && StringUtils.isBlank(options.getProxyPass())) { @@ -160,6 +152,16 @@ public class DefaultLauncher extends Launcher { res.addDefault("-Dsun.stdout.encoding=", encoding.name()); res.addDefault("-Dsun.stderr.encoding=", encoding.name()); + // Fix RCE vulnerability of log4j2 + res.addDefault("-Djava.rmi.server.useCodebaseOnly=", "true"); + res.addDefault("-Dcom.sun.jndi.rmi.object.trustURLCodebase=", "false"); + res.addDefault("-Dcom.sun.jndi.cosnaming.object.trustURLCodebase=", "false"); + + String formatMsgNoLookups = res.addDefault("-Dlog4j2.formatMsgNoLookups=", "true"); + if (!"-Dlog4j2.formatMsgNoLookups=false".equals(formatMsgNoLookups) && isUsingLog4j()) { + res.addDefault("-Dlog4j.configurationFile=", getLog4jConfigurationFile().getAbsolutePath()); + } + // Default JVM Args if (!options.isNoGeneratedJVMArgs()) { appendJvmArgs(res);