Mark and close created file descriptors in process pool 53/318053/3
authorHwankyu Jhun <h.jhun@samsung.com>
Mon, 13 Jan 2025 00:15:39 +0000 (09:15 +0900)
committerHwanKyu Jhun <h.jhun@samsung.com>
Mon, 13 Jan 2025 03:22:18 +0000 (03:22 +0000)
This patch marks the created file descriptor to the closeabe fds.
When initialzing the process pool, it closes file descriptors.

Change-Id: If8b18ab3d4ed653f19e34c74cf9be600290b2fe5
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
src/launchpad-process-pool/app_defined_loader_info_manager.cc
src/launchpad-process-pool/app_labels_monitor.cc
src/launchpad-process-pool/file_monitor.cc
src/launchpad-process-pool/file_monitor.hh
src/launchpad-process-pool/hydra_loader_context.cc
src/launchpad-process-pool/hydra_sigchld_event.cc
src/launchpad-process-pool/loader_context.cc
src/launchpad-process-pool/process_pool.cc
src/launchpad-process-pool/process_pool.hh
src/launchpad-process-pool/sigchld_event.cc

index f129d05d97c4fee02a077d019a63b9109e865be6..539005e4e08ac95dce6b46df7c541e0fd0b6f9c7 100644 (file)
@@ -17,6 +17,7 @@
 #include "launchpad-process-pool/app_defined_loader_info_manager.hh"
 
 #include "launchpad-process-pool/log_private.hh"
