From 0340ba3b36b47084ac19deeb4e03d23321254b05 Mon Sep 17 00:00:00 2001 From: Ron Williams Date: Fri, 5 Jan 2024 05:26:51 -0800 Subject: [PATCH] fix canonicalize of libc: --- src/platform/redox/libcscheme.rs | 12 ++++++++---- src/platform/redox/mod.rs | 4 ---- src/platform/redox/path.rs | 11 +++++++++-- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/platform/redox/libcscheme.rs b/src/platform/redox/libcscheme.rs index 11f78133b4..38cd3cc2f0 100644 --- a/src/platform/redox/libcscheme.rs +++ b/src/platform/redox/libcscheme.rs @@ -1,7 +1,7 @@ use super::libredox; use crate::{c_str::CStr, header::stdlib::getenv, platform::types::*}; use core::{ptr, slice}; -use syscall::{Error, Result, EINVAL, EIO, ENOENT}; +use syscall::{flag::*, Error, Result, EINVAL, EIO, ENOENT}; pub const LIBC_SCHEME: &'static str = "libc:"; @@ -25,11 +25,15 @@ macro_rules! env_str { }; } -pub fn open(path: &str, oflag: c_int, mode: mode_t) -> Result { +pub fn open(path: &str, flags: usize) -> Result { assert!(path.starts_with(LIBC_SCHEME)); + if flags & O_SYMLINK != 0 { + return Err(Error::new(ENOENT)); + } + let basename = match path.strip_prefix(LIBC_SCHEME) { - Some(path) => path.trim_start_matches('/').trim_end_matches('/'), + Some(path) => path.trim_matches('/'), _ => return Err(Error::new(EIO)), }; @@ -40,7 +44,7 @@ pub fn open(path: &str, oflag: c_int, mode: mode_t) -> Result { "stdout" => syscall::dup(1, &[]), "tty" => { if let Some(tty) = env_str!("TTY") { - return libredox::open(tty, oflag, mode); + return syscall::open(tty, flags); } Err(Error::new(ENOENT)) } diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs index a90641bc97..dcd52e855d 100644 --- a/src/platform/redox/mod.rs +++ b/src/platform/redox/mod.rs @@ -778,10 +778,6 @@ impl Pal for Sys { fn open(path: CStr, oflag: c_int, mode: mode_t) -> c_int { let path = path_from_c_str!(path); - if path.starts_with(libcscheme::LIBC_SCHEME) { - return e(libcscheme::open(path, oflag, mode)) as c_int; - } - e(libredox::open(path, oflag, mode)) as c_int } diff --git a/src/platform/redox/path.rs b/src/platform/redox/path.rs index eb97b42f21..a06b8d175f 100644 --- a/src/platform/redox/path.rs +++ b/src/platform/redox/path.rs @@ -2,7 +2,7 @@ use syscall::{data::Stat, error::*, flag::*}; use alloc::{borrow::ToOwned, boxed::Box, string::String, vec::Vec}; -use super::FdGuard; +use super::{libcscheme, FdGuard}; use crate::sync::Mutex; // TODO: Define in syscall @@ -168,7 +168,14 @@ pub fn open(path: &str, flags: usize) -> Result { for _ in 0..MAX_LEVEL { let canon = canonicalize(path)?; - match syscall::open(&*canon, flags) { + + let open_res = if canon.starts_with(libcscheme::LIBC_SCHEME) { + libcscheme::open(&canon, flags) + } else { + syscall::open(&*canon, flags) + }; + + match open_res { Ok(fd) => return Ok(fd), Err(error) if error == Error::new(EXDEV) => { let resolve_flags = O_CLOEXEC | O_SYMLINK | O_RDONLY;