From ba157f0642b51ee10cbaeaa5ba54699dbd23dee3 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Mon, 13 Jan 2025 09:15:39 +0900 Subject: [PATCH] Mark and close created file descriptors in process pool 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 --- .../app_defined_loader_info_manager.cc | 2 + .../app_labels_monitor.cc | 2 + src/launchpad-process-pool/file_monitor.cc | 2 + src/launchpad-process-pool/file_monitor.hh | 2 + .../hydra_loader_context.cc | 4 ++ .../hydra_sigchld_event.cc | 2 + src/launchpad-process-pool/loader_context.cc | 4 ++ src/launchpad-process-pool/process_pool.cc | 51 +++++-------------- src/launchpad-process-pool/process_pool.hh | 3 ++ src/launchpad-process-pool/sigchld_event.cc | 3 ++ 10 files changed, 36 insertions(+), 39 deletions(-) diff --git a/src/launchpad-process-pool/app_defined_loader_info_manager.cc b/src/launchpad-process-pool/app_defined_loader_info_manager.cc index f129d05d..539005e4 100644 --- a/src/launchpad-process-pool/app_defined_loader_info_manager.cc +++ b/src/launchpad-process-pool/app_defined_loader_info_manager.cc @@ -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 AppDefinedLoaderInfoManager::Find( diff --git a/src/launchpad-process-pool/app_labels_monitor.cc b/src/launchpad-process-pool/app_labels_monitor.cc index c4736e81..07724a81 100644 --- a/src/launchpad-process-pool/app_labels_monitor.cc +++ b/src/launchpad-process-pool/app_labels_monitor.cc @@ -19,6 +19,7 @@ #include #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(fd, IOChannel::IOCondition::IO_IN, this); handle_ = monitor_auto.release(); + ProcessPool::MarkCloseableFd(fd); disposed_ = false; } diff --git a/src/launchpad-process-pool/file_monitor.cc b/src/launchpad-process-pool/file_monitor.cc index 433845a2..4cfda17c 100644 --- a/src/launchpad-process-pool/file_monitor.cc +++ b/src/launchpad-process-pool/file_monitor.cc @@ -95,4 +95,6 @@ FileMonitor::~FileMonitor() { if (fd_ > 0) close(fd_); } +int FileMonitor::GetFd() const { return fd_; } + } // namespace launchpad diff --git a/src/launchpad-process-pool/file_monitor.hh b/src/launchpad-process-pool/file_monitor.hh index 243b45f1..8f12c07c 100644 --- a/src/launchpad-process-pool/file_monitor.hh +++ b/src/launchpad-process-pool/file_monitor.hh @@ -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; diff --git a/src/launchpad-process-pool/hydra_loader_context.cc b/src/launchpad-process-pool/hydra_loader_context.cc index b462d6c1..05c70810 100644 --- a/src/launchpad-process-pool/hydra_loader_context.cc +++ b/src/launchpad-process-pool/hydra_loader_context.cc @@ -26,6 +26,7 @@ #include #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()); diff --git a/src/launchpad-process-pool/hydra_sigchld_event.cc b/src/launchpad-process-pool/hydra_sigchld_event.cc index 0d8c9865..7e44d5d5 100644 --- a/src/launchpad-process-pool/hydra_sigchld_event.cc +++ b/src/launchpad-process-pool/hydra_sigchld_event.cc @@ -22,6 +22,7 @@ #include #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() { diff --git a/src/launchpad-process-pool/loader_context.cc b/src/launchpad-process-pool/loader_context.cc index d020af9a..0172feb7 100644 --- a/src/launchpad-process-pool/loader_context.cc +++ b/src/launchpad-process-pool/loader_context.cc @@ -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(); diff --git a/src/launchpad-process-pool/process_pool.cc b/src/launchpad-process-pool/process_pool.cc index 30bf7381..83c27c33 100644 --- a/src/launchpad-process-pool/process_pool.cc +++ b/src/launchpad-process-pool/process_pool.cc @@ -16,7 +16,6 @@ #include "launchpad-process-pool/process_pool.hh" -#include #include #include #include @@ -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 GetExceptableFds() { - std::vector 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 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 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(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 diff --git a/src/launchpad-process-pool/process_pool.hh b/src/launchpad-process-pool/process_pool.hh index 7b176543..619a6f08 100644 --- a/src/launchpad-process-pool/process_pool.hh +++ b/src/launchpad-process-pool/process_pool.hh @@ -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: diff --git a/src/launchpad-process-pool/sigchld_event.cc b/src/launchpad-process-pool/sigchld_event.cc index 6ff3f369..53e9eebb 100644 --- a/src/launchpad-process-pool/sigchld_event.cc +++ b/src/launchpad-process-pool/sigchld_event.cc @@ -22,6 +22,7 @@ #include #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(); } -- 2.34.1