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>
#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 {
: 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(
#include <exception.hh>
#include "launchpad-process-pool/log_private.hh"
+#include "launchpad-process-pool/process_pool.hh"
namespace launchpad {
channel_ =
std::make_unique<IOChannel>(fd, IOChannel::IOCondition::IO_IN, this);
handle_ = monitor_auto.release();
+ ProcessPool::MarkCloseableFd(fd);
disposed_ = false;
}
if (fd_ > 0) close(fd_);
}
+int FileMonitor::GetFd() const { return fd_; }
+
} // namespace launchpad
FileMonitor(const FileMonitor &) = delete;
FileMonitor &operator=(const FileMonitor &) = delete;
+ int GetFd() const;
+
private:
void OnIOEventReceived(int fd, int condition) override;
#include <types.hh>
#include "launchpad-process-pool/log_private.hh"
+#include "launchpad-process-pool/process_pool.hh"
namespace fs = std::filesystem;
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());
hydra_pid_ = 0;
}
+ ProcessPool::RemoveFdFromCloseableFds(client_socket_->GetFd());
client_channel_.reset();
client_socket_.reset();
hydra_prepared_ = false;
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());
#include <sigchld_info.hh>
#include "launchpad-process-pool/log_private.hh"
+#include "launchpad-process-pool/process_pool.hh"
namespace launchpad {
namespace {
channel_.reset(
new IOChannel(socket_->GetFd(), IOChannel::IOCondition::IO_IN, this));
+ ProcessPool::MarkCloseableFd(socket_->GetFd());
}
HydraSigchldEvent::~HydraSigchldEvent() {
#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;
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());
on_boot_timer_ = 0;
}
+ ProcessPool::RemoveFdFromCloseableFds(client_socket_->GetFd());
client_channel_.reset();
client_socket_.reset();
prepared_ = false;
if (IsHydraMode()) SetPid(peer_cred->GetPid());
+ ProcessPool::MarkCloseableFd(client_socket_->GetFd());
prepared_ = true;
if (listener_ != nullptr) {
CreateReadyFile();
#include "launchpad-process-pool/process_pool.hh"
-#include <dlog-redirect-stdout.h>
#include <errno.h>
#include <fcntl.h>
#include <linux/limits.h>
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
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);
}
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
void HandleSigchld(pid_t pid);
void SetTimer();
+ static void MarkCloseableFd(int fd);
+ static void RemoveFdFromCloseableFds(int fd);
+
private:
class Process {
public:
#include <unistd.h>
#include "launchpad-process-pool/log_private.hh"
+#include "launchpad-process-pool/process_pool.hh"
namespace launchpad {
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();
}