From 8cfc7e8facd1cf40e8431245cea346e17236812f Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Fri, 18 Apr 2025 20:10:49 +0200 Subject: [PATCH] Do not treat ppid as constant. --- redox-rt/src/lib.rs | 5 +---- redox-rt/src/proc.rs | 2 -- redox-rt/src/protocol.rs | 2 ++ redox-rt/src/sys.rs | 11 +++++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/redox-rt/src/lib.rs b/redox-rt/src/lib.rs index 28c427fb72..6e5beb3ef6 100644 --- a/redox-rt/src/lib.rs +++ b/redox-rt/src/lib.rs @@ -203,7 +203,6 @@ pub unsafe fn initialize(#[cfg(feature = "proc")] proc_fd: FdGuard) { STATIC_PROC_INFO.get().write(StaticProcInfo { pid: metadata.pid, - ppid: metadata.ppid, #[cfg(feature = "proc")] proc_fd: MaybeUninit::new(proc_fd), @@ -228,10 +227,9 @@ pub unsafe fn initialize(#[cfg(feature = "proc")] proc_fd: FdGuard) { } } -#[repr(C)] // TODO: is this required? +#[repr(C)] // TODO: is repr(C) required? pub(crate) struct StaticProcInfo { pid: u32, - ppid: u32, // TODO: dynamic proc_fd: MaybeUninit, has_proc_fd: bool, } @@ -292,7 +290,6 @@ unsafe fn child_hook_common(args: ChildHookCommonArgs) { .get() .replace(StaticProcInfo { pid: metadata.pid, - ppid: metadata.ppid, has_proc_fd: args.new_proc_fd.is_some(), proc_fd: args .new_proc_fd diff --git a/redox-rt/src/proc.rs b/redox-rt/src/proc.rs index cc6e713292..3af59fbc90 100644 --- a/redox-rt/src/proc.rs +++ b/redox-rt/src/proc.rs @@ -970,7 +970,6 @@ pub unsafe fn make_init() -> [&'static FdGuard; 2] { STATIC_PROC_INFO.get().write(crate::StaticProcInfo { pid: 1, - ppid: 1, proc_fd: MaybeUninit::new(proc_fd), has_proc_fd: true, }); @@ -991,7 +990,6 @@ pub unsafe fn make_init() -> [&'static FdGuard; 2] { pub(crate) static STATIC_PROC_INFO: SyncUnsafeCell = SyncUnsafeCell::new(StaticProcInfo { pid: 0, - ppid: 0, proc_fd: MaybeUninit::zeroed(), has_proc_fd: false, }); diff --git a/redox-rt/src/protocol.rs b/redox-rt/src/protocol.rs index 1d5feeefdf..345078964e 100644 --- a/redox-rt/src/protocol.rs +++ b/redox-rt/src/protocol.rs @@ -34,6 +34,7 @@ pub enum ProcCall { // TODO: replace with sendfd equivalent syscall for sending memory SyncSigPctl = 10, Sigdeq = 11, + Getppid = 12, } #[derive(Clone, Copy, Debug, Eq, PartialEq)] #[repr(usize)] @@ -59,6 +60,7 @@ impl ProcCall { 9 => Self::Sigq, 10 => Self::SyncSigPctl, 11 => Self::Sigdeq, + 12 => Self::Getppid, _ => return None, }) } diff --git a/redox-rt/src/sys.rs b/redox-rt/src/sys.rs index d0a69da489..82ece48fdc 100644 --- a/redox-rt/src/sys.rs +++ b/redox-rt/src/sys.rs @@ -5,7 +5,7 @@ use core::{ }; use syscall::{ - error::{Error, Result, EINTR}, + error::{self, Error, Result, EINTR}, CallFlags, TimeSpec, EINVAL, ERESTART, }; @@ -76,7 +76,10 @@ pub fn posix_sigqueue(pid: usize, sig: usize, arg: usize) -> Result<()> { &[ProcCall::Sigq as u64, pid as u64, sig as u64], ) }) { - Ok(_) | Err(Error { errno: EINTR }) => Ok(()), + Ok(_) + | Err(Error { + errno: error::EINTR, + }) => Ok(()), Err(error) => Err(error), } } @@ -87,8 +90,8 @@ pub fn posix_getpid() -> u32 { } #[inline] pub fn posix_getppid() -> u32 { - // SAFETY: read-only except during program/fork child initialization - unsafe { addr_of!((*crate::STATIC_PROC_INFO.get()).ppid).read() } + this_proc_call(&mut [], CallFlags::empty(), &[ProcCall::Getppid as u64]).expect("cannot fail") + as u32 } #[inline] pub unsafe fn sys_futex_wait(addr: *mut u32, val: u32, deadline: Option<&TimeSpec>) -> Result<()> {