authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-09 10:47:36-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-09 10:47:36-07:00
log5bc95a6fa2af86689c37a87a5899e7e34d6084ee
tree69a32d806f4a84a3891d4daa0f7b5f370b677440
parent5c6679922d69285ebf807b268d8ca10cf1dbe4c0

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.

1 files changed, 18 insertions(+), 6 deletions(-)

stage1/wasi.c+18-6
...@@ -520,12 +520,15 @@ uint32_t wasi_snapshot_preview1_fd_read(uint32_t fd, uint32_t iovs, uint32_t iov...@@ -520,12 +520,15 @@ uint32_t wasi_snapshot_preview1_fd_read(uint32_t fd, uint32_t iovs, uint32_t iov
520 default: panic("unimplemented: fd_read special file");520 default: panic("unimplemented: fd_read special file");
521 }521 }
522522
523 if (fds[fd].stream == NULL) {
524 store32_align2(res_size_ptr, 0);
525 return wasi_errno_success;
526 }
527
523 size_t size = 0;528 size_t size = 0;
524 for (uint32_t i = 0; i < iovs_len; i += 1) {529 for (uint32_t i = 0; i < iovs_len; i += 1) {
525 uint32_t len = load32_align2(&iovs_ptr[i].len);530 uint32_t len = load32_align2(&iovs_ptr[i].len);
526 size_t read_size = 0;531 size_t read_size = fread(&m[load32_align2(&iovs_ptr[i].ptr)], 1, len, fds[fd].stream);
527 if (fds[fd].stream != NULL)
528 read_size = fread(&m[load32_align2(&iovs_ptr[i].ptr)], 1, len, fds[fd].stream);
529 size += read_size;532 size += read_size;
530 if (read_size < len) break;533 if (read_size < len) break;
531 }534 }
...@@ -633,8 +636,10 @@ uint32_t wasi_snapshot_preview1_fd_pwrite(uint32_t fd, uint32_t iovs, uint32_t i...@@ -633,8 +636,10 @@ uint32_t wasi_snapshot_preview1_fd_pwrite(uint32_t fd, uint32_t iovs, uint32_t i
633 }636 }
634637
635 fpos_t pos;638 fpos_t pos;
636 if (fgetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io;639 if (fds[fd].stream != NULL) {
637 if (fseek(fds[fd].stream, offset, SEEK_SET) < 0) return wasi_errno_io;640 if (fgetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io;
641 if (fseek(fds[fd].stream, offset, SEEK_SET) < 0) return wasi_errno_io;
642 }
638643
639 size_t size = 0;644 size_t size = 0;
640 for (uint32_t i = 0; i < iovs_len; i += 1) {645 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...@@ -648,7 +653,9 @@ uint32_t wasi_snapshot_preview1_fd_pwrite(uint32_t fd, uint32_t iovs, uint32_t i
648 if (written_size < len) break;653 if (written_size < len) break;
649 }654 }
650655
651 if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io;656 if (fds[fd].stream != NULL) {
657 if (fsetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io;
658 }
652659
653 if (size > 0) {660 if (size > 0) {
654 time_t now = time(NULL);661 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...@@ -964,6 +971,11 @@ uint32_t wasi_snapshot_preview1_fd_pread(uint32_t fd, uint32_t iovs, uint32_t io
964 default: panic("unimplemented: fd_pread special file");971 default: panic("unimplemented: fd_pread special file");
965 }972 }
966973
974 if (fds[fd].stream == NULL) {
975 store32_align2(res_size_ptr, 0);
976 return wasi_errno_success;
977 }
978
967 fpos_t pos;979 fpos_t pos;
968 if (fgetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io;980 if (fgetpos(fds[fd].stream, &pos) < 0) return wasi_errno_io;
969 if (fseek(fds[fd].stream, offset, SEEK_SET) < 0) return wasi_errno_io;981 if (fseek(fds[fd].stream, offset, SEEK_SET) < 0) return wasi_errno_io;