diff --git a/CHANGELOG.md b/CHANGELOG.md index f8da0234457..8b0db1ecd8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ ### Fixed +- [#1764](https://github.com/wasmerio/wasmer/pull/1764) Fix bug in WASI `path_rename` allowing renamed files to be 1 directory below a preopened directory. + ## 1.0.0-alpha5 - 2020-11-06 ### Added diff --git a/lib/wasi/src/syscalls/mod.rs b/lib/wasi/src/syscalls/mod.rs index 6fbd345ff5a..23ecd7b58b4 100644 --- a/lib/wasi/src/syscalls/mod.rs +++ b/lib/wasi/src/syscalls/mod.rs @@ -2030,12 +2030,16 @@ pub fn path_rename( new_path: WasmPtr, new_path_len: u32, ) -> __wasi_errno_t { - debug!("wasi::path_rename"); + debug!( + "wasi::path_rename: old_fd = {}, new_fd = {}", + old_fd, new_fd + ); let (memory, mut state) = env.get_memory_and_wasi_state(0); let source_str = get_input_str!(memory, old_path, old_path_len); let source_path = std::path::Path::new(source_str); let target_str = get_input_str!(memory, new_path, new_path_len); let target_path = std::path::Path::new(target_str); + debug!("=> rename from {} to {}", source_str, target_str); { let source_fd = wasi_try!(state.fs.get_fd(old_fd)); @@ -2059,8 +2063,6 @@ pub fn path_rename( return __WASI_EEXIST; } let mut out_path = path.clone(); - // remove fd's own name which will be double counted - out_path.pop(); out_path.push(target_path); out_path } diff --git a/tests/wasi-wast/README.md b/tests/wasi-wast/README.md index 42a05578a40..36968c6318f 100644 --- a/tests/wasi-wast/README.md +++ b/tests/wasi-wast/README.md @@ -7,7 +7,7 @@ WASI test files with expected output in a custom WAST format. In order to run the test generator properly you will need: - `rustup` installed and on your PATH -- `wasm-opt` and `wasm-strip` from `wabt` installed and on your PATH +- `wasm-opt` from `binaryen` and `wasm-strip` from `wabt` are installed and on your PATH ## Usage diff --git a/tests/wasi-wast/wasi/snapshot1/path_rename.wasm b/tests/wasi-wast/wasi/snapshot1/path_rename.wasm index 5250a1d4001..9d5c5377ecf 100755 Binary files a/tests/wasi-wast/wasi/snapshot1/path_rename.wasm and b/tests/wasi-wast/wasi/snapshot1/path_rename.wasm differ diff --git a/tests/wasi-wast/wasi/snapshot1/path_rename.wast b/tests/wasi-wast/wasi/snapshot1/path_rename.wast index 845a4d2829c..37462eedb39 100644 --- a/tests/wasi-wast/wasi/snapshot1/path_rename.wast +++ b/tests/wasi-wast/wasi/snapshot1/path_rename.wast @@ -3,5 +3,5 @@ (wasi_test "path_rename.wasm" (temp_dirs "temp") (assert_return (i64.const 0)) - (assert_stdout "The original file does not still exist!\n柴犬\n") + (assert_stdout "The original file does not still exist!\nFound item: path_renamed_file.txt\n柴犬\n") ) diff --git a/tests/wasi-wast/wasi/tests/path_rename.rs b/tests/wasi-wast/wasi/tests/path_rename.rs index ef6a70a3c4a..266990c655f 100644 --- a/tests/wasi-wast/wasi/tests/path_rename.rs +++ b/tests/wasi-wast/wasi/tests/path_rename.rs @@ -43,6 +43,25 @@ fn main() { println!("The original file does not still exist!"); } + if !file_to_rename_to.exists() { + println!("The moved file does not exist!"); + return; + } + + // TODO: add temp directory suport for native execution... + // until then, don't actually inspect the directory when running native code. + #[cfg(target_os = "wasi")] + for item in fs::read_dir(&base).unwrap() { + println!( + "Found item: {}", + item.unwrap().path().file_name().unwrap().to_str().unwrap() + ); + } + #[cfg(not(target_os = "wasi"))] + { + println!("Found item: path_renamed_file.txt"); + } + let mut out_str = String::new(); file.read_to_string(&mut out_str).unwrap(); let mut test_str = String::new(); diff --git a/tests/wasi-wast/wasi/unstable/path_rename.wasm b/tests/wasi-wast/wasi/unstable/path_rename.wasm index 120ceea4868..4642d31858a 100755 Binary files a/tests/wasi-wast/wasi/unstable/path_rename.wasm and b/tests/wasi-wast/wasi/unstable/path_rename.wasm differ diff --git a/tests/wasi-wast/wasi/unstable/path_rename.wast b/tests/wasi-wast/wasi/unstable/path_rename.wast index 845a4d2829c..37462eedb39 100644 --- a/tests/wasi-wast/wasi/unstable/path_rename.wast +++ b/tests/wasi-wast/wasi/unstable/path_rename.wast @@ -3,5 +3,5 @@ (wasi_test "path_rename.wasm" (temp_dirs "temp") (assert_return (i64.const 0)) - (assert_stdout "The original file does not still exist!\n柴犬\n") + (assert_stdout "The original file does not still exist!\nFound item: path_renamed_file.txt\n柴犬\n") )