Merge branch 'cwd_fix' into 'master'
Check for ENOENT/ENOTDIR in chdir(). See merge request redox-os/relibc!347
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user