From 67670870046425bf00da297b8bcac849be80764d Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Wed, 28 Aug 2019 15:13:30 -0700 Subject: [PATCH] Always flush when writing, even if we get invalid pointers --- lib/wasi/src/syscalls/mod.rs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/wasi/src/syscalls/mod.rs b/lib/wasi/src/syscalls/mod.rs index dc8bebff4ec..d1c44ca2797 100644 --- a/lib/wasi/src/syscalls/mod.rs +++ b/lib/wasi/src/syscalls/mod.rs @@ -34,7 +34,7 @@ pub(crate) fn get_wasi_state(ctx: &Ctx) -> &mut WasiState { unsafe { state::get_wasi_state(&mut *(ctx as *const Ctx as *mut Ctx)) } } -fn write_bytes( +fn write_bytes_inner( mut write_loc: T, memory: &Memory, iovs_arr_cell: &[Cell<__wasi_ciovec_t>], @@ -44,19 +44,25 @@ fn write_bytes( let iov_inner = iov.get(); let bytes = iov_inner.buf.deref(memory, 0, iov_inner.buf_len)?; write_loc - .write(&bytes.iter().map(|b_cell| b_cell.get()).collect::>()) - .map_err(|_| { - write_loc.flush(); - __WASI_EIO - })?; + .write_all(&bytes.iter().map(|b_cell| b_cell.get()).collect::>()) + .map_err(|_| __WASI_EIO)?; // TODO: handle failure more accurately bytes_written += iov_inner.buf_len; } - write_loc.flush(); Ok(bytes_written) } +fn write_bytes( + mut write_loc: T, + memory: &Memory, + iovs_arr_cell: &[Cell<__wasi_ciovec_t>], +) -> Result { + let result = write_bytes_inner(&mut write_loc, memory, iovs_arr_cell); + write_loc.flush(); + result +} + fn read_bytes( mut reader: T, memory: &Memory,