From 5afa62e541b67a5ebd03a8783858484afc7920e1 Mon Sep 17 00:00:00 2001 From: Yinan Xu Date: Thu, 20 Apr 2023 16:47:04 +0800 Subject: Close file descriptors in destructor of syscall_t --- fesvr/syscall.cc | 13 ++++++++++--- fesvr/syscall.h | 2 ++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/fesvr/syscall.cc b/fesvr/syscall.cc index 875ffb7..e277be1 100644 --- a/fesvr/syscall.cc +++ b/fesvr/syscall.cc @@ -174,9 +174,16 @@ syscall_t::syscall_t(htif_t* htif) if (stdin_fd < 0 || stdout_fd0 < 0 || stdout_fd1 < 0) throw std::runtime_error("could not dup stdin/stdout"); - fds.alloc(stdin_fd); // stdin -> stdin - fds.alloc(stdout_fd0); // stdout -> stdout - fds.alloc(stdout_fd1); // stderr -> stdout + fds_index.push_back(fds.alloc(stdin_fd)); // stdin -> stdin + fds_index.push_back(fds.alloc(stdout_fd0)); // stdout -> stdout + fds_index.push_back(fds.alloc(stdout_fd1)); // stderr -> stdout +} + +syscall_t::~syscall_t() { + for (auto i: fds_index) { + close(fds.lookup(i)); + fds.dealloc(i); + } } std::string syscall_t::do_chroot(const char* fn) diff --git a/fesvr/syscall.h b/fesvr/syscall.h index 4915efd..c002e6c 100644 --- a/fesvr/syscall.h +++ b/fesvr/syscall.h @@ -28,6 +28,7 @@ class syscall_t : public device_t { public: syscall_t(htif_t*); + ~syscall_t(); void set_chroot(const char* where); @@ -38,6 +39,7 @@ class syscall_t : public device_t memif_t* memif; std::vector table; fds_t fds; + std::vector fds_index; void handle_syscall(command_t cmd); void dispatch(addr_t mm); -- cgit v1.1