diff --git a/Kernel/API/Syscall.h b/Kernel/API/Syscall.h index 0c5511166dc..1a24be437ca 100644 --- a/Kernel/API/Syscall.h +++ b/Kernel/API/Syscall.h @@ -326,8 +326,8 @@ struct SC_getsockname_params { struct SC_getpeername_params { int sockfd; - sockaddr* addr; - socklen_t* addrlen; + Userspace addr; + Userspace addrlen; }; struct SC_futex_params { diff --git a/Kernel/Process.h b/Kernel/Process.h index d62d6cb21c5..572b6169dc9 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -298,7 +298,7 @@ public: int sys$getsockopt(const Syscall::SC_getsockopt_params*); int sys$setsockopt(const Syscall::SC_setsockopt_params*); int sys$getsockname(const Syscall::SC_getsockname_params*); - int sys$getpeername(const Syscall::SC_getpeername_params*); + int sys$getpeername(Userspace); int sys$sched_setparam(pid_t pid, Userspace); int sys$sched_getparam(pid_t pid, Userspace); int sys$create_thread(void* (*)(void*), Userspace); @@ -422,6 +422,13 @@ public: return validated; } + template + [[nodiscard]] bool validate_read_and_copy_typed(T* dest, Userspace src) + { + Userspace const_src { src.ptr() }; + return validate_read_and_copy_typed(dest, const_src); + } + template [[nodiscard]] bool validate_write_typed(T* value, size_t count = 1) { diff --git a/Kernel/Syscalls/socket.cpp b/Kernel/Syscalls/socket.cpp index 1aaae4e9f83..1ed6730d5bd 100644 --- a/Kernel/Syscalls/socket.cpp +++ b/Kernel/Syscalls/socket.cpp @@ -308,7 +308,7 @@ int Process::sys$getsockname(const Syscall::SC_getsockname_params* user_params) return get_sock_or_peer_name(params); } -int Process::sys$getpeername(const Syscall::SC_getpeername_params* user_params) +int Process::sys$getpeername(Userspace user_params) { Syscall::SC_getpeername_params params; if (!validate_read_and_copy_typed(¶ms, user_params))