From: Hwankyu Jhun Date: Thu, 25 May 2023 02:32:24 +0000 (+0000) Subject: Fix a bug about creating a loader process of hydra loader X-Git-Tag: accepted/tizen/unified/20230601.162952~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=390e2e1be86a10aa67d7828752e4379ac6e04d8b;p=platform%2Fcore%2Fappfw%2Flaunchpad.git Fix a bug about creating a loader process of hydra loader The argument that is the loader type is overwritten. This patch copies the arguments and uses it when executing a child process. Change-Id: Ic6a86c6a9d544ef90f0976041d92fa1145735551 Signed-off-by: Hwankyu Jhun --- diff --git a/src/lib/launchpad-hydra/launchpad_hydra.cc b/src/lib/launchpad-hydra/launchpad_hydra.cc index 8d26dc02..1d301e2f 100644 --- a/src/lib/launchpad-hydra/launchpad_hydra.cc +++ b/src/lib/launchpad-hydra/launchpad_hydra.cc @@ -48,36 +48,71 @@ const int kLoaderArgMax = 1024; } // namespace -LaunchpadHydra::LaunchpadHydra(int argc, char** argv) - : argc_(argc), argv_(argv) { +LaunchpadHydra::LaunchpadHydra(int argc, char** argv) : argc_(argc) { if (argc_ < 4) { _E("Too few arguments"); THROW(-EINVAL); } - type_ = argv_[LOADER_ARG_TYPE][0] - '0'; + type_ = argv[LOADER_ARG_TYPE][0] - '0'; if (type_ < 0 || type_ >= LAUNCHPAD_LOADER_TYPE_MAX) { _E("Invalid argument. type(%d)", type_); THROW(-EINVAL); } - int hydra_mode = argv_[LOADER_ARG_HYDRA][0] - '0'; + int hydra_mode = argv[LOADER_ARG_HYDRA][0] - '0'; _D("Hydra mode: %d", hydra_mode); if (!hydra_mode) { _W("Run in non hydra mode"); THROW(-EINVAL); } - argv_[LOADER_ARG_HYDRA] = const_cast("0"); - loader_id_ = atoi(argv_[LOADER_ARG_ID]); + argv[LOADER_ARG_HYDRA] = const_cast("0"); + loader_id_ = atoi(argv[LOADER_ARG_ID]); - HydraArgs::GetInst().Set(argc_, argv_); + HydraArgs::GetInst().Set(argc, argv); std::string env = std::to_string( - reinterpret_cast(argv_[0])); + reinterpret_cast(argv[0])); setenv("TIZEN_LOADER_ARGS", env.c_str(), 1); + + if (!CloneArgs(argc, argv)) { + ReleaseArgs(); + THROW(-ENOMEM); + } } LaunchpadHydra::~LaunchpadHydra() { + ReleaseArgs(); +} + +void LaunchpadHydra::ReleaseArgs() { + if (argv_ != nullptr) { + for (int i = 0; i < argc_; ++i) + free(argv_[i]); + + free(argv_); + } +} + +bool LaunchpadHydra::CloneArgs(int argc, char** argv) { + argv_ = static_cast(malloc(argc_ * sizeof(char*))); + if (argv_ == nullptr) { + _E("malloc() is failed"); + return false; + } + + for (int i = 0; i < argc_; ++i) { + argv_[i] = strdup(argv[i]); + if (argv_[i] == nullptr) { + _E("strdup() is failed"); + return false; + } + + if (i != (argc_ - 1)) + SECURE_LOGD("[%d] %s", i, argv_[i]); + } + + return true; } void LaunchpadHydra::Run(hydra_lifecycle_callback_s* callback, @@ -240,8 +275,9 @@ void LaunchpadHydra::OnLoaderExecution(int argc, char** argv) { int ret = 0; if (callback_.fork != nullptr) { - memset(argv_[0], '\0', kLoaderArgMax); - snprintf(argv_[0], kLoaderArgMax, "%s candidate", argv[0]); + char** hydra_args = HydraArgs::GetInst().GetArgs(); + memset(hydra_args[0], '\0', kLoaderArgMax); + snprintf(hydra_args[0], kLoaderArgMax, "%s candidate", argv[0]); ret = callback_.fork(argc, argv, user_data_); } diff --git a/src/lib/launchpad-hydra/launchpad_hydra.hh b/src/lib/launchpad-hydra/launchpad_hydra.hh index 43ea3b28..2f527c8e 100644 --- a/src/lib/launchpad-hydra/launchpad_hydra.hh +++ b/src/lib/launchpad-hydra/launchpad_hydra.hh @@ -41,6 +41,9 @@ class LaunchpadHydra : public IOEvent::IEvent, void Exit(); private: + void ReleaseArgs(); + bool CloneArgs(int argc, char** args); + void OnPreCreate(); void OnCreate(); void OnTerminate();