diff --git a/Kernel/API/Syscall.h b/Kernel/API/Syscall.h index 2408bea4f5..de83141dd8 100644 --- a/Kernel/API/Syscall.h +++ b/Kernel/API/Syscall.h @@ -40,7 +40,7 @@ enum class NeedsBigProcessLock { // - VERIFY_NO_PROCESS_BIG_LOCK(this) // #define ENUMERATE_SYSCALLS(S) \ - S(accept4, NeedsBigProcessLock::Yes) \ + S(accept4, NeedsBigProcessLock::No) \ S(access, NeedsBigProcessLock::Yes) \ S(adjtime, NeedsBigProcessLock::No) \ S(alarm, NeedsBigProcessLock::Yes) \ diff --git a/Kernel/Syscalls/socket.cpp b/Kernel/Syscalls/socket.cpp index 2b1aa95a5c..4aef64170b 100644 --- a/Kernel/Syscalls/socket.cpp +++ b/Kernel/Syscalls/socket.cpp @@ -78,7 +78,7 @@ ErrorOr Process::sys$listen(int sockfd, int backlog) ErrorOr Process::sys$accept4(Userspace user_params) { - VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) + VERIFY_NO_PROCESS_BIG_LOCK(this) TRY(require_promise(Pledge::accept)); auto params = TRY(copy_typed_from_user(user_params)); @@ -88,9 +88,8 @@ ErrorOr Process::sys$accept4(Userspace(user_address_size))); - } ScopedDescriptionAllocation fd_allocation; RefPtr accepting_socket_description; @@ -104,17 +103,17 @@ ErrorOr Process::sys$accept4(Userspacesocket(); - if (!socket.can_accept()) { - if (accepting_socket_description->is_blocking()) { - auto unblock_flags = Thread::FileBlocker::BlockFlags::None; - if (Thread::current()->block({}, *accepting_socket_description, unblock_flags).was_interrupted()) - return EINTR; - } else { + RefPtr accepted_socket; + for (;;) { + accepted_socket = socket.accept(); + if (accepted_socket) + break; + if (!accepting_socket_description->is_blocking()) return EAGAIN; - } + auto unblock_flags = Thread::FileBlocker::BlockFlags::None; + if (Thread::current()->block({}, *accepting_socket_description, unblock_flags).was_interrupted()) + return EINTR; } - auto accepted_socket = socket.accept(); - VERIFY(accepted_socket); if (user_address) { sockaddr_un address_buffer {};