From ed0752aacc00e68e2da151d5c889a1f5228f0579 Mon Sep 17 00:00:00 2001 From: Zhenchen Wang Date: Fri, 1 Mar 2024 09:47:14 +0800 Subject: [PATCH] Add syscall chroot Signed-off-by: Zhenchen Wang Signed-off-by: Zhenchen Wang --- kernel/aster-nix/src/fs/fs_resolver.rs | 5 ++++ kernel/aster-nix/src/syscall/chroot.rs | 32 ++++++++++++++++++++++++++ kernel/aster-nix/src/syscall/mod.rs | 4 ++++ 3 files changed, 41 insertions(+) create mode 100644 kernel/aster-nix/src/syscall/chroot.rs diff --git a/kernel/aster-nix/src/fs/fs_resolver.rs b/kernel/aster-nix/src/fs/fs_resolver.rs index 2a04b48bd..e4e5ed00c 100644 --- a/kernel/aster-nix/src/fs/fs_resolver.rs +++ b/kernel/aster-nix/src/fs/fs_resolver.rs @@ -57,6 +57,11 @@ impl FsResolver { self.cwd = dentry; } + /// Set the root directory + pub fn set_root(&mut self, dentry: Arc) { + self.root = dentry; + } + /// Open or create a file inode handler. pub fn open(&self, path: &FsPath, flags: u32, mode: u16) -> Result { let creation_flags = CreationFlags::from_bits_truncate(flags); diff --git a/kernel/aster-nix/src/syscall/chroot.rs b/kernel/aster-nix/src/syscall/chroot.rs new file mode 100644 index 000000000..d5ad8384b --- /dev/null +++ b/kernel/aster-nix/src/syscall/chroot.rs @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MPL-2.0 + +use super::{SyscallReturn, SYS_CHROOT}; +use crate::{ + fs::{fs_resolver::FsPath, utils::InodeType}, + log_syscall_entry, + prelude::*, + syscall::constants::MAX_FILENAME_LEN, + util::read_cstring_from_user, +}; + +pub fn sys_chroot(pathname_addr: Vaddr) -> Result { + log_syscall_entry!(SYS_CHROOT); + let pathname = read_cstring_from_user(pathname_addr, MAX_FILENAME_LEN)?; + debug!("pathname = {:?}", pathname); + + let current = current!(); + let mut fs = current.fs().write(); + let dentry = { + let pathname = pathname.to_string_lossy(); + if pathname.is_empty() { + return_errno_with_message!(Errno::ENOENT, "path is empty"); + } + let fs_path = FsPath::try_from(pathname.as_ref())?; + fs.lookup(&fs_path)? + }; + if dentry.type_() != InodeType::Dir { + return_errno_with_message!(Errno::ENOTDIR, "must be directory"); + } + fs.set_root(dentry); + Ok(SyscallReturn::Return(0)) +} diff --git a/kernel/aster-nix/src/syscall/mod.rs b/kernel/aster-nix/src/syscall/mod.rs index 5285f5c25..a8624bb34 100644 --- a/kernel/aster-nix/src/syscall/mod.rs +++ b/kernel/aster-nix/src/syscall/mod.rs @@ -25,6 +25,7 @@ use crate::{ chdir::{sys_chdir, sys_fchdir}, chmod::{sys_chmod, sys_fchmod, sys_fchmodat}, chown::{sys_chown, sys_fchown, sys_fchownat, sys_lchown}, + chroot::sys_chroot, clock_gettime::sys_clock_gettime, clock_nanosleep::sys_clock_nanosleep, clone::sys_clone, @@ -104,6 +105,7 @@ mod brk; mod chdir; mod chmod; mod chown; +mod chroot; mod clock_gettime; mod clock_nanosleep; mod clone; @@ -330,6 +332,7 @@ define_syscall_nums!( SYS_SET_PRIORITY = 141, SYS_PRCTL = 157, SYS_ARCH_PRCTL = 158, + SYS_CHROOT = 161, SYS_SYNC = 162, SYS_GETTID = 186, SYS_TIME = 201, @@ -517,6 +520,7 @@ pub fn syscall_dispatch( SYS_SET_PRIORITY => syscall_handler!(3, sys_set_priority, args), SYS_PRCTL => syscall_handler!(5, sys_prctl, args), SYS_ARCH_PRCTL => syscall_handler!(2, sys_arch_prctl, args, context), + SYS_CHROOT => syscall_handler!(1, sys_chroot, args), SYS_SYNC => syscall_handler!(0, sys_sync), SYS_GETTID => syscall_handler!(0, sys_gettid), SYS_TIME => syscall_handler!(1, sys_time, args),