From f8fba5f0175d9bb27a08e1278f81d4aea3ba1012 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 5 Sep 2021 15:54:53 +0200 Subject: [PATCH] Kernel: Use TRY() in sys$socket() and friends --- Kernel/Syscalls/socket.cpp | 53 ++++++++++++-------------------------- 1 file changed, 17 insertions(+), 36 deletions(-) diff --git a/Kernel/Syscalls/socket.cpp b/Kernel/Syscalls/socket.cpp index af0959dabd..668db5047e 100644 --- a/Kernel/Syscalls/socket.cpp +++ b/Kernel/Syscalls/socket.cpp @@ -38,18 +38,11 @@ KResultOr Process::sys$socket(int domain, int type, int protocol) if ((type & SOCK_TYPE_MASK) == SOCK_RAW && !is_superuser()) return EACCES; - auto fd_or_error = m_fds.allocate(); - if (fd_or_error.is_error()) - return fd_or_error.error(); - auto socket_fd = fd_or_error.release_value(); - auto result = Socket::create(domain, type, protocol); - if (result.is_error()) - return result.error(); - auto description_result = FileDescription::try_create(*result.value()); - if (description_result.is_error()) - return description_result.error(); - setup_socket_fd(socket_fd.fd, description_result.value(), type); - return socket_fd.fd; + auto fd_allocation = TRY(m_fds.allocate()); + auto socket = TRY(Socket::create(domain, type, protocol)); + auto description = TRY(FileDescription::try_create(socket)); + setup_socket_fd(fd_allocation.fd, move(description), type); + return fd_allocation.fd; } KResultOr Process::sys$bind(int sockfd, Userspace address, socklen_t address_length) @@ -100,10 +93,7 @@ KResultOr Process::sys$accept4(Userspace(user_address_size))) return EFAULT; - 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.release_value(); + auto fd_allocation = TRY(m_fds.allocate()); auto accepting_socket_description = fds().file_description(accepting_socket_fd); if (!accepting_socket_description) return EBADF; @@ -133,22 +123,20 @@ KResultOr Process::sys$accept4(Userspaceset_readable(true); - accepted_socket_description_result.value()->set_writable(true); + accepted_socket_description->set_readable(true); + accepted_socket_description->set_writable(true); if (flags & SOCK_NONBLOCK) - accepted_socket_description_result.value()->set_blocking(false); + accepted_socket_description->set_blocking(false); int fd_flags = 0; if (flags & SOCK_CLOEXEC) fd_flags |= FD_CLOEXEC; - m_fds[accepted_socket_fd.fd].set(accepted_socket_description_result.release_value(), fd_flags); + m_fds[fd_allocation.fd].set(move(accepted_socket_description), fd_flags); // NOTE: Moving this state to Completed is what causes connect() to unblock on the client side. accepted_socket->set_setup_state(Socket::SetupState::Completed); - return accepted_socket_fd.fd; + return fd_allocation.fd; } KResultOr Process::sys$connect(int sockfd, Userspace user_address, socklen_t user_address_size) @@ -406,21 +394,14 @@ KResultOr Process::sys$socketpair(Userspace