8248239: jpackage adds some arguments twice in case it is re-executed by JLI

Reviewed-by: herrick, almatvee
This commit is contained in:
Aleksei Voitylov 2020-07-24 19:54:01 -04:00 committed by Alexey Semenyuk
parent c0b9999c35
commit 5a365e8627
3 changed files with 78 additions and 2 deletions

View File

@ -24,14 +24,24 @@
*/
#include <stdio.h>
#include <stdlib.h>
#include "AppLauncher.h"
#include "FileUtils.h"
#include "UnixSysInfo.h"
#include "Package.h"
#include "Log.h"
#include "ErrorHandling.h"
namespace {
size_t hash(const std::string& str) {
size_t h = 0;
for(std::string::const_iterator it = str.begin(); it != str.end(); ++it) {
h = 31 * h + (*it & 0xff);
}
return h;
}
void launchApp() {
setlocale(LC_ALL, "en_US.utf8");
@ -57,6 +67,56 @@ void launchApp() {
ownerPackage.initAppLauncher(appLauncher);
}
const std::string _JPACKAGE_LAUNCHER = "_JPACKAGE_LAUNCHER";
std::string launchInfo = SysInfo::getEnvVariable(std::nothrow,
_JPACKAGE_LAUNCHER, "");
const std::string thisLdLibraryPath = SysInfo::getEnvVariable(std::nothrow,
"LD_LIBRARY_PATH", "");
const size_t thisHash = hash(thisLdLibraryPath);
if (!launchInfo.empty()) {
LOG_TRACE(tstrings::any() << "Found "
<< _JPACKAGE_LAUNCHER << "=[" << launchInfo << "]");
tistringstream iss(launchInfo);
iss.exceptions(std::ios::failbit | std::ios::badbit);
size_t hash = 0;
iss >> hash;
launchInfo = "";
if (thisHash != hash) {
// This launcher execution is the result of execve() call from
// withing JVM.
// This means all JVM arguments are already configured in launcher
// process command line.
// No need to construct command line for JVM.
LOG_TRACE("Not building JVM arguments from cfg file");
appLauncher.setInitJvmFromCmdlineOnly(true);
}
} else {
// Changed LD_LIBRARY_PATH environment variable might result in
// execve() call from within JVM.
// Set _JPACKAGE_LAUNCHER environment variable accordingly so that
// restarted launcher process can detect a restart.
launchInfo = (tstrings::any() << thisHash).str();
}
JP_TRY;
if (0 != setenv(_JPACKAGE_LAUNCHER.c_str(), launchInfo.c_str(), 1)) {
JP_THROW(tstrings::any() << "setenv(" << _JPACKAGE_LAUNCHER
<< ", " << launchInfo << ") failed. Error: " << lastCRTError());
} else {
LOG_TRACE(tstrings::any() << "Set "
<< _JPACKAGE_LAUNCHER << "=[" << launchInfo << "]");
}
JP_CATCH_ALL;
appLauncher.launch();
}

View File

@ -35,6 +35,7 @@
AppLauncher::AppLauncher() {
setInitJvmFromCmdlineOnly(false);
launcherPath = SysInfo::getProcessModulePath();
args = SysInfo::getCommandArgs();
}
@ -116,8 +117,17 @@ Jvm* AppLauncher::createJvmLauncher() const {
(*jvm)
.setPath(findJvmLib(cfgFile, defaultRuntimePath, jvmLibNames))
.addArgument(launcherPath)
.initFromConfigFile(cfgFile);
.addArgument(launcherPath);
if (initJvmFromCmdlineOnly) {
tstring_array::const_iterator argIt = args.begin();
const tstring_array::const_iterator argEnd = args.end();
for (; argIt != argEnd; ++argIt) {
(*jvm).addArgument(*argIt);
}
} else {
(*jvm).initFromConfigFile(cfgFile);
}
return jvm.release();
}

View File

@ -51,6 +51,11 @@ public:
return *this;
}
AppLauncher& setInitJvmFromCmdlineOnly(bool v) {
initJvmFromCmdlineOnly = v;
return *this;
}
AppLauncher& addJvmLibName(const tstring& v) {
jvmLibNames.push_back(v);
return *this;
@ -78,6 +83,7 @@ private:
tstring appDirPath;
tstring imageRoot;
tstring_array jvmLibNames;
bool initJvmFromCmdlineOnly;
};
#endif // AppLauncher_h