From e0d7b140ce3cf0a7a113f36025e86c06f2104123 Mon Sep 17 00:00:00 2001 From: LI Qing Date: Wed, 6 Dec 2023 14:53:46 +0800 Subject: [PATCH] Fix the fstatat syscall with empty filename --- services/aster-nix/src/syscall/stat.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/services/aster-nix/src/syscall/stat.rs b/services/aster-nix/src/syscall/stat.rs index 4a0d668b..390a91a5 100644 --- a/services/aster-nix/src/syscall/stat.rs +++ b/services/aster-nix/src/syscall/stat.rs @@ -53,12 +53,18 @@ pub fn sys_fstatat( "dirfd = {}, filename = {:?}, stat_buf_ptr = 0x{:x}, flags = {:?}", dirfd, filename, stat_buf_ptr, flags ); + + if filename.is_empty() { + if !flags.contains(StatFlags::AT_EMPTY_PATH) { + return_errno_with_message!(Errno::ENOENT, "path is empty"); + } + // In this case, the behavior of fstatat() is similar to that of fstat(). + return self::sys_fstat(dirfd, stat_buf_ptr); + } + let current = current!(); let dentry = { let filename = filename.to_string_lossy(); - if filename.is_empty() && !flags.contains(StatFlags::AT_EMPTY_PATH) { - return_errno_with_message!(Errno::ENOENT, "path is empty"); - } let fs_path = FsPath::new(dirfd, filename.as_ref())?; let fs = current.fs().read(); if flags.contains(StatFlags::AT_SYMLINK_NOFOLLOW) {