@@ -149,25 +149,23 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
149149
150150 let tcx = & { this. tcx . tcx } ;
151151
152+ let count = this. read_scalar ( count_op) ?. to_usize ( & * this. tcx ) ?;
153+ // Reading zero bytes should not change `buf`
154+ if count == 0 {
155+ return Ok ( 0 ) ;
156+ }
152157 let fd = this. read_scalar ( fd_op) ?. to_i32 ( ) ?;
153158 let buf_scalar = this. read_scalar ( buf_op) ?. not_undef ( ) ?;
154- let count = this. read_scalar ( count_op) ?. to_usize ( & * this. tcx ) ?;
155159
156160 // Remove the file handle to avoid borrowing issues
157161 this. remove_handle_and ( fd, |mut handle, this| {
158162 // Don't use `?` to avoid returning before reinserting the handle
159- let bytes =
160- if count == 0 {
161- Ok ( handle. file . read ( & mut [ ] ) )
162- } else {
163- this. force_ptr ( buf_scalar) . and_then ( |buf| this
164- . memory_mut ( )
165- . get_mut ( buf. alloc_id ) . and_then ( |alloc|
166- alloc. get_bytes_mut ( tcx, buf, Size :: from_bytes ( count) )
167- . map ( |buffer| handle. file . read ( buffer) )
168- ) )
169-
170- } ;
163+ let bytes = this. force_ptr ( buf_scalar) . and_then ( |buf| {
164+ this. memory_mut ( )
165+ . get_mut ( buf. alloc_id ) ?
166+ . get_bytes_mut ( tcx, buf, Size :: from_bytes ( count) )
167+ . map ( |buffer| handle. file . read ( buffer) )
168+ } ) ;
171169 // Reinsert the file handle
172170 this. machine . file_handler . handles . insert ( fd, handle) ;
173171 this. consume_result ( bytes?. map ( |bytes| bytes as i64 ) )
@@ -188,9 +186,13 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
188186
189187 let tcx = & { this. tcx . tcx } ;
190188
189+ let count = this. read_scalar ( count_op) ?. to_usize ( & * this. tcx ) ?;
190+ // Reading zero bytes should not change `buf`
191+ if count == 0 {
192+ return Ok ( 0 ) ;
193+ }
191194 let fd = this. read_scalar ( fd_op) ?. to_i32 ( ) ?;
192195 let buf = this. force_ptr ( this. read_scalar ( buf_op) ?. not_undef ( ) ?) ?;
193- let count = this. read_scalar ( count_op) ?. to_usize ( & * this. tcx ) ?;
194196
195197 this. remove_handle_and ( fd, |mut handle, this| {
196198 let bytes = this. memory ( ) . get ( buf. alloc_id ) . and_then ( |alloc| {
0 commit comments