diff --git a/lib/wasi/src/syscalls/wasi/fd_read.rs b/lib/wasi/src/syscalls/wasi/fd_read.rs index b67a5bdf7be..343eb5f476e 100644 --- a/lib/wasi/src/syscalls/wasi/fd_read.rs +++ b/lib/wasi/src/syscalls/wasi/fd_read.rs @@ -177,8 +177,7 @@ fn fd_read_internal( .map_err(mem_error_to_wasi)? .access() .map_err(mem_error_to_wasi)?; - - total_read += + let local_read = match handle.read(buf.as_mut()).await.map_err(|err| { let err = From::::from(err); match err { @@ -196,6 +195,10 @@ fn fd_read_internal( Err(_) if total_read > 0 => break, Err(err) => return Err(err), }; + total_read += local_read; + if local_read != buf.len() { + break; + } } Ok(total_read) } @@ -235,9 +238,13 @@ fn fd_read_internal( .access() .map_err(mem_error_to_wasi)?; - total_read += socket + let local_read = socket .recv(tasks.deref(), buf.as_mut_uninit(), fd_flags) .await?; + total_read += local_read; + if total_read != buf.len() { + break; + } } Ok(total_read) }, @@ -279,8 +286,12 @@ fn fd_read_internal( .access() .map_err(mem_error_to_wasi)?; - total_read += + let local_read = virtual_fs::AsyncReadExt::read(&mut pipe, buf.as_mut()).await?; + total_read += local_read; + if local_read != buf.len() { + break; + } } Ok(total_read) } diff --git a/lib/wasi/src/syscalls/wasi/fd_write.rs b/lib/wasi/src/syscalls/wasi/fd_write.rs index 4f553d404df..75078bfdea4 100644 --- a/lib/wasi/src/syscalls/wasi/fd_write.rs +++ b/lib/wasi/src/syscalls/wasi/fd_write.rs @@ -135,11 +135,15 @@ fn fd_write_internal( .map_err(mem_error_to_wasi)? .access() .map_err(mem_error_to_wasi)?; - written += match handle.write(buf.as_ref()).await { + let local_written = match handle.write(buf.as_ref()).await { Ok(s) => s, Err(_) if written > 0 => break, Err(err) => return Err(map_io_err(err)), }; + written += local_written; + if local_written != buf.len() { + break; + } } Ok(written) } @@ -167,7 +171,12 @@ fn fd_write_internal( .map_err(mem_error_to_wasi)? .access() .map_err(mem_error_to_wasi)?; - sent += socket.send(tasks.deref(), buf.as_ref(), fd_flags).await?; + let local_sent = + socket.send(tasks.deref(), buf.as_ref(), fd_flags).await?; + sent += local_sent; + if local_sent != buf.len() { + break; + } } Ok(sent) })?); @@ -180,9 +189,13 @@ fn fd_write_internal( .slice(&memory, iovs.buf_len) .map_err(mem_error_to_wasi)); let buf = wasi_try_ok!(buf.access().map_err(mem_error_to_wasi)); - written += wasi_try_ok!( + let local_written = wasi_try_ok!( std::io::Write::write(pipe, buf.as_ref()).map_err(map_io_err) ); + written += local_written; + if local_written != buf.len() { + break; + } } (written, false) } @@ -221,9 +234,14 @@ fn fd_write_internal( .slice(&memory, iovs.buf_len) .map_err(mem_error_to_wasi)); let buf = wasi_try_ok!(buf.access().map_err(mem_error_to_wasi)); - written += wasi_try_ok!( - std::io::Write::write(buffer, buf.as_ref()).map_err(map_io_err) - ); + let local_written = + wasi_try_ok!( + std::io::Write::write(buffer, buf.as_ref()).map_err(map_io_err) + ); + written += local_written; + if local_written != buf.len() { + break; + } } (written, false) } diff --git a/lib/wasi/src/syscalls/wasix/sock_recv.rs b/lib/wasi/src/syscalls/wasix/sock_recv.rs index ead4dda89b6..bb75faf1dd8 100644 --- a/lib/wasi/src/syscalls/wasix/sock_recv.rs +++ b/lib/wasi/src/syscalls/wasix/sock_recv.rs @@ -113,7 +113,7 @@ fn sock_recv_internal( .access() .map_err(mem_error_to_wasi)?; - total_read += match socket + let local_read = match socket .recv(env.tasks().deref(), buf.as_mut_uninit(), fd.flags) .await { @@ -121,6 +121,10 @@ fn sock_recv_internal( Err(_) if total_read > 0 => break, Err(err) => return Err(err), }; + total_read += local_read; + if local_read != buf.len() { + break; + } } Ok(total_read) }, diff --git a/lib/wasi/src/syscalls/wasix/sock_send.rs b/lib/wasi/src/syscalls/wasix/sock_send.rs index e8263e93742..c802e090e14 100644 --- a/lib/wasi/src/syscalls/wasix/sock_send.rs +++ b/lib/wasi/src/syscalls/wasix/sock_send.rs @@ -43,7 +43,7 @@ pub fn sock_send( .map_err(mem_error_to_wasi)? .access() .map_err(mem_error_to_wasi)?; - sent += match socket + let local_sent = match socket .send(env.tasks().deref(), buf.as_ref(), fd.flags) .await { @@ -51,6 +51,10 @@ pub fn sock_send( Err(_) if sent > 0 => break, Err(err) => return Err(err), }; + sent += local_sent; + if local_sent != buf.len() { + break; + } } Ok(sent) }) diff --git a/lib/wasi/src/syscalls/wasix/sock_send_to.rs b/lib/wasi/src/syscalls/wasix/sock_send_to.rs index aad2b4a6662..004dd56d29e 100644 --- a/lib/wasi/src/syscalls/wasix/sock_send_to.rs +++ b/lib/wasi/src/syscalls/wasix/sock_send_to.rs @@ -54,7 +54,7 @@ pub fn sock_send_to( .map_err(mem_error_to_wasi)? .access() .map_err(mem_error_to_wasi)?; - sent += match socket + let local_sent = match socket .send_to::(env.tasks().deref(), buf.as_ref(), addr, fd.flags) .await { @@ -62,6 +62,10 @@ pub fn sock_send_to( Err(_) if sent > 0 => break, Err(err) => return Err(err), }; + sent += local_sent; + if local_sent != buf.len() { + break; + } } Ok(sent) },