From: Hwankyu Jhun Date: Mon, 13 Jan 2025 00:15:39 +0000 (+0900) Subject: Mark and close created file descriptors in process pool X-Git-Tag: accepted/tizen/9.0/unified/20250116.154252~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e956972cf3964129756923f799789c00b84d272c;p=platform%2Fcore%2Fappfw%2Flaunchpad.git 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 --- 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 14ca7066..b12f1123 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; @@ -65,6 +66,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()); @@ -84,6 +86,7 @@ void HydraLoaderContext::Dispose() { hydra_pid_ = 0; } + ProcessPool::RemoveFdFromCloseableFds(client_socket_->GetFd()); client_channel_.reset(); client_socket_.reset(); hydra_prepared_ = false; @@ -145,6 +148,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 b12796ae..cfd64f7f 100644 --- a/src/launchpad-process-pool/hydra_sigchld_event.cc +++ b/src/launchpad-process-pool/hydra_sigchld_event.cc @@ -23,6 +23,7 @@ #include #include "launchpad-process-pool/log_private.hh" +#include "launchpad-process-pool/process_pool.hh" namespace launchpad { namespace { @@ -65,6 +66,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 51ab043f..e8fedca3 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; @@ -177,6 +178,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()); @@ -210,6 +212,7 @@ void LoaderContext::Dispose() { on_boot_timer_ = 0; } + ProcessPool::RemoveFdFromCloseableFds(client_socket_->GetFd()); client_channel_.reset(); client_socket_.reset(); prepared_ = false; @@ -586,6 +589,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(); }