Jelajahi Sumber

Check for ENOENT/ENOTDIR in chdir().

4lDO2 2 tahun lalu
induk
melakukan
1987ae7c77
1 mengubah file dengan 8 tambahan dan 0 penghapusan
  1. 8 0
      src/platform/redox/path.rs

+ 8 - 0
src/platform/redox/path.rs

@@ -1,3 +1,4 @@
+use syscall::data::Stat;
 use syscall::error::*;
 use syscall::flag::*;
 
@@ -95,6 +96,13 @@ pub fn chdir(path: &str) -> Result<()> {
 
     let canonicalized = canonicalize_using_cwd(cwd_guard.as_deref(), path).ok_or(Error::new(ENOENT))?;
 
+    let fd = syscall::open(&canonicalized, O_STAT | O_CLOEXEC)?;
+    let mut stat = Stat::default();
+    if syscall::fstat(fd, &mut stat).is_err() || (stat.st_mode & MODE_TYPE) != MODE_DIR {
+        return Err(Error::new(ENOTDIR));
+    }
+    let _ = syscall::close(fd);
+
     *cwd_guard = Some(canonicalized.into_boxed_str());
 
     // TODO: Check that the dir exists and is a directory.