fix '/proc/self/fd' panic
@@ -754,6 +754,12 @@ impl Process {
_ => Err(SysError::EBADF),
}
}
+ pub fn get_file_const(&self, fd: usize) -> Result<&FileHandle, SysError> {
+ match self.files.get(&fd).ok_or(SysError::EBADF)? {
+ FileLike::File(file) => Ok(file),
+ _ => Err(SysError::EBADF),
+ }
+ }
/// Lookup INode from the process.
///
/// - If `path` is relative, then it is interpreted relative to the directory
@@ -776,30 +782,18 @@ impl Process {
dirfd as isize, self.cwd, path, follow
);
// hard code special path
- let (fd_dir_path, fd_name) = split_path(&path);
match path {
"/proc/self/exe" => {
return Ok(Arc::new(Pseudo::new(&self.exec_path, FileType::SymLink)));
}
_ => {}
}
+ let (fd_dir_path, fd_name) = split_path(&path);
match fd_dir_path {
"/proc/self/fd" => {
- let fd: u32 = fd_name.parse::<u32>().unwrap();
- let fd_path = match self.files.get(&(fd as usize)) {
- Some(FileLike::File(file)) => Some(&file.path),
- _ => return Err(SysError::ENOENT),
- };
- info!(
- "lookup_inode_at:BEG /proc/self/fd {}, path {}",
- fd,
- fd_path.unwrap()
- );
- if (fd_path.is_some()) {
- return Ok(Arc::new(Pseudo::new(fd_path.unwrap(), FileType::SymLink)));
- } else {
- {}
- }
+ let fd: usize = fd_name.parse().map_err(|_| SysError::EINVAL)?;
+ let fd_path = &self.get_file_const(fd)?.path;
+ return Ok(Arc::new(Pseudo::new(fd_path, FileType::SymLink)));
}
_ => {}
}
@@ -1413,5 +1407,6 @@ impl FdSet {
}
}
}
-//pathname is interpreted relative to the current working directory(CWD)
+
+/// Pathname is interpreted relative to the current working directory(CWD)
const AT_FDCWD: usize = -100isize as usize;
