From 070b4cd05ce0494a390cee653c505409c3436bfb Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Fri, 27 Sep 2024 13:14:29 +0200 Subject: [PATCH] Switch PalPtrace to Rusty error handling. --- src/header/sys_ptrace/mod.rs | 7 +++++-- src/platform/linux/ptrace.rs | 12 +++++++++--- src/platform/pal/ptrace.rs | 12 ++++++++++-- src/platform/redox/ptrace.rs | 22 ++++++++++++++++------ 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/src/header/sys_ptrace/mod.rs b/src/header/sys_ptrace/mod.rs index 5982815198..cc0958c2c5 100644 --- a/src/header/sys_ptrace/mod.rs +++ b/src/header/sys_ptrace/mod.rs @@ -1,6 +1,9 @@ //! ptrace compatibility layer for Redox OS -use crate::platform::{types::*, PalPtrace, Sys}; +use crate::{ + error::ResultExt, + platform::{types::*, PalPtrace, Sys}, +}; use core::ffi::VaList; pub const PTRACE_TRACEME: c_int = 0; @@ -25,5 +28,5 @@ pub const PTRACE_SYSEMU_SINGLESTEP: c_int = 32; #[no_mangle] pub unsafe extern "C" fn ptrace(request: c_int, mut __valist: ...) -> c_int { // Musl also just grabs the arguments from the varargs... - Sys::ptrace(request, __valist.arg(), __valist.arg(), __valist.arg()) + Sys::ptrace(request, __valist.arg(), __valist.arg(), __valist.arg()).or_minus_one_errno() } diff --git a/src/platform/linux/ptrace.rs b/src/platform/linux/ptrace.rs index c6dbaeeba1..d05a1073b1 100644 --- a/src/platform/linux/ptrace.rs +++ b/src/platform/linux/ptrace.rs @@ -1,10 +1,16 @@ use super::{ super::{types::*, PalPtrace}, - e, Sys, + e_raw, Sys, }; +use crate::error::Result; impl PalPtrace for Sys { - fn ptrace(request: c_int, pid: pid_t, addr: *mut c_void, data: *mut c_void) -> c_int { - unsafe { e(syscall!(PTRACE, request, pid, addr, data)) as c_int } + unsafe fn ptrace( + request: c_int, + pid: pid_t, + addr: *mut c_void, + data: *mut c_void, + ) -> Result { + Ok(unsafe { e_raw(syscall!(PTRACE, request, pid, addr, data))? as c_int }) } } diff --git a/src/platform/pal/ptrace.rs b/src/platform/pal/ptrace.rs index cc13ebbb68..7e68a81d45 100644 --- a/src/platform/pal/ptrace.rs +++ b/src/platform/pal/ptrace.rs @@ -1,5 +1,13 @@ -use super::super::{types::*, Pal}; +use crate::{ + error::Result, + platform::{types::*, Pal}, +}; pub trait PalPtrace: Pal { - fn ptrace(request: c_int, pid: pid_t, addr: *mut c_void, data: *mut c_void) -> c_int; + unsafe fn ptrace( + request: c_int, + pid: pid_t, + addr: *mut c_void, + data: *mut c_void, + ) -> Result; } diff --git a/src/platform/redox/ptrace.rs b/src/platform/redox/ptrace.rs index e35f24b7e1..1f0100af2f 100644 --- a/src/platform/redox/ptrace.rs +++ b/src/platform/redox/ptrace.rs @@ -11,8 +11,12 @@ use crate::header::arch_aarch64_user::user_regs_struct; use crate::header::arch_x64_user::user_regs_struct; use crate::{ c_str::{CStr, CString}, + error::Errno, fs::File, - header::{errno as errnoh, fcntl, signal, sys_ptrace}, + header::{ + errno::{self as errnoh, EIO}, + fcntl, signal, sys_ptrace, + }, io::{self, prelude::*}, sync::Mutex, }; @@ -104,7 +108,7 @@ pub fn get_session( } #[cfg(target_arch = "aarch64")] -fn inner_ptrace( +unsafe fn inner_ptrace( request: c_int, pid: pid_t, addr: *mut c_void, @@ -115,7 +119,7 @@ fn inner_ptrace( } #[cfg(target_arch = "x86")] -fn inner_ptrace( +unsafe fn inner_ptrace( request: c_int, pid: pid_t, addr: *mut c_void, @@ -126,7 +130,7 @@ fn inner_ptrace( } #[cfg(target_arch = "x86_64")] -fn inner_ptrace( +unsafe fn inner_ptrace( request: c_int, pid: pid_t, addr: *mut c_void, @@ -253,7 +257,13 @@ fn inner_ptrace( } impl PalPtrace for Sys { - fn ptrace(request: c_int, pid: pid_t, addr: *mut c_void, data: *mut c_void) -> c_int { - inner_ptrace(request, pid, addr, data).unwrap_or(-1) + unsafe fn ptrace( + request: c_int, + pid: pid_t, + addr: *mut c_void, + data: *mut c_void, + ) -> Result { + inner_ptrace(request, pid, addr, data) + .map_err(|err| Errno(err.raw_os_error().unwrap_or(EIO))) } }