mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-11 22:36:48 +00:00
Add sys_getrlimit and sys_setrlimit
This commit is contained in:
parent
c34706603a
commit
1fe74c9c92
@ -117,7 +117,7 @@ provided by Linux on x86-64 architecture.
|
|||||||
| 94 | lchown | ✅ |
|
| 94 | lchown | ✅ |
|
||||||
| 95 | umask | ✅ |
|
| 95 | umask | ✅ |
|
||||||
| 96 | gettimeofday | ✅ |
|
| 96 | gettimeofday | ✅ |
|
||||||
| 97 | getrlimit | ❌ |
|
| 97 | getrlimit | ✅ |
|
||||||
| 98 | getrusage | ✅ |
|
| 98 | getrusage | ✅ |
|
||||||
| 99 | sysinfo | ❌ |
|
| 99 | sysinfo | ❌ |
|
||||||
| 100 | times | ❌ |
|
| 100 | times | ❌ |
|
||||||
@ -180,7 +180,7 @@ provided by Linux on x86-64 architecture.
|
|||||||
| 157 | prctl | ✅ |
|
| 157 | prctl | ✅ |
|
||||||
| 158 | arch_prctl | ✅ |
|
| 158 | arch_prctl | ✅ |
|
||||||
| 159 | adjtimex | ❌ |
|
| 159 | adjtimex | ❌ |
|
||||||
| 160 | setrlimit | ❌ |
|
| 160 | setrlimit | ✅ |
|
||||||
| 161 | chroot | ✅ |
|
| 161 | chroot | ✅ |
|
||||||
| 162 | sync | ✅ |
|
| 162 | sync | ✅ |
|
||||||
| 163 | acct | ❌ |
|
| 163 | acct | ❌ |
|
||||||
|
@ -66,7 +66,7 @@ use crate::syscall::{
|
|||||||
prctl::sys_prctl,
|
prctl::sys_prctl,
|
||||||
pread64::sys_pread64,
|
pread64::sys_pread64,
|
||||||
preadv::{sys_preadv, sys_preadv2, sys_readv},
|
preadv::{sys_preadv, sys_preadv2, sys_readv},
|
||||||
prlimit64::sys_prlimit64,
|
prlimit64::{sys_getrlimit, sys_prlimit64, sys_setrlimit},
|
||||||
pselect6::sys_pselect6,
|
pselect6::sys_pselect6,
|
||||||
pwrite64::sys_pwrite64,
|
pwrite64::sys_pwrite64,
|
||||||
pwritev::{sys_pwritev, sys_pwritev2, sys_writev},
|
pwritev::{sys_pwritev, sys_pwritev2, sys_writev},
|
||||||
@ -220,6 +220,8 @@ impl_syscall_nums_and_dispatch_fn! {
|
|||||||
SYS_GETGROUPS = 158 => sys_getgroups(args[..2]);
|
SYS_GETGROUPS = 158 => sys_getgroups(args[..2]);
|
||||||
SYS_SETGROUPS = 159 => sys_setgroups(args[..2]);
|
SYS_SETGROUPS = 159 => sys_setgroups(args[..2]);
|
||||||
SYS_NEWUNAME = 160 => sys_uname(args[..1]);
|
SYS_NEWUNAME = 160 => sys_uname(args[..1]);
|
||||||
|
SYS_GETRLIMIT = 163 => sys_getrlimit(args[..2]);
|
||||||
|
SYS_SETRLIMIT = 164 => sys_setrlimit(args[..2]);
|
||||||
SYS_GETRUSAGE = 165 => sys_getrusage(args[..2]);
|
SYS_GETRUSAGE = 165 => sys_getrusage(args[..2]);
|
||||||
SYS_UMASK = 166 => sys_umask(args[..1]);
|
SYS_UMASK = 166 => sys_umask(args[..1]);
|
||||||
SYS_PRCTL = 167 => sys_prctl(args[..5]);
|
SYS_PRCTL = 167 => sys_prctl(args[..5]);
|
||||||
@ -264,6 +266,7 @@ impl_syscall_nums_and_dispatch_fn! {
|
|||||||
SYS_EXECVEAT = 281 => sys_execveat(args[..5], &mut user_ctx);
|
SYS_EXECVEAT = 281 => sys_execveat(args[..5], &mut user_ctx);
|
||||||
SYS_PREADV2 = 286 => sys_preadv2(args[..5]);
|
SYS_PREADV2 = 286 => sys_preadv2(args[..5]);
|
||||||
SYS_PWRITEV2 = 287 => sys_pwritev2(args[..5]);
|
SYS_PWRITEV2 = 287 => sys_pwritev2(args[..5]);
|
||||||
|
SYS_PRLIMIT64 = 302 => sys_prlimit64(args[..4]);
|
||||||
SYS_CLOCK_GETTIME = 403 => sys_clock_gettime(args[..2]);
|
SYS_CLOCK_GETTIME = 403 => sys_clock_gettime(args[..2]);
|
||||||
SYS_CLOCK_NANOSLEEP = 407 => sys_clock_nanosleep(args[..4]);
|
SYS_CLOCK_NANOSLEEP = 407 => sys_clock_nanosleep(args[..4]);
|
||||||
SYS_TIMER_GETTIME = 408 => sys_timer_gettime(args[..2]);
|
SYS_TIMER_GETTIME = 408 => sys_timer_gettime(args[..2]);
|
||||||
|
@ -71,7 +71,7 @@ use crate::syscall::{
|
|||||||
prctl::sys_prctl,
|
prctl::sys_prctl,
|
||||||
pread64::sys_pread64,
|
pread64::sys_pread64,
|
||||||
preadv::{sys_preadv, sys_preadv2, sys_readv},
|
preadv::{sys_preadv, sys_preadv2, sys_readv},
|
||||||
prlimit64::sys_prlimit64,
|
prlimit64::{sys_getrlimit, sys_prlimit64, sys_setrlimit},
|
||||||
pselect6::sys_pselect6,
|
pselect6::sys_pselect6,
|
||||||
pwrite64::sys_pwrite64,
|
pwrite64::sys_pwrite64,
|
||||||
pwritev::{sys_pwritev, sys_pwritev2, sys_writev},
|
pwritev::{sys_pwritev, sys_pwritev2, sys_writev},
|
||||||
@ -221,6 +221,7 @@ impl_syscall_nums_and_dispatch_fn! {
|
|||||||
SYS_LCHOWN = 94 => sys_lchown(args[..3]);
|
SYS_LCHOWN = 94 => sys_lchown(args[..3]);
|
||||||
SYS_UMASK = 95 => sys_umask(args[..1]);
|
SYS_UMASK = 95 => sys_umask(args[..1]);
|
||||||
SYS_GETTIMEOFDAY = 96 => sys_gettimeofday(args[..1]);
|
SYS_GETTIMEOFDAY = 96 => sys_gettimeofday(args[..1]);
|
||||||
|
SYS_GETRLIMIT = 97 => sys_getrlimit(args[..2]);
|
||||||
SYS_GETRUSAGE = 98 => sys_getrusage(args[..2]);
|
SYS_GETRUSAGE = 98 => sys_getrusage(args[..2]);
|
||||||
SYS_GETUID = 102 => sys_getuid(args[..0]);
|
SYS_GETUID = 102 => sys_getuid(args[..0]);
|
||||||
SYS_GETGID = 104 => sys_getgid(args[..0]);
|
SYS_GETGID = 104 => sys_getgid(args[..0]);
|
||||||
@ -256,6 +257,7 @@ impl_syscall_nums_and_dispatch_fn! {
|
|||||||
SYS_SET_PRIORITY = 141 => sys_set_priority(args[..3]);
|
SYS_SET_PRIORITY = 141 => sys_set_priority(args[..3]);
|
||||||
SYS_PRCTL = 157 => sys_prctl(args[..5]);
|
SYS_PRCTL = 157 => sys_prctl(args[..5]);
|
||||||
SYS_ARCH_PRCTL = 158 => sys_arch_prctl(args[..2], &mut user_ctx);
|
SYS_ARCH_PRCTL = 158 => sys_arch_prctl(args[..2], &mut user_ctx);
|
||||||
|
SYS_SETRLIMIT = 160 => sys_setrlimit(args[..2]);
|
||||||
SYS_CHROOT = 161 => sys_chroot(args[..1]);
|
SYS_CHROOT = 161 => sys_chroot(args[..1]);
|
||||||
SYS_SYNC = 162 => sys_sync(args[..0]);
|
SYS_SYNC = 162 => sys_sync(args[..0]);
|
||||||
SYS_MOUNT = 165 => sys_mount(args[..5]);
|
SYS_MOUNT = 165 => sys_mount(args[..5]);
|
||||||
|
@ -6,6 +6,27 @@ use crate::{
|
|||||||
process::{Pid, ResourceType},
|
process::{Pid, ResourceType},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub fn sys_getrlimit(resource: u32, rlim_addr: Vaddr, ctx: &Context) -> Result<SyscallReturn> {
|
||||||
|
let resource = ResourceType::try_from(resource)?;
|
||||||
|
debug!("resource = {:?}, rlim_addr = 0x{:x}", resource, rlim_addr);
|
||||||
|
let resource_limits = ctx.process.resource_limits().lock();
|
||||||
|
let rlimit = resource_limits.get_rlimit(resource);
|
||||||
|
ctx.get_user_space().write_val(rlim_addr, rlimit)?;
|
||||||
|
Ok(SyscallReturn::Return(0))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn sys_setrlimit(resource: u32, new_rlim_addr: Vaddr, ctx: &Context) -> Result<SyscallReturn> {
|
||||||
|
let resource = ResourceType::try_from(resource)?;
|
||||||
|
debug!(
|
||||||
|
"resource = {:?}, new_rlim_addr = 0x{:x}",
|
||||||
|
resource, new_rlim_addr
|
||||||
|
);
|
||||||
|
let new_rlimit = ctx.get_user_space().read_val(new_rlim_addr)?;
|
||||||
|
let mut resource_limits = ctx.process.resource_limits().lock();
|
||||||
|
*resource_limits.get_rlimit_mut(resource) = new_rlimit;
|
||||||
|
Ok(SyscallReturn::Return(0))
|
||||||
|
}
|
||||||
|
|
||||||
pub fn sys_prlimit64(
|
pub fn sys_prlimit64(
|
||||||
pid: Pid,
|
pid: Pid,
|
||||||
resource: u32,
|
resource: u32,
|
||||||
|
@ -38,6 +38,7 @@ TESTS ?= \
|
|||||||
read_test \
|
read_test \
|
||||||
readv_test \
|
readv_test \
|
||||||
rename_test \
|
rename_test \
|
||||||
|
rlimits_test \
|
||||||
semaphore_test \
|
semaphore_test \
|
||||||
sendfile_test \
|
sendfile_test \
|
||||||
sigaltstack_test \
|
sigaltstack_test \
|
||||||
|
1
test/syscall_test/blocklists/rlimits_test
Normal file
1
test/syscall_test/blocklists/rlimits_test
Normal file
@ -0,0 +1 @@
|
|||||||
|
RlimitTest.UnprivilegedSetRlimit
|
Loading…
x
Reference in New Issue
Block a user