From e453649d78c33619adba7db313fddf5cc5b8bb09 Mon Sep 17 00:00:00 2001 From: Shaowei Song Date: Wed, 13 Nov 2024 08:06:52 +0000 Subject: [PATCH] Correct the behavior when operating the root directory --- kernel/src/fs/fs_resolver.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/kernel/src/fs/fs_resolver.rs b/kernel/src/fs/fs_resolver.rs index 26b96e086..c835e3762 100644 --- a/kernel/src/fs/fs_resolver.rs +++ b/kernel/src/fs/fs_resolver.rs @@ -202,7 +202,6 @@ impl FsResolver { return_errno_with_message!(Errno::ENAMETOOLONG, "path is too long"); } if relative_path.is_empty() { - assert!(!lookup_ctx.stop_on_parent); return Ok(parent.clone()); } @@ -335,7 +334,11 @@ impl FsResolver { let (follow_tail_link, stop_on_parent) = (false, true); let mut lookup_ctx = LookupCtx::new(follow_tail_link, stop_on_parent); let parent_dir = self.lookup_inner(path, &mut lookup_ctx)?; - let tail_file_name = lookup_ctx.tail_file_name().unwrap(); + let tail_file_name = lookup_ctx.tail_file_name().ok_or_else(|| { + // If the path is the root directory ("/"), there is no basename, + // so this operation is not allowed. + Error::with_message(Errno::EEXIST, "operation not allowed on root directory") + })?; if parent_dir .lookup(tail_file_name.trim_end_matches('/'))