Switch PalPtrace to Rusty error handling.

This commit is contained in:
4lDO2
2024-09-27 13:14:29 +02:00
parent d474163e0e
commit 070b4cd05c
4 changed files with 40 additions and 13 deletions
+5 -2
View File
@@ -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()
}
+9 -3
View File
@@ -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<c_int> {
Ok(unsafe { e_raw(syscall!(PTRACE, request, pid, addr, data))? as c_int })
}
}
+10 -2
View File
@@ -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<c_int>;
}
+16 -6
View File
@@ -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<c_int, Errno> {
inner_ptrace(request, pid, addr, data)
.map_err(|err| Errno(err.raw_os_error().unwrap_or(EIO)))
}
}