diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index a441dd4681..695ec26c82 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -3280,9 +3280,9 @@ int Process::sys$accept(int accepting_socket_fd, sockaddr* user_address, socklen return accepted_socket_fd; } -int Process::sys$connect(int sockfd, const sockaddr* address, socklen_t address_size) +int Process::sys$connect(int sockfd, const sockaddr* user_address, socklen_t user_address_size) { - if (!validate_read(address, address_size)) + if (!validate_read(user_address, user_address_size)) return -EFAULT; int fd = alloc_fd(); if (fd < 0) @@ -3295,8 +3295,12 @@ int Process::sys$connect(int sockfd, const sockaddr* address, socklen_t address_ auto& socket = *description->socket(); REQUIRE_PROMISE_FOR_SOCKET_DOMAIN(socket.domain()); - SmapDisabler disabler; - return socket.connect(*description, address, address_size, description->is_blocking() ? ShouldBlock::Yes : ShouldBlock::No); + + u8 address[sizeof(sockaddr_un)]; + size_t address_size = min(sizeof(address), static_cast(user_address_size)); + copy_from_user(address, user_address, address_size); + + return socket.connect(*description, (const sockaddr*)address, address_size, description->is_blocking() ? ShouldBlock::Yes : ShouldBlock::No); } int Process::sys$shutdown(int sockfd, int how)