1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 13:18:13 +00:00

Kernel: Use Userspace<T> in ptrace syscall

This commit is contained in:
Brian Gianforcaro 2020-08-01 15:25:19 -07:00 committed by Andreas Kling
parent 85b2413403
commit 1209bf82c1
4 changed files with 17 additions and 16 deletions

View file

@ -98,7 +98,7 @@ KResultOr<u32> handle_syscall(const Kernel::Syscall::SC_ptrace_params& params, P
if (!tracer->has_regs())
return KResult(-EINVAL);
auto* regs = reinterpret_cast<PtraceRegisters*>(params.addr);
auto* regs = reinterpret_cast<PtraceRegisters*>(params.addr.unsafe_userspace_ptr());
if (!caller.validate_write_typed(regs))
return KResult(-EFAULT);
copy_to_user(regs, &tracer->regs());
@ -110,7 +110,7 @@ KResultOr<u32> handle_syscall(const Kernel::Syscall::SC_ptrace_params& params, P
return KResult(-EINVAL);
PtraceRegisters regs;
if (!caller.validate_read_and_copy_typed(&regs, (const PtraceRegisters*)params.addr))
if (!caller.validate_read_and_copy_typed(&regs, (const PtraceRegisters*)params.addr.unsafe_userspace_ptr()))
return KResult(-EFAULT);
auto& peer_saved_registers = peer->get_register_dump_from_stack();
@ -125,8 +125,9 @@ KResultOr<u32> handle_syscall(const Kernel::Syscall::SC_ptrace_params& params, P
case PT_PEEK: {
Kernel::Syscall::SC_ptrace_peek_params peek_params;
if (!caller.validate_read_and_copy_typed(&peek_params, reinterpret_cast<Kernel::Syscall::SC_ptrace_peek_params*>(params.addr)))
if (!caller.validate_read_and_copy_typed(&peek_params, reinterpret_cast<Kernel::Syscall::SC_ptrace_peek_params*>(params.addr.unsafe_userspace_ptr())))
return -EFAULT;
// read validation is done inside 'peek_user_data'
auto result = peer->process().peek_user_data(peek_params.address);
if (result.is_error())
@ -138,7 +139,7 @@ KResultOr<u32> handle_syscall(const Kernel::Syscall::SC_ptrace_params& params, P
}
case PT_POKE: {
u32* addr = reinterpret_cast<u32*>(params.addr);
Userspace<u32*> addr = reinterpret_cast<FlatPtr>(params.addr.ptr());
// write validation is done inside 'poke_user_data'
return peer->process().poke_user_data(addr, params.data);
}