RReverser opened Issue #2642:
Compile this minimal repro sample to WASI:
fn main() -> std::io::Result<()> { let path = std::path::Path::new("dir.tmp"); std::fs::create_dir(path)?; assert!(path.exists()); Ok(()) }and execute with
wasmtime --dir .on Windows.It successfully creates the directory, but the
path.exists()assertion fails.This error does not reproduce either on Linux (with the same binary) or with Wasmer, so it seems to be an OS-specific Wasmtime bug.
RReverser labeled Issue #2642:
Compile this minimal repro sample to WASI:
fn main() -> std::io::Result<()> { let path = std::path::Path::new("dir.tmp"); std::fs::create_dir(path)?; assert!(path.exists()); Ok(()) }and execute with
wasmtime --dir .on Windows.It successfully creates the directory, but the
path.exists()assertion fails.This error does not reproduce either on Linux (with the same binary) or with Wasmer, so it seems to be an OS-specific Wasmtime bug.
tschneidereit assigned Issue #2642:
Compile this minimal repro sample to WASI:
fn main() -> std::io::Result<()> { let path = std::path::Path::new("dir.tmp"); std::fs::create_dir(path)?; assert!(path.exists()); Ok(()) }and execute with
wasmtime --dir .on Windows.It successfully creates the directory, but the
path.exists()assertion fails.This error does not reproduce either on Linux (with the same binary) or with Wasmer, so it seems to be an OS-specific Wasmtime bug.
tschneidereit commented on Issue #2642:
cc @pchickey
pchickey commented on Issue #2642:
I was able to reproduce this by having
--dir .point to a network share drive (which in turn is a virtualbox shared folder) on windows, it succeeds if the directory is on the c: drive. Does that match your setup @RReverser ?
RReverser commented on Issue #2642:
No, it was a regular folder for me.
RReverser commented on Issue #2642:
A simplified example on a different machine, just using a normal dir:
PS C:\src\temp> cat temp.rs fn main() -> std::io::Result<()> { let path = std::path::Path::new("somefolder"); assert!(path.exists()); Ok(()) } PS C:\src\temp> rustc temp.rs --target wasm32-wasi -o temp.wasm -O PS C:\src\temp> mkdir somefolder Directory: C:\src\temp Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 09/02/2021 20:26 somefolder PS C:\src\temp> wasmtime temp.wasm --dir . thread 'main' panicked at 'assertion failed: path.exists()', temp.rs:3:5 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace Error: failed to run main module `temp.wasm` Caused by: 0: failed to invoke command default 1: wasm trap: unreachable wasm backtrace: 0: 0x732c - <unknown>!__rust_start_panic 1: 0x6fd7 - <unknown>!rust_panic 2: 0x6c4d - <unknown>!std::panicking::rust_panic_with_hook::h072472ae3822b936 3: 0x733 - <unknown>!std::panicking::begin_panic::{{closure}}::hfed4ec7863cc1289 4: 0x6fa - <unknown>!std::sys_common::backtrace::__rust_end_short_backtrace::hfec2f5ffa151ce3e 5: 0x5b4 - <unknown>!std::panicking::begin_panic::h149d16135664954e 6: 0x673 - <unknown>!temp::main::h842f3f6f3b24d55a 7: 0x754 - <unknown>!std::sys_common::backtrace::__rust_begin_short_backtrace::hf584982b1a42bf23 8: 0x51b - <unknown>!std::rt::lang_start::{{closure}}::hc3a5cf2a7641d397 9: 0x70e8 - <unknown>!std::rt::lang_start_internal::ha925d42982681c99 10: 0x6aa - <unknown>!__original_main 11: 0x3cd - <unknown>!_start note: run with `WASMTIME_BACKTRACE_DETAILS=1` environment variable to display more information
RReverser edited a comment on Issue #2642:
A simplified example on a different machine, just using a normal dir:
PS C:\src\temp> cat temp.rs fn main() -> std::io::Result<()> { let path = std::path::Path::new("somefolder"); assert!(path.exists()); Ok(()) } PS C:\src\temp> rustc temp.rs --target wasm32-wasi -o temp.wasm -O PS C:\src\temp> mkdir somefolder Directory: C:\src\temp Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 09/02/2021 20:26 somefolder PS C:\src\temp> wasmtime temp.wasm --dir . thread 'main' panicked at 'assertion failed: path.exists()', temp.rs:3:5 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace Error: failed to run main module `temp.wasm` Caused by: 0: failed to invoke command default 1: wasm trap: unreachable wasm backtrace: 0: 0x732c - <unknown>!__rust_start_panic 1: 0x6fd7 - <unknown>!rust_panic 2: 0x6c4d - <unknown>!std::panicking::rust_panic_with_hook::h072472ae3822b936 3: 0x733 - <unknown>!std::panicking::begin_panic::{{closure}}::hfed4ec7863cc1289 4: 0x6fa - <unknown>!std::sys_common::backtrace::__rust_end_short_backtrace::hfec2f5ffa151ce3e 5: 0x5b4 - <unknown>!std::panicking::begin_panic::h149d16135664954e 6: 0x673 - <unknown>!temp::main::h842f3f6f3b24d55a 7: 0x754 - <unknown>!std::sys_common::backtrace::__rust_begin_short_backtrace::hf584982b1a42bf23 8: 0x51b - <unknown>!std::rt::lang_start::{{closure}}::hc3a5cf2a7641d397 9: 0x70e8 - <unknown>!std::rt::lang_start_internal::ha925d42982681c99 10: 0x6aa - <unknown>!__original_main 11: 0x3cd - <unknown>!_start note: run with `WASMTIME_BACKTRACE_DETAILS=1` environment variable to display more information PS C:\src\temp> wasmer temp.wasm --dir . PS C:\src\temp>
pchickey commented on Issue #2642:
With that smaller example I have the same behavior as before - passes when running on c:, fails when running on z:. I'll see if I can get a colleague to reproduce it.
pchickey edited a comment on Issue #2642:
With that smaller example I have the same behavior as before - passes when running on c:, fails when running on z:. I'll see if I can get a colleague to reproduce it.
I am running wasmtime ab811d7445b3cf19640b97ca45372a0987da81c5 built in debug mode
peterhuene commented on Issue #2642:
If I use 40c4c6ac9bde95c72666d0cafb2ede6c7045edf9, I get the same behavior as @RReverser when
somefolderis a directory and not a file.It looks like
path_filestat_getwith the directory results inEACCES:DEBUG wasi_common::wasi > Error: Acces TRACE wasi_common::wasi::wasi_snapshot_preview1 > error=Ok(Acces)When it's a file, the
path_filestat_getcall succeeds and there's no panic from the assert.With e4827ad779c8adf5d99d9b1a1aa62f07af78c892, the repro succeeds with both a directory and file provided the CWD is not a mapped drive.
When it is a mapped drive, it appears we're messing around with path prefixes with
strip_extended_prefixto remove\\?\which results inout_pathbeingUNC\\<path>\\somefolderrather than\\?\UNC\<path>\\somefolder, which results in aENOENTerror for the path as there's no relativeUNCdirectory.Thus mapped drives don't work at all for files or directories.
peterhuene commented on Issue #2642:
I should note that the problem I noticed with the weird UNC path was before the cap-std change was merged, but I suspect something similar is going on such that
\\?\prefixed paths are breaking WASI.
peterhuene commented on Issue #2642:
Indeed, the same prefix-stripping code is in
cap-primitives: https://github.com/bytecodealliance/cap-std/blob/main/cap-primitives/src/windows/fs/get_path.rs
peterhuene edited a comment on Issue #2642:
I should note that the problem I noticed with the weird UNC path was before the cap-std change was merged, but I suspect something similar is going on such that
\\?\prefixed paths are breaking cap-std.
RReverser commented on Issue #2642:
With e4827ad, the repro succeeds with both a directory and file provided the CWD is not a mapped drive.
Ah, so it's fixed on the main branch, just not in the latest release?
peterhuene commented on Issue #2642:
With the exception of UNC paths, I believe so.
RReverser commented on Issue #2642:
Heh, in that case perfect timing for the issue on my side - just the day after it was fixed :sweat_smile:
pchickey commented on Issue #2642:
Thanks for reporting this and for bearing with us while we whittled down two independent problems. I've made a new issue to track the UNC paths problems, and will close this issue.
pchickey closed Issue #2642 (assigned to pchickey):
Compile this minimal repro sample to WASI:
fn main() -> std::io::Result<()> { let path = std::path::Path::new("dir.tmp"); std::fs::create_dir(path)?; assert!(path.exists()); Ok(()) }and execute with
wasmtime --dir .on Windows.It successfully creates the directory, but the
path.exists()assertion fails.This error does not reproduce either on Linux (with the same binary) or with Wasmer, so it seems to be an OS-specific Wasmtime bug.
RReverser commented on Issue #2642:
@pchickey Do you happen to have a date of the next release? It's not super-urgent, just a bit annoying issue to deal with.
Last updated: Dec 06 2025 at 06:05 UTC