From e4ce04bab42a325bbffe7d83e759a2b99e185c8d Mon Sep 17 00:00:00 2001 From: Pat Hickey Date: Fri, 5 Feb 2021 17:50:20 -0800 Subject: [PATCH] WasiCtx: default to empty/sink stdio files rather than throw the test harness now uses the empty stdin file. I tested manually that the sink stdout & stderr files work, but theres no test in tree at the moment --- .../tests/wasm_tests/runtime/cap_std_sync.rs | 3 +- crates/wasi-common/src/ctx.rs | 37 +++++++------------ 2 files changed, 15 insertions(+), 25 deletions(-) diff --git a/crates/test-programs/tests/wasm_tests/runtime/cap_std_sync.rs b/crates/test-programs/tests/wasm_tests/runtime/cap_std_sync.rs index 089d393ea3..5900e6a19c 100644 --- a/crates/test-programs/tests/wasm_tests/runtime/cap_std_sync.rs +++ b/crates/test-programs/tests/wasm_tests/runtime/cap_std_sync.rs @@ -1,7 +1,7 @@ use anyhow::Context; use std::path::Path; use wasi_cap_std_sync::WasiCtxBuilder; -use wasi_common::pipe::{ReadPipe, WritePipe}; +use wasi_common::pipe::WritePipe; use wasmtime::{Linker, Module, Store}; pub fn instantiate(data: &[u8], bin_name: &str, workspace: Option<&Path>) -> anyhow::Result<()> { @@ -18,7 +18,6 @@ pub fn instantiate(data: &[u8], bin_name: &str, workspace: Option<&Path>) -> any builder = builder .arg(bin_name)? .arg(".")? - .stdin(Box::new(ReadPipe::from(Vec::new()))) .stdout(Box::new(stdout.clone())) .stderr(Box::new(stderr.clone())); diff --git a/crates/wasi-common/src/ctx.rs b/crates/wasi-common/src/ctx.rs index 20a9ef7064..cdf89fb890 100644 --- a/crates/wasi-common/src/ctx.rs +++ b/crates/wasi-common/src/ctx.rs @@ -65,16 +65,19 @@ pub struct WasiCtxBuilder(WasiCtx); impl WasiCtxBuilder { pub fn build(self) -> Result { use crate::file::TableFileExt; - let t = self.0.table(); - for (fd, name) in ["stdin", "stdout", "stderr"].iter().enumerate() { - if t.get_file(fd as u32).is_err() { - return Err(anyhow::anyhow!( - "Cannot build WasiCtx: Missing required file `{}`", - name - )); + // Default to an empty readpipe for stdin: + if self.0.table().get_file(0).is_err() { + let stdin = crate::pipe::ReadPipe::new(std::io::empty()); + self.0.insert_file(0, Box::new(stdin), FileCaps::all()); + } + // Default to a sink writepipe for stdout, stderr: + for stdio_write in &[1, 2] { + if self.0.table().get_file(*stdio_write).is_err() { + let output_file = crate::pipe::WritePipe::new(std::io::sink()); + self.0 + .insert_file(*stdio_write, Box::new(output_file), FileCaps::all()); } } - drop(t); Ok(self.0) } @@ -89,29 +92,17 @@ impl WasiCtxBuilder { } pub fn stdin(self, f: Box) -> Self { - self.0.insert_file( - 0, - f, - FileCaps::READ | FileCaps::POLL_READWRITE, // XXX fixme: more rights are ok, but this is read-only - ); + self.0.insert_file(0, f, FileCaps::all()); self } pub fn stdout(self, f: Box) -> Self { - self.0.insert_file( - 1, - f, - FileCaps::WRITE | FileCaps::POLL_READWRITE, // XXX fixme: more rights are ok, but this is append only - ); + self.0.insert_file(1, f, FileCaps::all()); self } pub fn stderr(self, f: Box) -> Self { - self.0.insert_file( - 2, - f, - FileCaps::WRITE | FileCaps::POLL_READWRITE, // XXX fixme: more rights are ok, but this is append only - ); + self.0.insert_file(2, f, FileCaps::all()); self }