diff --git a/Kernel/Process.h b/Kernel/Process.h index 13efccd7aa..1720b2b48b 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -293,7 +293,7 @@ public: int sys$socket(int domain, int type, int protocol); int sys$bind(int sockfd, Userspace addr, socklen_t); int sys$listen(int sockfd, int backlog); - int sys$accept(int sockfd, sockaddr*, socklen_t*); + int sys$accept(int sockfd, Userspace, Userspace); int sys$connect(int sockfd, const sockaddr*, socklen_t); int sys$shutdown(int sockfd, int how); ssize_t sys$sendto(const Syscall::SC_sendto_params*); diff --git a/Kernel/Syscalls/socket.cpp b/Kernel/Syscalls/socket.cpp index f63b870f31..b7112a25b6 100644 --- a/Kernel/Syscalls/socket.cpp +++ b/Kernel/Syscalls/socket.cpp @@ -93,7 +93,7 @@ int Process::sys$listen(int sockfd, int backlog) return socket.listen(backlog); } -int Process::sys$accept(int accepting_socket_fd, sockaddr* user_address, socklen_t* user_address_size) +int Process::sys$accept(int accepting_socket_fd, Userspace user_address, Userspace user_address_size) { REQUIRE_PROMISE(accept); @@ -101,7 +101,8 @@ int Process::sys$accept(int accepting_socket_fd, sockaddr* user_address, socklen if (user_address) { if (!validate_write_typed(user_address_size)) return -EFAULT; - copy_from_user(&address_size, user_address_size); + if (!validate_read_and_copy_typed(&address_size, user_address_size)) + return -EFAULT; if (!validate_write(user_address, address_size)) return -EFAULT; }