diff --git a/AK/Userspace.h b/AK/Userspace.h index eb6bb0c44a..244fc5fb6a 100644 --- a/AK/Userspace.h +++ b/AK/Userspace.h @@ -26,6 +26,7 @@ #pragma once +#include #include #include @@ -59,6 +60,7 @@ public: Userspace(FlatPtr ptr) : m_ptr(ptr) { + ASSERT(m_ptr < 0xc0000000); } FlatPtr ptr() const { return m_ptr; } diff --git a/Kernel/Ptrace.cpp b/Kernel/Ptrace.cpp index 61b6028670..656e200606 100644 --- a/Kernel/Ptrace.cpp +++ b/Kernel/Ptrace.cpp @@ -129,21 +129,20 @@ KResultOr handle_syscall(const Kernel::Syscall::SC_ptrace_params& params, P Kernel::Syscall::SC_ptrace_peek_params peek_params; if (!copy_from_user(&peek_params, reinterpret_cast(params.addr))) return -EFAULT; - - // read validation is done inside 'peek_user_data' - auto result = peer->process().peek_user_data((FlatPtr)peek_params.address); - if (result.is_error()) + if (!is_user_address(VirtualAddress { peek_params.address })) return -EFAULT; + auto result = peer->process().peek_user_data(Userspace { (FlatPtr)peek_params.address }); + if (result.is_error()) + return result.error(); if (!copy_to_user(peek_params.out_data, &result.value())) return -EFAULT; break; } - case PT_POKE: { - Userspace addr = reinterpret_cast(params.addr); - // write validation is done inside 'poke_user_data' - return peer->process().poke_user_data(addr, params.data); - } + case PT_POKE: + if (!is_user_address(VirtualAddress { params.addr })) + return -EFAULT; + return peer->process().poke_user_data(Userspace { (FlatPtr)params.addr }, params.data); default: return -EINVAL;