diff --git a/lib/wasi/src/state/builder.rs b/lib/wasi/src/state/builder.rs index 0bd8bd2185d..fd3ab222192 100644 --- a/lib/wasi/src/state/builder.rs +++ b/lib/wasi/src/state/builder.rs @@ -438,6 +438,9 @@ impl PreopenDirBuilder { /// Make this preopened directory appear to the WASI program as `alias` pub fn alias(&mut self, alias: &str) -> &mut Self { + // We mount at preopened dirs at `/` by default and multiple `/` in a row + // are equal to a single `/`. + let alias = alias.trim_start_matches(b'/'); self.alias = Some(alias.to_string()); self diff --git a/tests/wasi-wast/wasi/snapshot1/mapdir_with_leading_slash.wasm b/tests/wasi-wast/wasi/snapshot1/mapdir_with_leading_slash.wasm new file mode 100644 index 00000000000..26e68d85722 Binary files /dev/null and b/tests/wasi-wast/wasi/snapshot1/mapdir_with_leading_slash.wasm differ diff --git a/tests/wasi-wast/wasi/snapshot1/mapdir_with_leading_slash.wast b/tests/wasi-wast/wasi/snapshot1/mapdir_with_leading_slash.wast new file mode 100644 index 00000000000..945e660f72c --- /dev/null +++ b/tests/wasi-wast/wasi/snapshot1/mapdir_with_leading_slash.wast @@ -0,0 +1,7 @@ +;; This file was generated by https://github.com/wasmerio/wasi-tests + +(wasi_test "mapdir_with_leading_slash.wasm" + (map_dirs "/hamlet:test_fs/hamlet") + (assert_return (i64.const 0)) + (assert_stdout "File exists? true\nSCENE III. A room in the castle.\n\n Enter KING CLAUDIUS, ROSENCRANTZ, and GUILDENSTERN \n\nKING CLAUDIUS\n\n I like him not, nor stands it safe with us\n To let his madness range. Therefore prepare you;\n I your commission will forthwith dispatch,\n \n") +) diff --git a/tests/wasi-wast/wasi/tests/mapdir_with_leading_slash.rs b/tests/wasi-wast/wasi/tests/mapdir_with_leading_slash.rs new file mode 100644 index 00000000000..979af37e3dc --- /dev/null +++ b/tests/wasi-wast/wasi/tests/mapdir_with_leading_slash.rs @@ -0,0 +1,23 @@ +// WASI: +// mapdir: /hamlet:test_fs/hamlet + +use std::fs; +use std::io::Read; +use std::path::PathBuf; + +fn main() { + #[cfg(not(target_os = "wasi"))] + let mut base = PathBuf::from("test_fs/hamlet"); + #[cfg(target_os = "wasi")] + let mut base = PathBuf::from("hamlet"); + + base.push("act3/scene3.txt"); + + println!("File exists? {}", base.exists()); + + let mut f = fs::File::open(&base).unwrap(); + let mut s = String::new(); + f.read_to_string(&mut s).unwrap(); + + println!("{}", s.chars().take(256).collect::()); +} diff --git a/tests/wasi-wast/wasi/unstable/mapdir_with_leading_slash.wasm b/tests/wasi-wast/wasi/unstable/mapdir_with_leading_slash.wasm new file mode 100644 index 00000000000..eacc71d81e3 Binary files /dev/null and b/tests/wasi-wast/wasi/unstable/mapdir_with_leading_slash.wasm differ diff --git a/tests/wasi-wast/wasi/unstable/mapdir_with_leading_slash.wast b/tests/wasi-wast/wasi/unstable/mapdir_with_leading_slash.wast new file mode 100644 index 00000000000..945e660f72c --- /dev/null +++ b/tests/wasi-wast/wasi/unstable/mapdir_with_leading_slash.wast @@ -0,0 +1,7 @@ +;; This file was generated by https://github.com/wasmerio/wasi-tests + +(wasi_test "mapdir_with_leading_slash.wasm" + (map_dirs "/hamlet:test_fs/hamlet") + (assert_return (i64.const 0)) + (assert_stdout "File exists? true\nSCENE III. A room in the castle.\n\n Enter KING CLAUDIUS, ROSENCRANTZ, and GUILDENSTERN \n\nKING CLAUDIUS\n\n I like him not, nor stands it safe with us\n To let his madness range. Therefore prepare you;\n I your commission will forthwith dispatch,\n \n") +)