Browse Source

Kernel: Use Userspace<T> for the getpeername syscall

Brian Gianforcaro 5 years ago
parent
commit
dc75ea9fc2
3 changed files with 11 additions and 4 deletions
  1. 2 2
      Kernel/API/Syscall.h
  2. 8 1
      Kernel/Process.h
  3. 1 1
      Kernel/Syscalls/socket.cpp

+ 2 - 2
Kernel/API/Syscall.h

@@ -326,8 +326,8 @@ struct SC_getsockname_params {
 
 
 struct SC_getpeername_params {
 struct SC_getpeername_params {
     int sockfd;
     int sockfd;
-    sockaddr* addr;
-    socklen_t* addrlen;
+    Userspace<sockaddr*> addr;
+    Userspace<socklen_t*> addrlen;
 };
 };
 
 
 struct SC_futex_params {
 struct SC_futex_params {

+ 8 - 1
Kernel/Process.h

@@ -298,7 +298,7 @@ public:
     int sys$getsockopt(const Syscall::SC_getsockopt_params*);
     int sys$getsockopt(const Syscall::SC_getsockopt_params*);
     int sys$setsockopt(const Syscall::SC_setsockopt_params*);
     int sys$setsockopt(const Syscall::SC_setsockopt_params*);
     int sys$getsockname(const Syscall::SC_getsockname_params*);
     int sys$getsockname(const Syscall::SC_getsockname_params*);
-    int sys$getpeername(const Syscall::SC_getpeername_params*);
+    int sys$getpeername(Userspace<const Syscall::SC_getpeername_params*>);
     int sys$sched_setparam(pid_t pid, Userspace<const struct sched_param*>);
     int sys$sched_setparam(pid_t pid, Userspace<const struct sched_param*>);
     int sys$sched_getparam(pid_t pid, Userspace<struct sched_param*>);
     int sys$sched_getparam(pid_t pid, Userspace<struct sched_param*>);
     int sys$create_thread(void* (*)(void*), Userspace<const Syscall::SC_create_thread_params*>);
     int sys$create_thread(void* (*)(void*), Userspace<const Syscall::SC_create_thread_params*>);
@@ -422,6 +422,13 @@ public:
         return validated;
         return validated;
     }
     }
 
 
+    template<typename T>
+    [[nodiscard]] bool validate_read_and_copy_typed(T* dest, Userspace<T*> src)
+    {
+        Userspace<const T*> const_src { src.ptr() };
+        return validate_read_and_copy_typed(dest, const_src);
+    }
+
     template<typename T>
     template<typename T>
     [[nodiscard]] bool validate_write_typed(T* value, size_t count = 1)
     [[nodiscard]] bool validate_write_typed(T* value, size_t count = 1)
     {
     {

+ 1 - 1
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<true>(params);
     return get_sock_or_peer_name<true>(params);
 }
 }
 
 
-int Process::sys$getpeername(const Syscall::SC_getpeername_params* user_params)
+int Process::sys$getpeername(Userspace<const Syscall::SC_getpeername_params*> user_params)
 {
 {
     Syscall::SC_getpeername_params params;
     Syscall::SC_getpeername_params params;
     if (!validate_read_and_copy_typed(&params, user_params))
     if (!validate_read_and_copy_typed(&params, user_params))