From 2cbfe70a281b7dde3f5871937796f132f29897ec Mon Sep 17 00:00:00 2001 From: Bananymous Date: Sun, 20 Apr 2025 18:18:32 +0300 Subject: [PATCH] DynamicLoader: Don't leak fds --- userspace/programs/DynamicLoader/main.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/userspace/programs/DynamicLoader/main.cpp b/userspace/programs/DynamicLoader/main.cpp index 5f495316..e7d4165b 100644 --- a/userspace/programs/DynamicLoader/main.cpp +++ b/userspace/programs/DynamicLoader/main.cpp @@ -700,11 +700,7 @@ static void handle_dynamic(LoadedElf& elf) if (auto ret = syscall(SYS_REALPATH, path_buffer, realpath); ret < 0) print_error_and_exit("realpath", ret); - int library_fd = syscall(SYS_OPENAT, AT_FDCWD, realpath, O_RDONLY); - if (library_fd < 0) - print_error_and_exit("could not open library", library_fd); - - const auto& loaded_elf = load_elf(realpath, library_fd); + const auto& loaded_elf = load_elf(realpath, -1); dynamic.d_un.d_ptr = reinterpret_cast(&loaded_elf); } @@ -844,6 +840,9 @@ static LoadedElf& load_elf(const char* path, int fd) if (strcmp(s_loaded_files[i].path, path) == 0) return s_loaded_files[i]; + if (fd == -1 && (fd = syscall(SYS_OPENAT, AT_FDCWD, path, O_RDONLY)) < 0) + print_error_and_exit("could not open library", fd); + ElfNativeFileHeader file_header; if (auto ret = syscall(SYS_READ, fd, &file_header, sizeof(file_header)); ret != sizeof(file_header)) print_error_and_exit("could not read file header", ret);