Fix the dirfd issue when path is absolute
This commit is contained in:
parent
1ad8f22170
commit
686ec343b2
@ -47,10 +47,6 @@ pub fn do_faccessat(
|
||||
"faccessat: dirfd: {:?}, path: {:?}, mode: {:?}, flags: {:?}",
|
||||
dirfd, path, mode, flags
|
||||
);
|
||||
if Path::new(path).is_absolute() {
|
||||
// Path is absolute, so dirfd is ignored
|
||||
return Ok(do_access(path, mode, flags)?);
|
||||
}
|
||||
let path = match dirfd {
|
||||
DirFd::Fd(dirfd) => {
|
||||
let dir_path = get_dir_path(dirfd)?;
|
||||
|
@ -19,10 +19,6 @@ pub fn do_openat(dirfd: DirFd, path: &str, flags: u32, mode: u32) -> Result<File
|
||||
"openat: dirfd: {:?}, path: {:?}, flags: {:#o}, mode: {:#o}",
|
||||
dirfd, path, flags, mode
|
||||
);
|
||||
if Path::new(path).is_absolute() {
|
||||
// Path is absolute, so dirfd is ignored
|
||||
return Ok(do_open(path, flags, mode)?);
|
||||
}
|
||||
let path = match dirfd {
|
||||
DirFd::Fd(dirfd) => {
|
||||
let dir_path = get_dir_path(dirfd)?;
|
||||
|
@ -171,10 +171,6 @@ pub fn do_fstatat(dirfd: DirFd, path: &str, flags: StatFlags) -> Result<Stat> {
|
||||
if path.len() == 0 && !flags.contains(StatFlags::AT_EMPTY_PATH) {
|
||||
return_errno!(ENOENT, "path is an empty string");
|
||||
}
|
||||
if Path::new(path).is_absolute() {
|
||||
// Path is absolute, so dirfd is ignored
|
||||
return Ok(do_stat(path)?);
|
||||
}
|
||||
match dirfd {
|
||||
DirFd::Fd(dirfd) => {
|
||||
if path.len() == 0 {
|
||||
|
@ -43,10 +43,15 @@ pub fn do_open(path: *const i8, flags: u32, mode: u32) -> Result<isize> {
|
||||
}
|
||||
|
||||
pub fn do_openat(dirfd: i32, path: *const i8, flags: u32, mode: u32) -> Result<isize> {
|
||||
let dirfd = DirFd::from_i32(dirfd)?;
|
||||
let path = from_user::clone_cstring_safely(path)?
|
||||
.to_string_lossy()
|
||||
.into_owned();
|
||||
let dirfd = if Path::new(&path).is_absolute() {
|
||||
// Path is absolute, dirfd is treated as Cwd
|
||||
DirFd::Cwd
|
||||
} else {
|
||||
DirFd::from_i32(dirfd)?
|
||||
};
|
||||
let fd = file_ops::do_openat(dirfd, &path, flags, mode)?;
|
||||
Ok(fd as isize)
|
||||
}
|
||||
@ -179,10 +184,15 @@ pub fn do_lstat(path: *const i8, stat_buf: *mut Stat) -> Result<isize> {
|
||||
}
|
||||
|
||||
pub fn do_fstatat(dirfd: i32, path: *const i8, stat_buf: *mut Stat, flags: u32) -> Result<isize> {
|
||||
let dirfd = DirFd::from_i32(dirfd)?;
|
||||
let path = from_user::clone_cstring_safely(path)?
|
||||
.to_string_lossy()
|
||||
.into_owned();
|
||||
let dirfd = if Path::new(&path).is_absolute() {
|
||||
// Path is absolute, dirfd is treated as Cwd
|
||||
DirFd::Cwd
|
||||
} else {
|
||||
DirFd::from_i32(dirfd)?
|
||||
};
|
||||
from_user::check_mut_ptr(stat_buf)?;
|
||||
let flags = StatFlags::from_bits_truncate(flags);
|
||||
let stat = file_ops::do_fstatat(dirfd, &path, flags)?;
|
||||
@ -202,10 +212,15 @@ pub fn do_access(path: *const i8, mode: u32) -> Result<isize> {
|
||||
}
|
||||
|
||||
pub fn do_faccessat(dirfd: i32, path: *const i8, mode: u32, flags: u32) -> Result<isize> {
|
||||
let dirfd = DirFd::from_i32(dirfd)?;
|
||||
let path = from_user::clone_cstring_safely(path)?
|
||||
.to_string_lossy()
|
||||
.into_owned();
|
||||
let dirfd = if Path::new(&path).is_absolute() {
|
||||
// Path is absolute, dirfd is treated as Cwd
|
||||
DirFd::Cwd
|
||||
} else {
|
||||
DirFd::from_i32(dirfd)?
|
||||
};
|
||||
let mode = AccessibilityCheckMode::from_u32(mode)?;
|
||||
let flags = AccessibilityCheckFlags::from_u32(flags)?;
|
||||
file_ops::do_faccessat(dirfd, &path, mode, flags).map(|_| 0)
|
||||
|
@ -62,6 +62,9 @@ static int __test_faccessat_with_abs_path(const char *file_path) {
|
||||
if (faccessat(AT_FDCWD, file_path, F_OK, 0) < 0) {
|
||||
THROW_ERROR("failed to faccessat file with abs path");
|
||||
}
|
||||
if (faccessat(-1, file_path, F_OK, 0) < 0) {
|
||||
THROW_ERROR("failed to faccessat file with abs path and invalid dirfd");
|
||||
}
|
||||
if (remove_file(file_path) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
@ -37,6 +37,12 @@ static int __test_openat_with_abs_path(const char *file_path, int flags, int mod
|
||||
THROW_ERROR("failed to openat a file with abs path");
|
||||
}
|
||||
close(fd);
|
||||
|
||||
fd = openat(-1, file_path, flags, mode);
|
||||
if (fd < 0) {
|
||||
THROW_ERROR("failed to openat a file with abs path and invalid dirfd");
|
||||
}
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -79,12 +79,14 @@ static int __test_lstat(const char *file_path) {
|
||||
|
||||
static int __test_fstatat_with_abs_path(const char *file_path) {
|
||||
struct stat stat_buf;
|
||||
int ret;
|
||||
|
||||
ret = fstatat(AT_FDCWD, file_path, &stat_buf, 0);
|
||||
if (ret < 0) {
|
||||
if (fstatat(AT_FDCWD, file_path, &stat_buf, 0) < 0) {
|
||||
THROW_ERROR("failed to fstatat file with abs path");
|
||||
}
|
||||
|
||||
if (fstatat(-1, file_path, &stat_buf, 0) < 0) {
|
||||
THROW_ERROR("failed to fstatat file with abs path and invalid dirfd");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user