Fix a bug about creating a loader process of hydra loader 62/293362/3
authorHwankyu Jhun <h.jhun@samsung.com>
Thu, 25 May 2023 02:32:24 +0000 (02:32 +0000)
committerHwankyu Jhun <h.jhun@samsung.com>
Thu, 25 May 2023 02:41:55 +0000 (02:41 +0000)
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 <h.jhun@samsung.com>
src/lib/launchpad-hydra/launchpad_hydra.cc
src/lib/launchpad-hydra/launchpad_hydra.hh

index 8d26dc028a4875e78a0d2c3853310016a8c1a681..1d301e2f059ca56a6b1652c47647d96e1e590887 100644 (file)
@@ -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<char*>("0");
-  loader_id_ = atoi(argv_[LOADER_ARG_ID]);
+  argv[LOADER_ARG_HYDRA] = const_cast<char*>("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<unsigned long int>(argv_[0]));
+      reinterpret_cast<unsigned long int>(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<char**>(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_);
   }
index 43ea3b28c0814d38f9b99854d11e81943a17c37a..2f527c8e439393fb20d34d122f301f9846f1bda9 100644 (file)
@@ -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();