diff options
| author | Trevor Gross <t.gross35@gmail.com> | 2025-02-24 18:46:36 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-02-24 18:46:36 -0500 |
| commit | 50940109ccdb6ce37079c6104e1cd2dd4b59d808 (patch) | |
| tree | baf1b3d355b4ed83e8b22f7eafa486e7161a99c9 | |
| parent | 57ce16ca275eb263c0cf1b934ab61666e6e17230 (diff) | |
| parent | 98b0f050cf61f86cd39babe1fa4b33808fdc0770 (diff) | |
| download | rust-50940109ccdb6ce37079c6104e1cd2dd4b59d808.tar.gz rust-50940109ccdb6ce37079c6104e1cd2dd4b59d808.zip | |
Rollup merge of #137349 - thaliaarchi:io-optional-methods/zkvm, r=Noratrieb
Implement `read_buf` for zkVM stdin For the zkVM, even when a guest buffer is uninitialized, from the host's perspective it is just a normal piece of memory which was initialized before letting the guest write into it. This makes `sys_read` safe to use with an uninitialized buffer. See https://github.com/risc0/risc0/issues/2853. cc `@bobbobbio,` `@flaub` r? `@Noratrieb` Tracked in https://github.com/rust-lang/rust/issues/136756
| -rw-r--r-- | library/std/src/sys/pal/zkvm/stdio.rs | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/library/std/src/sys/pal/zkvm/stdio.rs b/library/std/src/sys/pal/zkvm/stdio.rs index 5f1d06dd1d7..0bcb54744b0 100644 --- a/library/std/src/sys/pal/zkvm/stdio.rs +++ b/library/std/src/sys/pal/zkvm/stdio.rs @@ -1,6 +1,6 @@ use super::abi; use super::abi::fileno; -use crate::io; +use crate::io::{self, BorrowedCursor}; pub struct Stdin; pub struct Stdout; @@ -16,6 +16,14 @@ impl io::Read for Stdin { fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { Ok(unsafe { abi::sys_read(fileno::STDIN, buf.as_mut_ptr(), buf.len()) }) } + + fn read_buf(&mut self, mut buf: BorrowedCursor<'_>) -> io::Result<()> { + unsafe { + let n = abi::sys_read(fileno::STDIN, buf.as_mut().as_mut_ptr().cast(), buf.capacity()); + buf.advance_unchecked(n); + } + Ok(()) + } } impl Stdout { |
