From 48274e889f2219545d2c3bea6cc3a0281e9a0c47 Mon Sep 17 00:00:00 2001 From: Joona Date: Tue, 22 Aug 2017 15:23:35 -0700 Subject: move env cleaning and clean before java test --- api/logic/java/JavaChecker.cpp | 2 + api/logic/java/JavaUtils.cpp | 92 ++++++++++++++++++++++++++++++++++++++++++ api/logic/java/JavaUtils.h | 2 + 3 files changed, 96 insertions(+) (limited to 'api/logic/java') diff --git a/api/logic/java/JavaChecker.cpp b/api/logic/java/JavaChecker.cpp index ebbd80be..f0b71e48 100644 --- a/api/logic/java/JavaChecker.cpp +++ b/api/logic/java/JavaChecker.cpp @@ -1,4 +1,5 @@ #include "JavaChecker.h" +#include "JavaUtils.h" #include #include #include @@ -42,6 +43,7 @@ void JavaChecker::performCheck() process->setArguments(args); process->setProgram(m_path); process->setProcessChannelMode(QProcess::SeparateChannels); + process->setProcessEnvironment(CleanEnviroment()); qDebug() << "Running java checker: " + m_path + args.join(" ");; connect(process.get(), SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(finished(int, QProcess::ExitStatus))); diff --git a/api/logic/java/JavaUtils.cpp b/api/logic/java/JavaUtils.cpp index fd28cca9..e26a9a46 100644 --- a/api/logic/java/JavaUtils.cpp +++ b/api/logic/java/JavaUtils.cpp @@ -25,10 +25,102 @@ #include "java/JavaInstallList.h" #include "FileSystem.h" +#define IBUS "@im=ibus" + JavaUtils::JavaUtils() { } +static QString processLD_LIBRARY_PATH(const QString & LD_LIBRARY_PATH) +{ + QDir mmcBin(QCoreApplication::applicationDirPath()); + auto items = LD_LIBRARY_PATH.split(':'); + QStringList final; + for(auto & item: items) + { + QDir test(item); + if(test == mmcBin) + { + qDebug() << "Env:LD_LIBRARY_PATH ignoring path" << item; + continue; + } + final.append(item); + } + return final.join(':'); +} + +QProcessEnvironment CleanEnviroment() +{ + // prepare the process environment + QProcessEnvironment rawenv = QProcessEnvironment::systemEnvironment(); + QProcessEnvironment env; + + QStringList ignored = + { + "JAVA_ARGS", + "CLASSPATH", + "CONFIGPATH", + "JAVA_HOME", + "JRE_HOME", + "_JAVA_OPTIONS", + "JAVA_OPTIONS", + "JAVA_TOOL_OPTIONS" + }; + for(auto key: rawenv.keys()) + { + auto value = rawenv.value(key); + // filter out dangerous java crap + if(ignored.contains(key)) + { + qDebug() << "Env: ignoring" << key << value; + continue; + } + // filter MultiMC-related things + if(key.startsWith("QT_")) + { + qDebug() << "Env: ignoring" << key << value; + continue; + } +#ifdef Q_OS_LINUX + // Do not pass LD_* variables to java. They were intended for MultiMC + if(key.startsWith("LD_")) + { + qDebug() << "Env: ignoring" << key << value; + continue; + } + // Strip IBus + // IBus is a Linux IME framework. For some reason, it breaks MC? + if (key == "XMODIFIERS" && value.contains(IBUS)) + { + QString save = value; + value.replace(IBUS, ""); + qDebug() << "Env: stripped" << IBUS << "from" << save << ":" << value; + } + if(key == "GAME_PRELOAD") + { + env.insert("LD_PRELOAD", value); + continue; + } + if(key == "GAME_LIBRARY_PATH") + { + env.insert("LD_LIBRARY_PATH", processLD_LIBRARY_PATH(value)); + continue; + } +#endif + qDebug() << "Env: " << key << value; + env.insert(key, value); + } +#ifdef Q_OS_LINUX + // HACK: Workaround for QTBUG42500 + if(!env.contains("LD_LIBRARY_PATH")) + { + env.insert("LD_LIBRARY_PATH", ""); + } +#endif + + return env; +} + JavaInstallPtr JavaUtils::MakeJavaPtr(QString path, QString id, QString arch) { JavaInstallPtr javaVersion(new JavaInstall()); diff --git a/api/logic/java/JavaUtils.h b/api/logic/java/JavaUtils.h index 25fd57f5..c97a75f9 100644 --- a/api/logic/java/JavaUtils.h +++ b/api/logic/java/JavaUtils.h @@ -26,6 +26,8 @@ #include "multimc_logic_export.h" +QProcessEnvironment CleanEnviroment(); + class MULTIMC_LOGIC_EXPORT JavaUtils : public QObject { Q_OBJECT -- cgit v1.2.3