commit 5bc95a6fa2af86689c37a87a5899e7e34d6084ee (tree)
parent 5c6679922d69285ebf807b268d8ca10cf1dbe4c0
Author: Andrew Kelley <andrew@ziglang.org>
Date: Wed, 9 Jul 2025 10:47:36 -0700
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.
Diffstat:
1 file changed, 18 insertions(+), 6 deletions(-)
diff --git 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;