diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index d83c7470d2..4ce3f826af 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -465,14 +465,14 @@ size_t Process::FileDescriptions::open_count() const return count; } -int Process::FileDescriptions::allocate(int first_candidate_fd) +KResultOr Process::FileDescriptions::allocate(int first_candidate_fd) { ScopedSpinLock lock(m_fds_lock); for (size_t i = first_candidate_fd; i < max_open(); ++i) { if (!m_fds_metadatas[i]) return i; } - return -EMFILE; + return KResult(EMFILE); } Time kgettimeofday() diff --git a/Kernel/Process.h b/Kernel/Process.h index 662c46a8c5..ec8fa927a3 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -641,7 +641,7 @@ public: void enumerate(Function) const; void change_each(Function); - int allocate(int first_candidate_fd = 0); + KResultOr allocate(int first_candidate_fd = 0); size_t open_count() const; bool try_resize(size_t size) { return m_fds_metadatas.try_resize(size); } diff --git a/Kernel/Syscalls/anon_create.cpp b/Kernel/Syscalls/anon_create.cpp index 35344af9ea..e20171ce09 100644 --- a/Kernel/Syscalls/anon_create.cpp +++ b/Kernel/Syscalls/anon_create.cpp @@ -25,10 +25,10 @@ KResultOr Process::sys$anon_create(size_t size, int options) if (size > NumericLimits::max()) return EINVAL; - int new_fd = m_fds.allocate(); - if (new_fd < 0) - return new_fd; - + auto new_fd_or_error = m_fds.allocate(); + if (new_fd_or_error.is_error()) + return new_fd_or_error.error(); + auto new_fd = new_fd_or_error.value(); auto vmobject = AnonymousVMObject::try_create_purgeable_with_size(size, AllocationStrategy::Reserve); if (!vmobject) return ENOMEM; diff --git a/Kernel/Syscalls/execve.cpp b/Kernel/Syscalls/execve.cpp index f7c7517189..090551998d 100644 --- a/Kernel/Syscalls/execve.cpp +++ b/Kernel/Syscalls/execve.cpp @@ -591,7 +591,7 @@ KResult Process::do_exec(NonnullRefPtr main_program_description int main_program_fd = -1; if (interpreter_description) { - main_program_fd = m_fds.allocate(); + main_program_fd = m_fds.allocate().value(); VERIFY(main_program_fd >= 0); auto seek_result = main_program_description->seek(0, SEEK_SET); VERIFY(!seek_result.is_error()); diff --git a/Kernel/Syscalls/fcntl.cpp b/Kernel/Syscalls/fcntl.cpp index 19d978def0..f6871913f0 100644 --- a/Kernel/Syscalls/fcntl.cpp +++ b/Kernel/Syscalls/fcntl.cpp @@ -25,9 +25,10 @@ KResultOr Process::sys$fcntl(int fd, int cmd, u32 arg) int arg_fd = (int)arg; if (arg_fd < 0) return EINVAL; - int new_fd = fds().allocate(arg_fd); - if (new_fd < 0) - return new_fd; + auto new_fd_or_error = fds().allocate(arg_fd); + if (new_fd_or_error.is_error()) + return new_fd_or_error.error(); + auto new_fd = new_fd_or_error.value(); m_fds[new_fd].set(*description); return new_fd; } diff --git a/Kernel/Syscalls/inode_watcher.cpp b/Kernel/Syscalls/inode_watcher.cpp index 5667865bc2..ae09d51c42 100644 --- a/Kernel/Syscalls/inode_watcher.cpp +++ b/Kernel/Syscalls/inode_watcher.cpp @@ -18,9 +18,10 @@ KResultOr Process::sys$create_inode_watcher(u32 flags) VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) REQUIRE_PROMISE(rpath); - int fd = m_fds.allocate(); - if (fd < 0) - return fd; + auto fd_or_error = m_fds.allocate(); + if (fd_or_error.is_error()) + return fd_or_error.error(); + auto fd = fd_or_error.value(); auto watcher_or_error = InodeWatcher::create(); if (watcher_or_error.is_error()) diff --git a/Kernel/Syscalls/open.cpp b/Kernel/Syscalls/open.cpp index f6a2b2a4eb..71d8c016cb 100644 --- a/Kernel/Syscalls/open.cpp +++ b/Kernel/Syscalls/open.cpp @@ -45,10 +45,11 @@ KResultOr Process::sys$open(Userspace u return path.error(); dbgln_if(IO_DEBUG, "sys$open(dirfd={}, path='{}', options={}, mode={})", dirfd, path.value()->view(), options, mode); - int fd = m_fds.allocate(); - if (fd < 0) - return fd; + auto fd_or_error = m_fds.allocate(); + if (fd_or_error.is_error()) + return fd_or_error.error(); + auto fd = fd_or_error.value(); RefPtr base; if (dirfd == AT_FDCWD) { base = current_directory(); diff --git a/Kernel/Syscalls/pipe.cpp b/Kernel/Syscalls/pipe.cpp index 55af36748d..d2bd73e5f2 100644 --- a/Kernel/Syscalls/pipe.cpp +++ b/Kernel/Syscalls/pipe.cpp @@ -30,13 +30,19 @@ KResultOr Process::sys$pipe(int pipefd[2], int flags) if (open_writer_result.is_error()) return open_writer_result.error(); - int reader_fd = m_fds.allocate(); + auto reader_fd_or_error = m_fds.allocate(); + if (reader_fd_or_error.is_error()) + return reader_fd_or_error.error(); + auto reader_fd = reader_fd_or_error.value(); m_fds[reader_fd].set(open_reader_result.release_value(), fd_flags); m_fds[reader_fd].description()->set_readable(true); if (!copy_to_user(&pipefd[0], &reader_fd)) return EFAULT; - int writer_fd = m_fds.allocate(); + auto writer_fd_or_error = m_fds.allocate(); + if (writer_fd_or_error.is_error()) + return writer_fd_or_error.error(); + auto writer_fd = writer_fd_or_error.value(); m_fds[writer_fd].set(open_writer_result.release_value(), fd_flags); m_fds[writer_fd].description()->set_writable(true); if (!copy_to_user(&pipefd[1], &writer_fd)) diff --git a/Kernel/Syscalls/sendfd.cpp b/Kernel/Syscalls/sendfd.cpp index a3b8eb2871..ba7e2c1d48 100644 --- a/Kernel/Syscalls/sendfd.cpp +++ b/Kernel/Syscalls/sendfd.cpp @@ -46,9 +46,10 @@ KResultOr Process::sys$recvfd(int sockfd, int options) if (!socket.is_local()) return EAFNOSUPPORT; - int new_fd = m_fds.allocate(); - if (new_fd < 0) - return new_fd; + auto new_fd_or_error = m_fds.allocate(); + if (new_fd_or_error.is_error()) + return new_fd_or_error.error(); + auto new_fd = new_fd_or_error.value(); auto& local_socket = static_cast(socket); auto received_descriptor_or_error = local_socket.recvfd(*socket_description); diff --git a/Kernel/Syscalls/socket.cpp b/Kernel/Syscalls/socket.cpp index 6afccea00b..87d75ce368 100644 --- a/Kernel/Syscalls/socket.cpp +++ b/Kernel/Syscalls/socket.cpp @@ -39,9 +39,10 @@ KResultOr Process::sys$socket(int domain, int type, int protocol) if ((type & SOCK_TYPE_MASK) == SOCK_RAW && !is_superuser()) return EACCES; - int fd = m_fds.allocate(); - if (fd < 0) - return fd; + auto fd_or_error = m_fds.allocate(); + if (fd_or_error.is_error()) + return fd_or_error.error(); + auto fd = fd_or_error.value(); auto result = Socket::create(domain, type, protocol); if (result.is_error()) return result.error(); @@ -100,9 +101,10 @@ KResultOr Process::sys$accept4(Userspace(user_address_size))) return EFAULT; - int accepted_socket_fd = m_fds.allocate(); - if (accepted_socket_fd < 0) - return accepted_socket_fd; + auto accepted_socket_fd_or_error = m_fds.allocate(); + if (accepted_socket_fd_or_error.is_error()) + return accepted_socket_fd_or_error.error(); + auto accepted_socket_fd = accepted_socket_fd_or_error.value(); auto accepting_socket_description = fds().file_description(accepting_socket_fd); if (!accepting_socket_description) return EBADF; @@ -411,23 +413,22 @@ KResultOr Process::sys$socketpair(Userspace