fix #1999: Add overrideJavaArguments to LaunchOptions (#2000)

* fix #1999: Add overrideJavaArguments to LaunchOptions

* fix checkstyle
This commit is contained in:
Glavo 2023-01-14 02:16:20 +08:00 committed by GitHub
parent 0ec00ede70
commit 0130676b42
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 37 additions and 13 deletions

View File

@ -327,7 +327,7 @@ public class HMCLGameRepository extends DefaultGameRepository {
.setVersionName(version) .setVersionName(version)
.setProfileName(Metadata.TITLE) .setProfileName(Metadata.TITLE)
.setGameArguments(StringUtils.tokenize(vs.getMinecraftArgs())) .setGameArguments(StringUtils.tokenize(vs.getMinecraftArgs()))
.setJavaArguments(StringUtils.tokenize(vs.getJavaArgs())) .setOverrideJavaArguments(StringUtils.tokenize(vs.getJavaArgs()))
.setMaxMemory(vs.isNoJVMArgs() && vs.isAutoMemory() ? null : (int)(getAllocatedMemory( .setMaxMemory(vs.isNoJVMArgs() && vs.isAutoMemory() ? null : (int)(getAllocatedMemory(
vs.getMaxMemory() * 1024L * 1024L, vs.getMaxMemory() * 1024L * 1024L,
OperatingSystem.getPhysicalMemoryStatus().orElse(OperatingSystem.PhysicalMemoryStatus.INVALID).getAvailable(), OperatingSystem.getPhysicalMemoryStatus().orElse(OperatingSystem.PhysicalMemoryStatus.INVALID).getAvailable(),

View File

@ -38,9 +38,10 @@ public class LaunchOptions implements Serializable {
private String versionName; private String versionName;
private String versionType; private String versionType;
private String profileName; private String profileName;
private List<String> gameArguments = new ArrayList<>(); private final List<String> gameArguments = new ArrayList<>();
private List<String> javaArguments = new ArrayList<>(); private final List<String> overrideJavaArguments = new ArrayList<>();
private List<String> javaAgents = new ArrayList<>(0); private final List<String> javaArguments = new ArrayList<>();
private final List<String> javaAgents = new ArrayList<>(0);
private Integer minMemory; private Integer minMemory;
private Integer maxMemory; private Integer maxMemory;
private Integer metaspace; private Integer metaspace;
@ -108,6 +109,14 @@ public class LaunchOptions implements Serializable {
return Collections.unmodifiableList(gameArguments); return Collections.unmodifiableList(gameArguments);
} }
/**
* The highest priority JVM arguments (overrides the version setting)
*/
@NotNull
public List<String> getOverrideJavaArguments() {
return Collections.unmodifiableList(overrideJavaArguments);
}
/** /**
* User custom additional java virtual machine command line arguments. * User custom additional java virtual machine command line arguments.
*/ */
@ -314,6 +323,13 @@ public class LaunchOptions implements Serializable {
return options.gameArguments; return options.gameArguments;
} }
/**
* The highest priority JVM arguments (overrides the version setting)
*/
public List<String> getOverrideJavaArguments() {
return options.overrideJavaArguments;
}
/** /**
* User custom additional java virtual machine command line arguments. * User custom additional java virtual machine command line arguments.
*/ */
@ -473,6 +489,12 @@ public class LaunchOptions implements Serializable {
return this; return this;
} }
public Builder setOverrideJavaArguments(List<String> overrideJavaArguments) {
options.overrideJavaArguments.clear();
options.overrideJavaArguments.addAll(overrideJavaArguments);
return this;
}
public Builder setJavaArguments(List<String> javaArguments) { public Builder setJavaArguments(List<String> javaArguments) {
options.javaArguments.clear(); options.javaArguments.clear();
options.javaArguments.addAll(javaArguments); options.javaArguments.addAll(javaArguments);

View File

@ -105,15 +105,7 @@ public class DefaultLauncher extends Launcher {
res.add(options.getJava().getBinary().toString()); res.add(options.getJava().getBinary().toString());
// Fix RCE vulnerability of log4j2 res.addAllWithoutParsing(options.getOverrideJavaArguments());
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());
}
Proxy proxy = options.getProxy(); Proxy proxy = options.getProxy();
if (proxy != null && StringUtils.isBlank(options.getProxyUser()) && StringUtils.isBlank(options.getProxyPass())) { 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.stdout.encoding=", encoding.name());
res.addDefault("-Dsun.stderr.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 // Default JVM Args
if (!options.isNoGeneratedJVMArgs()) { if (!options.isNoGeneratedJVMArgs()) {
appendJvmArgs(res); appendJvmArgs(res);