From 5bc95a6fa2af86689c37a87a5899e7e34d6084ee Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 9 Jul 2025 10:47:36 -0700 Subject: [PATCH] wasi.c: fix pread/pwrite When stream is NULL it means reads should read 0 bytes and writes should fake success with no side effects. --- stage1/wasi.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/stage1/wasi.c b/stage1/wasi.c index ef2183dae8..83240d39b4 100644 --- a/stage1/wasi.c +++ b/stage1/wasi.c @@ -520,12 +520,15 @@ uint32_t wasi_snapshot_preview1_fd_read(uint32_t fd, uint32_t iovs, uint32_t iov default: panic("unimplemented: fd_read special file"); } + if (fds[fd].stream == NULL) { + store32_align2(res_size_ptr, 0); + return wasi_errno_success; + } + size_t size = 0; for (uint32_t i = 0; i < iovs_len; i += 1) { uint32_t len = load32_align2(&iovs_ptr[i].len); - size_t read_size = 0; - if (fds[fd].stream != NULL) - read_size = fread(&m[load32_align2(&iovs_ptr[i].ptr)], 1, len, fds[fd].stream); + size_t read_size = fread(&m[load32_align2(&iovs_ptr[i].ptr)], 1, len, fds[fd].stream); size += read_size; if (read_size < len) break; } @@ -633,8 +636,10 @@ uint32_t wasi_snapshot_preview1_fd_pwrite(uint32_t fd, uint32_t iovs, uint32_t i } fpos_t pos; - if (fgetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io; - if (fseek(fds[fd].stream, offset, SEEK_SET) < 0) return wasi_errno_io; + if (fds[fd].stream != NULL) { + if (fgetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io; + if (fseek(fds[fd].stream, offset, SEEK_SET) < 0) return wasi_errno_io; + } size_t size = 0; for (uint32_t i = 0; i < iovs_len; i += 1) { @@ -648,7 +653,9 @@ uint32_t wasi_snapshot_preview1_fd_pwrite(uint32_t fd, uint32_t iovs, uint32_t i if (written_size < len) break; } - if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io; + if (fds[fd].stream != NULL) { + if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io; + } if (size > 0) { time_t now = time(NULL); @@ -964,6 +971,11 @@ uint32_t wasi_snapshot_preview1_fd_pread(uint32_t fd, uint32_t iovs, uint32_t io default: panic("unimplemented: fd_pread special file"); } + if (fds[fd].stream == NULL) { + store32_align2(res_size_ptr, 0); + return wasi_errno_success; + } + fpos_t pos; if (fgetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io; if (fseek(fds[fd].stream, offset, SEEK_SET) < 0) return wasi_errno_io;