1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
use linux_api::errno::Errno;
use shadow_shim_helper_rs::syscall_types::ForeignPtr;
use crate::host::syscall::handler::{SyscallContext, SyscallHandler};
use crate::host::syscall::types::SyscallError;
impl SyscallHandler {
log_syscall!(
prlimit64,
/* rv */ std::ffi::c_int,
/* pid */ linux_api::posix_types::kernel_pid_t,
/* resource */ std::ffi::c_uint,
/* new_rlim */ *const std::ffi::c_void,
/* old_rlim */ *const std::ffi::c_void,
);
pub fn prlimit64(
_ctx: &mut SyscallContext,
pid: linux_api::posix_types::kernel_pid_t,
resource: std::ffi::c_uint,
_new_rlim: ForeignPtr<()>,
_old_rlim: ForeignPtr<()>,
) -> Result<(), SyscallError> {
log::trace!("prlimit64 called on pid {pid} for resource {resource}");
// TODO: For determinism, we may want to enforce static limits for certain resources, like
// RLIMIT_NOFILE. Some applications like Tor will change behavior depending on these limits.
if pid == 0 {
// process is calling prlimit on itself
Err(SyscallError::Native)
} else {
// TODO: We do not currently support adjusting other processes limits. To support it, we
// just need to find the native pid associated with pid, and call prlimit on the native
// pid instead.
Err(Errno::EOPNOTSUPP.into())
}
}
}