diff options
Diffstat (limited to 'Kernel/Syscalls/socket.cpp')
-rw-r--r-- | Kernel/Syscalls/socket.cpp | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/Kernel/Syscalls/socket.cpp b/Kernel/Syscalls/socket.cpp index ede0d11370..2fdf7f8b3b 100644 --- a/Kernel/Syscalls/socket.cpp +++ b/Kernel/Syscalls/socket.cpp @@ -52,15 +52,17 @@ int Process::sys$socket(int domain, int type, int protocol) auto result = Socket::create(domain, type, protocol); if (result.is_error()) return result.error(); - auto description = FileDescription::create(*result.value()); - description->set_readable(true); - description->set_writable(true); + auto description_result = FileDescription::create(*result.value()); + if (description_result.is_error()) + return description_result.error(); + description_result.value()->set_readable(true); + description_result.value()->set_writable(true); unsigned flags = 0; if (type & SOCK_CLOEXEC) flags |= FD_CLOEXEC; if (type & SOCK_NONBLOCK) - description->set_blocking(false); - m_fds[fd].set(move(description), flags); + description_result.value()->set_blocking(false); + m_fds[fd].set(description_result.release_value(), flags); return fd; } @@ -132,13 +134,16 @@ int Process::sys$accept(int accepting_socket_fd, Userspace<sockaddr*> user_addre return -EFAULT; } - auto accepted_socket_description = FileDescription::create(*accepted_socket); - accepted_socket_description->set_readable(true); - accepted_socket_description->set_writable(true); + auto accepted_socket_description_result = FileDescription::create(*accepted_socket); + if (accepted_socket_description_result.is_error()) + return accepted_socket_description_result.error(); + + accepted_socket_description_result.value()->set_readable(true); + accepted_socket_description_result.value()->set_writable(true); // NOTE: The accepted socket inherits fd flags from the accepting socket. // I'm not sure if this matches other systems but it makes sense to me. - accepted_socket_description->set_blocking(accepting_socket_description->is_blocking()); - m_fds[accepted_socket_fd].set(move(accepted_socket_description), m_fds[accepting_socket_fd].flags()); + accepted_socket_description_result.value()->set_blocking(accepting_socket_description->is_blocking()); + m_fds[accepted_socket_fd].set(accepted_socket_description_result.release_value(), m_fds[accepting_socket_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); |