+#include "launchpad-process-pool/process_pool.hh"
 
 namespace launchpad {
 namespace {
@@ -30,6 +31,7 @@ AppDefinedLoaderInfoManager::AppDefinedLoaderInfoManager()
     : file_monitor_(new FileMonitor(kAppDefinedLoaderInfoPath, this)),
       info_manager_(new LoaderInfoManager(kAppDefinedLoaderInfoPath)) {
   info_manager_->Load();
+  ProcessPool::MarkCloseableFd(file_monitor_->GetFd());
 }
 
 std::shared_ptr<LoaderInfo> AppDefinedLoaderInfoManager::Find(
index c4736e810ef62bd0debbb373dc69d33bd3e27419..07724a8140279fb6fe86ff6ea91f4c26a9922370 100644 (file)
@@ -19,6 +19,7 @@
 #include <exception.hh>
 
 #include "launchpad-process-pool/log_private.hh"
+#include "launchpad-process-pool/process_pool.hh"
 
 namespace launchpad {
 
@@ -60,6 +61,7 @@ void AppLabelsMonitor::Init() {
   channel_ =
       std::make_unique<IOChannel>(fd, IOChannel::IOCondition::IO_IN, this);
   handle_ = monitor_auto.release();
+  ProcessPool::MarkCloseableFd(fd);
   disposed_ = false;
 }
 
index 433845a28349c9d449dba0e3b51cb6f99a34194e..4cfda17cb4369063a91ca33db119f5df50497edb 100644 (file)
@@ -95,4 +95,6 @@ FileMonitor::~FileMonitor() {
   if (fd_ > 0) close(fd_);
 }
 
+int FileMonitor::GetFd() const { return fd_; }
+
 }  // namespace launchpad
index 243b45f1f112f4e95f5ab162f12c767946490e00..8f12c07cd0a843babd17e958732a6569c52281c2 100644 (file)
@@ -47,6 +47,8 @@ class FileMonitor : public IOChannel::IEvent {
   FileMonitor(const FileMonitor &) = delete;
   FileMonitor &operator=(const FileMonitor &) = delete;
 
+  int GetFd() const;
+
  private:
   void OnIOEventReceived(int fd, int condition) override;
 
index b462d6c1d4d80993c9c582e7901289d0146b50e3..05c7081040e1738572b41beaddc0cf3886d437cf 100644 (file)
@@ -26,6 +26,7 @@
 #include <types.hh>
 
 #include "launchpad-process-pool/log_private.hh"
+#include "launchpad-process-pool/process_pool.hh"
 
 namespace fs = std::filesystem;
 
@@ -64,6 +65,7 @@ void HydraLoaderContext::Listen() {
 
     hydra_channel_.reset(new IOChannel(hydra_socket_->GetFd(),
                                        IOChannel::IOCondition::IO_IN, this));
+    ProcessPool::MarkCloseableFd(hydra_socket_->GetFd());
   } catch (const Exception& e) {
     _E("Exception occurs. error: %s", e.what());
     THROW(e.GetErrorCode());
@@ -83,6 +85,7 @@ void HydraLoaderContext::Dispose() {
     hydra_pid_ = 0;
   }
 
+  ProcessPool::RemoveFdFromCloseableFds(client_socket_->GetFd());
   client_channel_.reset();
   client_socket_.reset();
   hydra_prepared_ = false;
@@ -144,6 +147,7 @@ void HydraLoaderContext::HandleHydraLoaderEvent() {
           client_socket_->GetFd(),
           IOChannel::IOCondition::IO_IN | IOChannel::IOCondition::IO_HUP,
           this));
+      ProcessPool::MarkCloseableFd(client_socket_->GetFd());
       hydra_prepared_ = true;
       SECURE_LOGI("Type %d hydra loader was connected. pid: %d", GetType(),
                   GetHydraPid());
index 0d8c98655c8ca5d154aa5b5a53d6c465ce536d20..7e44d5d572903388a1beae6b66a749875cc550cc 100644 (file)
@@ -22,6 +22,7 @@
 #include <sigchld_info.hh>
 
 #include "launchpad-process-pool/log_private.hh"
+#include "launchpad-process-pool/process_pool.hh"
 
 namespace launchpad {
 namespace {
@@ -47,6 +48,7 @@ HydraSigchldEvent::HydraSigchldEvent(IEvent* listener)
 
   channel_.reset(
       new IOChannel(socket_->GetFd(), IOChannel::IOCondition::IO_IN, this));
+  ProcessPool::MarkCloseableFd(socket_->GetFd());
 }
 
 HydraSigchldEvent::~HydraSigchldEvent() {
index d020af9a474b1e9cc3fda734fa285502b0aec0c7..0172feb7d67b93500b111865491986d5b79baf56 100644 (file)
@@ -44,6 +44,7 @@
 #include "launchpad-process-pool/log_private.hh"
 #include "launchpad-process-pool/loader_executor.hh"
 #include "launchpad-process-pool/memory_monitor.hh"
+#include "launchpad-process-pool/process_pool.hh"
 
 namespace fs = std::filesystem;
 
@@ -179,6 +180,7 @@ void LoaderContext::Listen() {
 
     server_channel_.reset(new IOChannel(server_socket_->GetFd(),
                                         IOChannel::IOCondition::IO_IN, this));
+    ProcessPool::MarkCloseableFd(server_socket_->GetFd());
   } catch (const Exception& e) {
     _E("Exception occurs. error: %s", e.what());
     THROW(e.GetErrorCode());
@@ -212,6 +214,7 @@ void LoaderContext::Dispose() {
     on_boot_timer_ = 0;
   }
 
+  ProcessPool::RemoveFdFromCloseableFds(client_socket_->GetFd());
   client_channel_.reset();
   client_socket_.reset();
   prepared_ = false;
@@ -588,6 +591,7 @@ void LoaderContext::HandleLoaderEvent() {
 
       if (IsHydraMode()) SetPid(peer_cred->GetPid());
 
+      ProcessPool::MarkCloseableFd(client_socket_->GetFd());
       prepared_ = true;
       if (listener_ != nullptr) {
         CreateReadyFile();
index 30bf73814a44cb3ebdfbd10dde5cc5d14304b26d..83c27c3332f48e4ae7e61320a646291071535a52 100644 (file)
@@ -16,7 +16,6 @@
 
 #include "launchpad-process-pool/process_pool.hh"
 
-#include <dlog-redirect-stdout.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <linux/limits.h>
@@ -41,41 +40,7 @@ namespace {
 
 constexpr const char kProcessPool[] = "process-pool";
 
-bool IsExceptable(const std::string& path) {
-  static char buf[PATH_MAX];
-  ssize_t len = readlink(path.c_str(), buf, sizeof(buf));
-  if (len < 0) {
-    _E("readlink() is failed. errno: %d", errno);
-    return false;
-  }
-
-  buf[len] = '\0';
-  if (strstr(buf, "log") != nullptr ||
-      strstr(buf, "trace") != nullptr ||
-      strstr(buf, "dev") != nullptr)
-    return true;
-
-  return false;
-}
-
-std::vector<int> GetExceptableFds() {
-  std::vector<int> fds;
-  try {
-    fs::path proc_path("/proc/self/fd");
-    for (const auto& entry : fs::directory_iterator(proc_path)) {
-      if (!isdigit(entry.path().filename().string()[0]))
-        continue;
-
-      int fd = std::stoi(entry.path().filename().string());
-      if (dlog_is_log_fd(fd) || IsExceptable(entry.path().string()))
-        fds.push_back(fd);
-    }
-  } catch (const fs::filesystem_error& e) {
-    _E("Exception occurs. error(%s)", e.what());
-  }
-
-  return fds;
-}
+std::vector<int> closeable_fds;
 
 }  // namespace
 
@@ -170,9 +135,8 @@ void ProcessPool::OnExecution() {
   snprintf(args[0], length, "/usr/bin/%s [%s]", kProcessPool, name_.c_str());
 
   close(pipe_fd_[1]);
-  std::vector<int> except_fds = GetExceptableFds();
-  except_fds.push_back(pipe_fd_[0]);
-  Util::CloseAllFds(except_fds);
+  for (auto& fd : closeable_fds) close(fd);
+
   int ret = WaitForRequest(std::make_unique<Socket>(pipe_fd_[0]));
   exit(ret);
 }
@@ -254,4 +218,13 @@ gboolean ProcessPool::OnTimeout(gpointer user_data) {
   return G_SOURCE_REMOVE;
 }
 
+void ProcessPool::MarkCloseableFd(int fd) {
+  closeable_fds.push_back(fd);
+}
+
+void ProcessPool::RemoveFdFromCloseableFds(int fd) {
+  closeable_fds.erase(
+      std::find(closeable_fds.begin(), closeable_fds.end(), fd));
+}
+
 }  // namespace launchpad
index 7b1765437548cee7b74fbef300fa123b4ef9f19c..619a6f08094f786f5962bd529eb6b3bcb0d46b09 100644 (file)
@@ -50,6 +50,9 @@ class ProcessPool : public Executor::Delegator,
   void HandleSigchld(pid_t pid);
   void SetTimer();
 
+  static void MarkCloseableFd(int fd);
+  static void RemoveFdFromCloseableFds(int fd);
+
  private:
   class Process {
    public:
index 6ff3f3697f83f85130f1301ab55874ebe621e1c4..53e9eebb453c3876b86ad3b5fb0393d0555b6959 100644 (file)
@@ -22,6 +22,7 @@
 #include <unistd.h>
 
 #include "launchpad-process-pool/log_private.hh"
+#include "launchpad-process-pool/process_pool.hh"
 
 namespace launchpad {
 
@@ -30,9 +31,11 @@ SigchldEvent::SigchldEvent(int sfd, IEvent* listener)
       channel_(new IOChannel(sfd, IOChannel::IOCondition::IO_IN, this)),
       listener_(listener) {
   _W("SigchldEvent() ctor. sfd: %d", sfd);
+  ProcessPool::MarkCloseableFd(sfd);
 }
 
 SigchldEvent::~SigchldEvent() {
+  ProcessPool::RemoveFdFromCloseableFds(socket_->GetFd());
   if (getpid() != current_pid_) socket_->RemoveFd();
 }