about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTrevor Gross <t.gross35@gmail.com>2025-02-24 18:46:36 -0500
committerGitHub <noreply@github.com>2025-02-24 18:46:36 -0500
commit50940109ccdb6ce37079c6104e1cd2dd4b59d808 (patch)
treebaf1b3d355b4ed83e8b22f7eafa486e7161a99c9
parent57ce16ca275eb263c0cf1b934ab61666e6e17230 (diff)
parent98b0f050cf61f86cd39babe1fa4b33808fdc0770 (diff)
downloadrust-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.rs10
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 {