From 384e2f24d41aad4ad42aa6eff7783e924fea98fc Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 26 Oct 2018 14:30:13 +0200 Subject: [PATCH] Add per-task limit for open fd's. Hard-coded at 16 for now. --- Kernel/Task.cpp | 31 +++++++++---------------------- Kernel/Task.h | 3 +-- 2 files changed, 10 insertions(+), 24 deletions(-) diff --git a/Kernel/Task.cpp b/Kernel/Task.cpp index 9034a1ebbd5..c26041d70a8 100644 --- a/Kernel/Task.cpp +++ b/Kernel/Task.cpp @@ -746,31 +746,18 @@ int Task::sys$getcwd(char* buffer, size_t size) int Task::sys$open(const char* path, size_t pathLength) { - Task::checkSanity("sys$open"); #ifdef DEBUG_IO kprintf("Task::sys$open(): PID=%u, path=%s {%u}\n", m_pid, path, pathLength); #endif - auto* handle = openFile(String(path, pathLength)); - if (handle) - return handle->fd(); - return -1; -} - -FileHandle* Task::openFile(String&& path) -{ - auto handle = VirtualFileSystem::the().open(move(path), m_cwd.ptr()); - if (!handle) { -#ifdef DEBUG_IO - kprintf("vfs::open() failed\n"); -#endif - return nullptr; - } - handle->setFD(m_fileHandles.size()); -#ifdef DEBUG_IO - kprintf("vfs::open() worked! handle=%p, fd=%d\n", handle.ptr(), handle->fd()); -#endif - m_fileHandles.append(move(handle)); // FIXME: allow non-move Vector::append - return m_fileHandles.last().ptr(); + if (m_fileHandles.size() >= m_maxFileHandles) + return -EMFILE; + auto handle = VirtualFileSystem::the().open(String(path, pathLength), m_cwd.ptr()); + if (!handle) + return -ENOENT; // FIXME: Detailed error. + int fd = m_fileHandles.size(); + handle->setFD(fd); + m_fileHandles.append(move(handle)); + return fd; } int Task::sys$kill(pid_t pid, int sig) diff --git a/Kernel/Task.h b/Kernel/Task.h index 7cdc52e17b5..c5a1362d148 100644 --- a/Kernel/Task.h +++ b/Kernel/Task.h @@ -124,8 +124,6 @@ private: Task(String&& name, uid_t, gid_t, pid_t parentPID, RingLevel); - FileHandle* openFile(String&&); - void allocateLDT(); Task* m_prev { nullptr }; @@ -151,6 +149,7 @@ private: dword m_timesScheduled { 0 }; pid_t m_waitee { -1 }; int m_fdBlockedOnRead { -1 }; + size_t m_maxFileHandles { 16 }; RetainPtr m_cwd;