From 2b2277e0c8cd0a668466d62c2419c6b86d4ffc58 Mon Sep 17 00:00:00 2001 From: Arshia Ghafoori Date: Fri, 8 Nov 2024 16:43:35 +0400 Subject: [PATCH 1/3] Fix renaming a directory that was created with mkdir --- lib/virtual-io/src/selector.rs | 9 ++++++- lib/wasix/src/fs/mod.rs | 7 ++++++ .../syscalls/wasi/path_create_directory.rs | 25 +++++++++++++------ lib/wasix/src/syscalls/wasi/path_rename.rs | 2 +- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/lib/virtual-io/src/selector.rs b/lib/virtual-io/src/selector.rs index 3ea1b2f3993..b45ffaa4ab7 100644 --- a/lib/virtual-io/src/selector.rs +++ b/lib/virtual-io/src/selector.rs @@ -138,7 +138,14 @@ impl Selector { let mut events = mio::Events::with_capacity(128); loop { // Wait for an event to trigger - poll.poll(&mut events, None).unwrap(); + if let Err(e) = poll.poll(&mut events, None) { + // This can happen when a debugger is attached + #[cfg(debug_assertions)] + if e.kind() == std::io::ErrorKind::Interrupted { + continue; + } + panic!("Unexpected error in selector poll loop: {e:?}"); + } // Loop through all the events while under a guard lock let mut guard = engine.inner.lock().unwrap(); diff --git a/lib/wasix/src/fs/mod.rs b/lib/wasix/src/fs/mod.rs index adec289faae..d230414f61c 100644 --- a/lib/wasix/src/fs/mod.rs +++ b/lib/wasix/src/fs/mod.rs @@ -984,6 +984,13 @@ impl WasiFs { // TODO: rights checks 'path_iter: for (i, component) in path.components().enumerate() { + // Since we're resolving the path against the given inode, we want to + // assume '/a/b' to be the same as `a/b` relative to the inode, so + // we skip over the RootDir component. + if matches!(component, Component::RootDir) { + continue; + } + // used to terminate symlink resolution properly let last_component = i + 1 == n_components; // for each component traverse file structure diff --git a/lib/wasix/src/syscalls/wasi/path_create_directory.rs b/lib/wasix/src/syscalls/wasi/path_create_directory.rs index 60343269fc2..a4522f5224a 100644 --- a/lib/wasix/src/syscalls/wasi/path_create_directory.rs +++ b/lib/wasix/src/syscalls/wasi/path_create_directory.rs @@ -1,4 +1,7 @@ -use std::{path::PathBuf, str::FromStr}; +use std::{ + path::{Component, PathBuf}, + str::FromStr, +}; use super::*; use crate::syscalls::*; @@ -30,7 +33,7 @@ pub fn path_create_directory( Span::current().record("path", path_string.as_str()); // Convert relative paths into absolute paths - if path_string.starts_with("./") { + if !path_string.starts_with("/") { path_string = ctx.data().state.fs.relative_path_to_absolute(path_string); trace!( %path_string @@ -68,11 +71,14 @@ pub(crate) fn path_create_directory_internal( let path = std::path::PathBuf::from(path); let path_vec = path .components() - .map(|comp| { - comp.as_os_str() - .to_str() - .map(|inner_str| inner_str.to_string()) - .ok_or(Errno::Inval) + .filter_map(|comp| match comp { + Component::RootDir => None, + _ => Some( + comp.as_os_str() + .to_str() + .map(|inner_str| inner_str.to_string()) + .ok_or(Errno::Inval), + ), }) .collect::, Errno>>()?; if path_vec.is_empty() { @@ -86,6 +92,11 @@ pub(crate) fn path_create_directory_internal( let processing_cur_dir_inode = cur_dir_inode.clone(); let mut guard = processing_cur_dir_inode.write(); match guard.deref_mut() { + // TODO: this depends on entries already being filled in. This is the case when you go + // through wasix-libc (which is, realistically, what everybody does) because it stats + // the path before calling path_create_directory, at which point entries is filled in. + // However, an alternate implementation or a manually implemented module may not always + // do this. Kind::Dir { ref mut entries, path, diff --git a/lib/wasix/src/syscalls/wasi/path_rename.rs b/lib/wasix/src/syscalls/wasi/path_rename.rs index 6e117c4dc70..08de4578519 100644 --- a/lib/wasix/src/syscalls/wasi/path_rename.rs +++ b/lib/wasix/src/syscalls/wasi/path_rename.rs @@ -72,7 +72,7 @@ pub fn path_rename_internal( } } - // this is to be sure the source file is fetch from filesystem if needed + // this is to be sure the source file is fetched from the filesystem if needed wasi_try_ok!(state .fs .get_inode_at_path(inodes, source_fd, source_path, true)); From 7762dad2a766acb3c77735b50082ec210d8b5788 Mon Sep 17 00:00:00 2001 From: Arshia Ghafoori Date: Fri, 8 Nov 2024 18:18:52 +0400 Subject: [PATCH 2/3] Fix inodes' name becoming stale after a rename --- lib/wasix/src/fs/fd.rs | 2 +- lib/wasix/src/fs/mod.rs | 23 ++++++++++--------- .../src/syscalls/wasi/fd_prestat_dir_name.rs | 11 +++++---- lib/wasix/src/syscalls/wasi/fd_readdir.rs | 12 ++++++++-- lib/wasix/src/syscalls/wasi/path_rename.rs | 3 ++- 5 files changed, 31 insertions(+), 20 deletions(-) diff --git a/lib/wasix/src/fs/fd.rs b/lib/wasix/src/fs/fd.rs index 06909f0053f..cf133dcca85 100644 --- a/lib/wasix/src/fs/fd.rs +++ b/lib/wasix/src/fs/fd.rs @@ -62,7 +62,7 @@ impl Fd { pub struct InodeVal { pub stat: RwLock, pub is_preopened: bool, - pub name: Cow<'static, str>, + pub name: RwLock>, pub kind: RwLock, } diff --git a/lib/wasix/src/fs/mod.rs b/lib/wasix/src/fs/mod.rs index d230414f61c..e37a4cda347 100644 --- a/lib/wasix/src/fs/mod.rs +++ b/lib/wasix/src/fs/mod.rs @@ -676,7 +676,7 @@ impl WasiFs { let root_inode = inodes.add_inode_val(InodeVal { stat: RwLock::new(stat), is_preopened: true, - name: "/".into(), + name: RwLock::new("/".into()), kind: RwLock::new(root_kind), }); @@ -1344,13 +1344,14 @@ impl WasiFs { follow_symlinks: bool, ) -> Result { let base_inode = self.get_fd_inode(base)?; - let start_inode = - if !base_inode.deref().name.starts_with('/') && self.is_wasix.load(Ordering::Acquire) { - let (cur_inode, _) = self.get_current_dir(inodes, base)?; - cur_inode - } else { - self.get_fd_inode(base)? - }; + let start_inode = if !base_inode.deref().name.read().unwrap().starts_with('/') + && self.is_wasix.load(Ordering::Acquire) + { + let (cur_inode, _) = self.get_current_dir(inodes, base)?; + cur_inode + } else { + self.get_fd_inode(base)? + }; self.get_inode_at_path_inner(inodes, start_inode, path, 0, follow_symlinks) } @@ -1505,7 +1506,7 @@ impl WasiFs { // REVIEW: // no need for +1, because there is no 0 end-of-string marker // john: removing the +1 seems cause regression issues - pr_name_len: inode_val.name.len() as u32 + 1, + pr_name_len: inode_val.name.read().unwrap().len() as u32 + 1, } .untagged(), } @@ -1616,7 +1617,7 @@ impl WasiFs { inodes.add_inode_val(InodeVal { stat: RwLock::new(stat), is_preopened, - name, + name: RwLock::new(name), kind: RwLock::new(kind), }) } @@ -2002,7 +2003,7 @@ impl WasiFs { inodes.add_inode_val(InodeVal { stat: RwLock::new(stat), is_preopened: true, - name: name.to_string().into(), + name: RwLock::new(name.to_string().into()), kind: RwLock::new(kind), }) }; diff --git a/lib/wasix/src/syscalls/wasi/fd_prestat_dir_name.rs b/lib/wasix/src/syscalls/wasi/fd_prestat_dir_name.rs index 9cdf72532e4..3e8b9dda5b6 100644 --- a/lib/wasix/src/syscalls/wasi/fd_prestat_dir_name.rs +++ b/lib/wasix/src/syscalls/wasi/fd_prestat_dir_name.rs @@ -13,7 +13,8 @@ pub fn fd_prestat_dir_name( let path_chars = wasi_try_mem!(path.slice(&memory, path_len)); let inode = wasi_try!(state.fs.get_fd_inode(fd)); - Span::current().record("path", inode.name.as_ref()); + let name = inode.name.read().unwrap(); + Span::current().record("path", name.as_ref()); // check inode-val.is_preopened? @@ -22,11 +23,11 @@ pub fn fd_prestat_dir_name( Kind::Dir { .. } | Kind::Root { .. } => { // TODO: verify this: null termination, etc let path_len: u64 = path_len.into(); - if (inode.name.len() as u64) < path_len { + if (name.len() as u64) < path_len { wasi_try_mem!(path_chars - .subslice(0..inode.name.len() as u64) - .write_slice(inode.name.as_bytes())); - wasi_try_mem!(path_chars.index(inode.name.len() as u64).write(0)); + .subslice(0..name.len() as u64) + .write_slice(name.as_bytes())); + wasi_try_mem!(path_chars.index(name.len() as u64).write(0)); //trace!("=> result: \"{}\"", inode_val.name); diff --git a/lib/wasix/src/syscalls/wasi/fd_readdir.rs b/lib/wasix/src/syscalls/wasi/fd_readdir.rs index 2595b1e689c..89ef2f3dd2c 100644 --- a/lib/wasix/src/syscalls/wasi/fd_readdir.rs +++ b/lib/wasix/src/syscalls/wasi/fd_readdir.rs @@ -64,7 +64,11 @@ pub fn fd_readdir( entry_vec.extend(entries.iter().filter(|(_, inode)| inode.is_preopened).map( |(name, inode)| { let stat = inode.stat.read().unwrap(); - (inode.name.to_string(), stat.st_filetype, stat.st_ino) + ( + inode.name.read().unwrap().to_string(), + stat.st_filetype, + stat.st_ino, + ) }, )); // adding . and .. special folders @@ -88,7 +92,11 @@ pub fn fd_readdir( .into_iter() .map(|(name, inode)| { let stat = inode.stat.read().unwrap(); - (format!("/{}", inode.name), stat.st_filetype, stat.st_ino) + ( + format!("/{}", inode.name.read().unwrap().as_ref()), + stat.st_filetype, + stat.st_ino, + ) }) .collect() } diff --git a/lib/wasix/src/syscalls/wasi/path_rename.rs b/lib/wasix/src/syscalls/wasi/path_rename.rs index 08de4578519..0ba352d34df 100644 --- a/lib/wasix/src/syscalls/wasi/path_rename.rs +++ b/lib/wasix/src/syscalls/wasi/path_rename.rs @@ -206,7 +206,7 @@ pub fn path_rename_internal( if need_create { let mut guard = target_parent_inode.write(); if let Kind::Dir { entries, .. } = guard.deref_mut() { - let result = entries.insert(target_entry_name, source_entry); + let result = entries.insert(target_entry_name.clone(), source_entry); assert!( result.is_none(), "fatal error: race condition on filesystem detected or internal logic error" @@ -219,6 +219,7 @@ pub fn path_rename_internal( wasi_try_ok!(state .fs .get_inode_at_path(inodes, target_fd, target_path, true)); + *target_inode.name.write().unwrap() = target_entry_name.into(); target_inode.stat.write().unwrap().st_size = source_size; Ok(Errno::Success) From b65ec18709b5b95c6afaa6110d976641778bd8dc Mon Sep 17 00:00:00 2001 From: Arshia Ghafoori Date: Fri, 8 Nov 2024 18:39:06 +0400 Subject: [PATCH 3/3] Add test for mkdir -> rename -> mkdir --- tests/integration/cli/tests/snapshot.rs | 9 +++++++ .../snapshot__snapshot_mkdir_rename.snap | 22 ++++++++++++++++++ .../cli/tests/wasm/mkdir-rename.wasm | Bin 0 -> 139526 bytes tests/rust-wasi-tests/src/bin/mkdir-rename.rs | 12 ++++++++++ 4 files changed, 43 insertions(+) create mode 100644 tests/integration/cli/tests/snapshots/snapshot__snapshot_mkdir_rename.snap create mode 100644 tests/integration/cli/tests/wasm/mkdir-rename.wasm create mode 100644 tests/rust-wasi-tests/src/bin/mkdir-rename.rs diff --git a/tests/integration/cli/tests/snapshot.rs b/tests/integration/cli/tests/snapshot.rs index 570c1b390a0..b461122c9d5 100644 --- a/tests/integration/cli/tests/snapshot.rs +++ b/tests/integration/cli/tests/snapshot.rs @@ -1359,3 +1359,12 @@ fn test_snapshot_worker_panicking() { )); assert_json_snapshot!(snapshot); } + +#[cfg_attr(any(target_env = "musl", target_os = "windows"), ignore)] +#[test] +fn test_snapshot_mkdir_rename() { + let snapshot = TestBuilder::new() + .with_name(function!()) + .run_wasm(include_bytes!("./wasm/mkdir-rename.wasm")); + assert_json_snapshot!(snapshot); +} diff --git a/tests/integration/cli/tests/snapshots/snapshot__snapshot_mkdir_rename.snap b/tests/integration/cli/tests/snapshots/snapshot__snapshot_mkdir_rename.snap new file mode 100644 index 00000000000..ec4c07b5e94 --- /dev/null +++ b/tests/integration/cli/tests/snapshots/snapshot__snapshot_mkdir_rename.snap @@ -0,0 +1,22 @@ +--- +source: tests/integration/cli/tests/snapshot.rs +assertion_line: 1369 +expression: snapshot +--- +{ + "spec": { + "name": "snapshot::test_snapshot_mkdir_rename", + "use_packages": [], + "include_webcs": [], + "cli_args": [], + "enable_threads": true, + "enable_network": false + }, + "result": { + "Success": { + "stdout": "", + "stderr": "", + "exit_code": 0 + } + } +} diff --git a/tests/integration/cli/tests/wasm/mkdir-rename.wasm b/tests/integration/cli/tests/wasm/mkdir-rename.wasm new file mode 100644 index 0000000000000000000000000000000000000000..ad160ef9f9990aa1be1d81da8890f93869208631 GIT binary patch literal 139526 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 literal 0 HcmV?d00001 diff --git a/tests/rust-wasi-tests/src/bin/mkdir-rename.rs b/tests/rust-wasi-tests/src/bin/mkdir-rename.rs new file mode 100644 index 00000000000..9a20a4e2f0d --- /dev/null +++ b/tests/rust-wasi-tests/src/bin/mkdir-rename.rs @@ -0,0 +1,12 @@ +fn main() { + std::fs::create_dir("/a").unwrap(); + assert!(std::fs::metadata("/a").unwrap().is_dir()); + + std::fs::rename("/a", "/b").unwrap(); + assert!(matches!(std::fs::metadata("/a"), Err(e) if e.kind() == std::io::ErrorKind::NotFound)); + assert!(std::fs::metadata("/b").unwrap().is_dir()); + + std::fs::create_dir("/a").unwrap(); + assert!(std::fs::metadata("/a").unwrap().is_dir()); + assert!(std::fs::metadata("/b").unwrap().is_dir()); +}