From 4734bbd224cbeda9022e10b37a0f485e8f5aba9c Mon Sep 17 00:00:00 2001 From: mkusaka Date: Wed, 4 Mar 2026 01:29:10 +0900 Subject: [PATCH 1/3] test(wasi): add failing test for path_open preopens resolution path_open resolves file paths against cwd instead of the preopen directory's host path. This causes absolute paths to be doubled (e.g., /tmp/foo becomes /tmp/foo) and fail with ENOENT. read-file.wasm is a minimal Rust WASI binary (wasm32-wasip1) that reads a file from args and prints its contents. Built with: cargo build --target wasm32-wasip1 --release --- test/js/bun/wasm/read-file.wasm | Bin 0 -> 93317 bytes test/js/bun/wasm/wasi.test.js | 47 ++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100755 test/js/bun/wasm/read-file.wasm diff --git a/test/js/bun/wasm/read-file.wasm b/test/js/bun/wasm/read-file.wasm new file mode 100755 index 0000000000000000000000000000000000000000..603b46273337429dc7a78bb8abb458dd46e95365 GIT binary patch literal 93317 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

LAL6W8B# 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 F{$I%Y4blJr literal 0 HcmV?d00001 diff --git a/test/js/bun/wasm/wasi.test.js b/test/js/bun/wasm/wasi.test.js index 5e6994a50457..cb1a8323f4de 100644 --- a/test/js/bun/wasm/wasi.test.js +++ b/test/js/bun/wasm/wasi.test.js @@ -1,6 +1,9 @@ import { spawnSync } from "bun"; import { expect, it } from "bun:test"; import { bunEnv, bunExe } from "harness"; +import { mkdtempSync, writeFileSync, rmSync } from "fs"; +import { join } from "path"; +import { tmpdir } from "os"; it("Should support printing 'hello world'", () => { const { stdout, stderr, exitCode } = spawnSync({ @@ -20,3 +23,47 @@ it("Should support printing 'hello world'", () => { exitCode: 0, }); }); + +it("path_open should resolve paths against preopens, not cwd", () => { + // Create a temp file to read via WASI + const tmp = mkdtempSync(join(tmpdir(), "bun-wasi-test-")); + const testFile = join(tmp, "input.txt"); + writeFileSync(testFile, "hello from preopens\n"); + + try { + // read-file.wasm: minimal Rust WASI binary that reads a file path from args + // and prints its contents to stdout. + // + // Built from: + // cargo new --name read-file-wasi read-file-wasi + // # src/main.rs: + // # use std::{env, fs, process}; + // # fn main() { + // # let args: Vec = env::args().collect(); + // # if args.len() < 2 { eprintln!("usage: read-file "); process::exit(1); } + // # match fs::read_to_string(&args[1]) { + // # Ok(c) => print!("{}", c), + // # Err(e) => { eprintln!("error: {}: {}", args[1], e); process::exit(1); } + // # } + // # } + // cargo build --target wasm32-wasip1 --release + const { stdout, stderr, exitCode } = spawnSync({ + cmd: [bunExe(), import.meta.dir + "/read-file.wasm", testFile], + stdout: "pipe", + stderr: "pipe", + env: bunEnv, + }); + + expect({ + stdout: stdout.toString(), + stderr: stderr.toString(), + exitCode: exitCode, + }).toEqual({ + stdout: "hello from preopens\n", + stderr: "", + exitCode: 0, + }); + } finally { + rmSync(tmp, { recursive: true, force: true }); + } +}); From b0783a0ebd517d0f9c3bcd7ce627da6e7879fb1c Mon Sep 17 00:00:00 2001 From: mkusaka Date: Wed, 4 Mar 2026 01:30:01 +0900 Subject: [PATCH 2/3] fix(wasi): resolve path_open paths against preopen directory, not cwd path_open was discarding the CHECK_FD result and resolving guest paths with path.resolve(p), which uses cwd as the base. This caused absolute paths like /tmp/foo to become /tmp/foo, resulting in ENOENT. Capture the CHECK_FD result and use stats.path (the preopen host path) as the base directory, matching the pattern used by path_readlink, path_create_directory, path_unlink_file, and other path syscalls. --- src/js/node/wasi.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/node/wasi.ts b/src/js/node/wasi.ts index a0ae57df5c5c..0a8de0c85b1a 100644 --- a/src/js/node/wasi.ts +++ b/src/js/node/wasi.ts @@ -1437,7 +1437,7 @@ var require_wasi = __commonJS({ path_open: wrap( (dirfd, _dirflags, pathPtr, pathLen, oflags, fsRightsBase, fsRightsInheriting, fsFlags, fdPtr) => { try { - CHECK_FD(dirfd, constants_1.WASI_RIGHT_PATH_OPEN); + const stats = CHECK_FD(dirfd, constants_1.WASI_RIGHT_PATH_OPEN); fsRightsBase = BigInt(fsRightsBase); fsRightsInheriting = BigInt(fsRightsInheriting); const read = @@ -1512,7 +1512,7 @@ var require_wasi = __commonJS({ if (p.startsWith("proc/")) { throw new types_1.WASIError(constants_1.WASI_EBADF); } - const fullUnresolved = path.resolve(p); + const fullUnresolved = path.resolve(stats.path, p); let full; try { full = fs.realpathSync(fullUnresolved); From 86126564a4249888a81099a0f20b381e683484e2 Mon Sep 17 00:00:00 2001 From: mkusaka Date: Wed, 4 Mar 2026 01:38:36 +0900 Subject: [PATCH 3/3] refactor(test): use tempDirWithFiles from harness for WASI test Replace manual mkdtempSync/rmSync with harness's tempDirWithFiles helper per Bun coding guidelines. --- test/js/bun/wasm/wasi.test.js | 79 ++++++++++++++++------------------- 1 file changed, 36 insertions(+), 43 deletions(-) diff --git a/test/js/bun/wasm/wasi.test.js b/test/js/bun/wasm/wasi.test.js index cb1a8323f4de..3e0f0b5f328a 100644 --- a/test/js/bun/wasm/wasi.test.js +++ b/test/js/bun/wasm/wasi.test.js @@ -1,9 +1,6 @@ import { spawnSync } from "bun"; import { expect, it } from "bun:test"; -import { bunEnv, bunExe } from "harness"; -import { mkdtempSync, writeFileSync, rmSync } from "fs"; -import { join } from "path"; -import { tmpdir } from "os"; +import { bunEnv, bunExe, tempDirWithFiles } from "harness"; it("Should support printing 'hello world'", () => { const { stdout, stderr, exitCode } = spawnSync({ @@ -25,45 +22,41 @@ it("Should support printing 'hello world'", () => { }); it("path_open should resolve paths against preopens, not cwd", () => { - // Create a temp file to read via WASI - const tmp = mkdtempSync(join(tmpdir(), "bun-wasi-test-")); - const testFile = join(tmp, "input.txt"); - writeFileSync(testFile, "hello from preopens\n"); + const tmp = tempDirWithFiles("bun-wasi-test", { + "input.txt": "hello from preopens\n", + }); + const testFile = `${tmp}/input.txt`; - try { - // read-file.wasm: minimal Rust WASI binary that reads a file path from args - // and prints its contents to stdout. - // - // Built from: - // cargo new --name read-file-wasi read-file-wasi - // # src/main.rs: - // # use std::{env, fs, process}; - // # fn main() { - // # let args: Vec = env::args().collect(); - // # if args.len() < 2 { eprintln!("usage: read-file "); process::exit(1); } - // # match fs::read_to_string(&args[1]) { - // # Ok(c) => print!("{}", c), - // # Err(e) => { eprintln!("error: {}: {}", args[1], e); process::exit(1); } - // # } - // # } - // cargo build --target wasm32-wasip1 --release - const { stdout, stderr, exitCode } = spawnSync({ - cmd: [bunExe(), import.meta.dir + "/read-file.wasm", testFile], - stdout: "pipe", - stderr: "pipe", - env: bunEnv, - }); + // read-file.wasm: minimal Rust WASI binary (wasm32-wasip1) that reads a file + // path from args and prints its contents to stdout. + // + // Built with: + // cargo init --name read-file-wasi + // # src/main.rs: + // # use std::{env, fs, process}; + // # fn main() { + // # let args: Vec = env::args().collect(); + // # if args.len() < 2 { eprintln!("usage: read-file "); process::exit(1); } + // # match fs::read_to_string(&args[1]) { + // # Ok(c) => print!("{}", c), + // # Err(e) => { eprintln!("error: {}: {}", args[1], e); process::exit(1); } + // # } + // # } + // cargo build --target wasm32-wasip1 --release + const { stdout, stderr, exitCode } = spawnSync({ + cmd: [bunExe(), import.meta.dir + "/read-file.wasm", testFile], + stdout: "pipe", + stderr: "pipe", + env: bunEnv, + }); - expect({ - stdout: stdout.toString(), - stderr: stderr.toString(), - exitCode: exitCode, - }).toEqual({ - stdout: "hello from preopens\n", - stderr: "", - exitCode: 0, - }); - } finally { - rmSync(tmp, { recursive: true, force: true }); - } + expect({ + stdout: stdout.toString(), + stderr: stderr.toString(), + exitCode: exitCode, + }).toEqual({ + stdout: "hello from preopens\n", + stderr: "", + exitCode: 0, + }); });