@@ -31,6 +31,7 @@ pub trait FileDescription: std::fmt::Debug + Any {
3131 _self_ref : & FileDescriptionRef ,
3232 _communicate_allowed : bool ,
3333 _bytes : & mut [ u8 ] ,
34+ _len : usize ,
3435 _ptr : Pointer ,
3536 _dest : & MPlaceTy < ' tcx > ,
3637 _ecx : & mut MiriInterpCx < ' tcx > ,
@@ -132,6 +133,7 @@ impl FileDescription for io::Stdin {
132133 _self_ref : & FileDescriptionRef ,
133134 communicate_allowed : bool ,
134135 bytes : & mut [ u8 ] ,
136+ _len : usize ,
135137 ptr : Pointer ,
136138 dest : & MPlaceTy < ' tcx > ,
137139 ecx : & mut MiriInterpCx < ' tcx > ,
@@ -583,9 +585,10 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
583585 // because it was a target's `usize`. Also we are sure that its smaller than
584586 // `usize::MAX` because it is bounded by the host's `isize`.
585587
586- let mut bytes = vec ! [ 0 ; usize :: try_from( count) . unwrap( ) ] ;
588+ let len = usize:: try_from ( count) . unwrap ( ) ;
589+ let mut bytes = vec ! [ 0 ; len] ;
587590 match offset {
588- None => fd. read ( & fd, communicate, & mut bytes, buf, dest, this) ?,
591+ None => fd. read ( & fd, communicate, & mut bytes, len , buf, dest, this) ?,
589592 Some ( offset) => {
590593 let Ok ( offset) = u64:: try_from ( offset) else {
591594 let einval = this. eval_libc ( "EINVAL" ) ;
@@ -679,6 +682,39 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
679682 }
680683 }
681684
685+
686+ /// This function either writes to the user supplied buffer and to dest place, or return error.
687+ // TODO: this is only used for eventfd
688+ fn read_byte_helper_ev (
689+ & mut self ,
690+ buf_place : & MPlaceTy < ' tcx > ,
691+ read_val : Option < u64 > ,
692+ result : io:: Result < usize > ,
693+ dest : & MPlaceTy < ' tcx > ,
694+ ) -> InterpResult < ' tcx > {
695+ let this = self . eval_context_mut ( ) ;
696+ // `File::read` never returns a value larger than `count`, so this cannot fail.
697+ match result. map ( |c| i64:: try_from ( c) . unwrap ( ) ) {
698+ // try to pass this the write_ptr inside write
699+ // Pass the pointer inside the write function.
700+ Ok ( read_bytes) => {
701+ // If reading to `bytes` did not fail, we write those bytes to the buffer.
702+ // Crucially, if fewer than `bytes.len()` bytes were read, only write
703+ // that much into the output buffer!
704+ // Write to the user supplied buffer.
705+ this. write_int ( read_val. unwrap ( ) , buf_place) ?;
706+ // Write to the function return value place.
707+ this. write_int ( read_bytes, dest) ?;
708+ return Ok ( ( ) ) ;
709+ }
710+ Err ( e) => {
711+ this. set_last_error_from_io_error ( e) ?;
712+ this. write_int ( -1 , dest) ?;
713+ return Ok ( ( ) ) ;
714+ }
715+ }
716+ }
717+
682718 /// This function either writes the number of written bytes to dest place or return error.
683719 fn write_byte_helper (
684720 & mut self ,
0 commit comments