Add syscall setdomainname
This commit is contained in:
parent
87091aa19c
commit
882dea6125
|
|
@ -191,7 +191,7 @@ provided by Linux on x86-64 architecture.
|
|||
| 168 | swapoff | ❌ | |
|
||||
| 169 | reboot | ❌ | |
|
||||
| 170 | sethostname | ✅ | |
|
||||
| 171 | setdomainname | ❌ | |
|
||||
| 171 | setdomainname | ✅ | |
|
||||
| 172 | iopl | ❌ | |
|
||||
| 173 | ioperm | ❌ | |
|
||||
| 174 | create_module | ❌ | |
|
||||
|
|
|
|||
|
|
@ -80,6 +80,22 @@ impl UtsNamespace {
|
|||
self.uts_name.write().nodename = new_host_name;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Sets a new domain name for the UTS namespace.
|
||||
///
|
||||
/// This method will fail with `EPERM` if the caller does not have the SYS_ADMIN capability
|
||||
/// in the owner user namespace.
|
||||
pub fn set_domainname(&self, addr: Vaddr, len: usize, ctx: &Context) -> Result<()> {
|
||||
self.owner.check_cap(CapSet::SYS_ADMIN, ctx.posix_thread)?;
|
||||
|
||||
let new_domain_name = copy_uts_field_from_user(addr, len as _, ctx)?;
|
||||
debug!(
|
||||
"set domain name: {:?}",
|
||||
CStr::from_bytes_until_nul(new_domain_name.as_bytes()).unwrap()
|
||||
);
|
||||
self.uts_name.write().domainname = new_domain_name;
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
const UTS_FIELD_LEN: usize = 65;
|
||||
|
|
|
|||
|
|
@ -113,6 +113,7 @@ use super::{
|
|||
set_priority::sys_set_priority,
|
||||
set_robust_list::sys_set_robust_list,
|
||||
set_tid_address::sys_set_tid_address,
|
||||
setdomainname::sys_setdomainname,
|
||||
setfsgid::sys_setfsgid,
|
||||
setfsuid::sys_setfsuid,
|
||||
setgid::sys_setgid,
|
||||
|
|
@ -285,6 +286,7 @@ impl_syscall_nums_and_dispatch_fn! {
|
|||
SYS_SETGROUPS = 159 => sys_setgroups(args[..2]);
|
||||
SYS_NEWUNAME = 160 => sys_uname(args[..1]);
|
||||
SYS_SETHOSTNAME = 161 => sys_sethostname(args[..2]);
|
||||
SYS_SETDOMAINNAME = 162 => sys_setdomainname(args[..2]);
|
||||
SYS_GETRUSAGE = 165 => sys_getrusage(args[..2]);
|
||||
SYS_UMASK = 166 => sys_umask(args[..1]);
|
||||
SYS_PRCTL = 167 => sys_prctl(args[..5]);
|
||||
|
|
|
|||
|
|
@ -113,6 +113,7 @@ use super::{
|
|||
set_priority::sys_set_priority,
|
||||
set_robust_list::sys_set_robust_list,
|
||||
set_tid_address::sys_set_tid_address,
|
||||
setdomainname::sys_setdomainname,
|
||||
setfsgid::sys_setfsgid,
|
||||
setfsuid::sys_setfsuid,
|
||||
setgid::sys_setgid,
|
||||
|
|
@ -285,6 +286,7 @@ impl_syscall_nums_and_dispatch_fn! {
|
|||
SYS_SETGROUPS = 159 => sys_setgroups(args[..2]);
|
||||
SYS_NEWUNAME = 160 => sys_uname(args[..1]);
|
||||
SYS_SETHOSTNAME = 161 => sys_sethostname(args[..2]);
|
||||
SYS_SETDOMAINNAME = 162 => sys_setdomainname(args[..2]);
|
||||
SYS_GETRLIMIT = 163 => sys_getrlimit(args[..2]);
|
||||
SYS_SETRLIMIT = 164 => sys_setrlimit(args[..2]);
|
||||
SYS_GETRUSAGE = 165 => sys_getrusage(args[..2]);
|
||||
|
|
|
|||
|
|
@ -124,6 +124,7 @@ use super::{
|
|||
set_priority::sys_set_priority,
|
||||
set_robust_list::sys_set_robust_list,
|
||||
set_tid_address::sys_set_tid_address,
|
||||
setdomainname::sys_setdomainname,
|
||||
setfsgid::sys_setfsgid,
|
||||
setfsuid::sys_setfsuid,
|
||||
setgid::sys_setgid,
|
||||
|
|
@ -309,6 +310,7 @@ impl_syscall_nums_and_dispatch_fn! {
|
|||
SYS_MOUNT = 165 => sys_mount(args[..5]);
|
||||
SYS_UMOUNT2 = 166 => sys_umount(args[..2]);
|
||||
SYS_SETHOSTNAME = 170 => sys_sethostname(args[..2]);
|
||||
SYS_SETDOMAINNAME = 171 => sys_setdomainname(args[..2]);
|
||||
SYS_GETTID = 186 => sys_gettid(args[..0]);
|
||||
SYS_SETXATTR = 188 => sys_setxattr(args[..5]);
|
||||
SYS_LSETXATTR = 189 => sys_lsetxattr(args[..5]);
|
||||
|
|
|
|||
|
|
@ -140,6 +140,7 @@ mod set_ioprio;
|
|||
mod set_priority;
|
||||
mod set_robust_list;
|
||||
mod set_tid_address;
|
||||
mod setdomainname;
|
||||
mod setfsgid;
|
||||
mod setfsuid;
|
||||
mod setgid;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,10 @@
|
|||
// SPDX-License-Identifier: MPL-2.0
|
||||
|
||||
use crate::{prelude::*, syscall::SyscallReturn};
|
||||
|
||||
pub fn sys_setdomainname(addr: Vaddr, len: usize, ctx: &Context) -> Result<SyscallReturn> {
|
||||
let ns_proxy_ref = ctx.thread_local.borrow_ns_proxy();
|
||||
let ns_proxy = ns_proxy_ref.unwrap();
|
||||
ns_proxy.uts_ns().set_domainname(addr, len, ctx)?;
|
||||
Ok(SyscallReturn::Return(0))
|
||||
}
|
||||
|
|
@ -1340,8 +1340,9 @@ set_robust_list01
|
|||
# set_thread_area01
|
||||
# set_tid_address01
|
||||
|
||||
# setdomainname01
|
||||
# setdomainname02
|
||||
setdomainname01
|
||||
setdomainname02
|
||||
# TODO: Drop capabilities on UID changes, so that setdomainname() will fail with EPERM.
|
||||
# setdomainname03
|
||||
|
||||
# setfsgid01
|
||||
|
|
|
|||
Loading…
Reference in New Issue