use super::BaseSyscallHandler;
use crate::syscall::{KernelSigAction, KernelSigSet, FAKE_GID, FAKE_PID, FAKE_UID};
use crate::untrusted::{AddressValidator, UntrustedRef, UntrustedRefMut, Validate};
use crate::{request, Result};
pub trait ProcessSyscallHandler: BaseSyscallHandler + AddressValidator + Sized {
fn arch_prctl(&mut self, code: libc::c_int, addr: libc::c_ulong) -> Result;
fn exit(&mut self, status: libc::c_int) -> ! {
self.trace("exit", 1);
#[allow(unused_must_use)]
loop {
unsafe { self.proxy(request!(libc::SYS_exit => status)) };
self.attacked();
}
}
fn exit_group(&mut self, status: libc::c_int) -> ! {
self.trace("exit_group", 1);
#[allow(unused_must_use)]
loop {
unsafe { self.proxy(request!(libc::SYS_exit_group => status)) };
self.attacked();
}
}
fn set_tid_address(&mut self, _tidptr: *const libc::c_int) -> Result {
self.trace("set_tid_address", 1);
Ok([1.into(), 0.into()])
}
fn rt_sigaction(
&mut self,
signum: libc::c_int,
act: UntrustedRef<KernelSigAction>,
oldact: UntrustedRefMut<KernelSigAction>,
size: usize,
) -> Result {
self.trace("rt_sigaction", 4);
const SIGRTMAX: libc::c_int = 64; static mut ACTIONS: [KernelSigAction; SIGRTMAX as usize] = [[0; 4]; SIGRTMAX as usize];
if signum >= SIGRTMAX || size != 8 {
return Err(libc::EINVAL);
}
unsafe {
if !oldact.as_ptr().is_null() {
let oldact = oldact.validate(self).ok_or(libc::EFAULT)?;
*(oldact) = ACTIONS[signum as usize];
}
if !act.as_ptr().is_null() {
let act = act.validate(self).ok_or(libc::EFAULT)?;
ACTIONS[signum as usize] = *act;
}
}
Ok(Default::default())
}
fn rt_sigprocmask(
&mut self,
_how: libc::c_int,
_set: UntrustedRef<KernelSigSet>,
_oldset: UntrustedRefMut<KernelSigSet>,
_sigsetsize: libc::size_t,
) -> Result {
self.trace("rt_sigprocmask", 4);
Ok(Default::default())
}
fn sigaltstack(
&mut self,
_ss: UntrustedRef<libc::stack_t>,
_old_ss: UntrustedRefMut<libc::stack_t>,
) -> Result {
self.trace("sigaltstack", 2);
Ok(Default::default())
}
fn getpid(&mut self) -> Result {
self.trace("getpid", 0);
Ok([FAKE_PID.into(), 0.into()])
}
fn getuid(&mut self) -> Result {
self.trace("getuid", 0);
Ok([FAKE_UID.into(), 0.into()])
}
fn getgid(&mut self) -> Result {
self.trace("getgid", 0);
Ok([FAKE_GID.into(), 0.into()])
}
fn geteuid(&mut self) -> Result {
self.trace("geteuid", 0);
Ok([FAKE_UID.into(), 0.into()])
}
fn getegid(&mut self) -> Result {
self.trace("getegid", 0);
Ok([FAKE_GID.into(), 0.into()])
}
}