@@ -215,36 +215,22 @@ pub trait EvalContextExt<'a, 'mir, 'tcx: 'a + 'mir>: crate::MiriEvalContextExt<'
215
215
// figure out some way to actually process some of them.
216
216
//
217
217
// `libc::syscall(NR_GETRANDOM, buf.as_mut_ptr(), buf.len(), GRND_NONBLOCK)`
218
- // is called if a `HashMap` is created the regular way.
218
+ // is called if a `HashMap` is created the regular way (e.g. HashMap<K, V>) .
219
219
match this. read_scalar ( args[ 0 ] ) ?. to_usize ( this) ? as i64 {
220
220
// SYS_getrandom on x86_64 and x86 respectively
221
221
318 | 355 => {
222
- match this. machine . rng . as_ref ( ) {
223
- Some ( rng) => {
224
- let ptr = this. read_scalar ( args[ 1 ] ) ?. to_ptr ( ) ?;
225
- let len = this. read_scalar ( args[ 2 ] ) ?. to_usize ( this) ?;
222
+ let ptr = this. read_scalar ( args[ 1 ] ) ?. to_ptr ( ) ?;
223
+ let len = this. read_scalar ( args[ 2 ] ) ?. to_usize ( this) ?;
226
224
227
- // The only supported flags are GRND_RANDOM and GRND_NONBLOCK,
228
- // neither of which have any effect on our current PRNG
229
- let _flags = this. read_scalar ( args[ 3 ] ) ?. to_i32 ( ) ?;
225
+ // The only supported flags are GRND_RANDOM and GRND_NONBLOCK,
226
+ // neither of which have any effect on our current PRNG
227
+ let _flags = this. read_scalar ( args[ 3 ] ) ?. to_i32 ( ) ?;
230
228
231
- let mut data = vec ! [ 0 ; len as usize ] ;
232
- rng. borrow_mut ( ) . fill_bytes ( & mut data) ;
233
-
234
- this. memory_mut ( ) . get_mut ( ptr. alloc_id ) ?
229
+ let data = gen_random ( this, len as usize ) ?;
230
+ this. memory_mut ( ) . get_mut ( ptr. alloc_id ) ?
235
231
. write_bytes ( tcx, ptr, & data) ?;
236
232
237
- this. write_scalar ( Scalar :: from_uint ( len, dest. layout . size ) , dest) ?;
238
-
239
- } ,
240
- None => {
241
- return err ! ( Unimplemented (
242
- "miri does not support random number generators in deterministic mode!
243
- Use '-Zmiri-seed=<seed>' to enable random number generation" . to_owned( ) ,
244
- ) )
245
- }
246
- }
247
-
233
+ this. write_scalar ( Scalar :: from_uint ( len, dest. layout . size ) , dest) ?;
248
234
}
249
235
id => {
250
236
return err ! ( Unimplemented (
@@ -768,6 +754,17 @@ pub trait EvalContextExt<'a, 'mir, 'tcx: 'a + 'mir>: crate::MiriEvalContextExt<'
768
754
"GetCommandLineW" => {
769
755
this. write_scalar ( Scalar :: Ptr ( this. machine . cmd_line . unwrap ( ) ) , dest) ?;
770
756
}
757
+ // The actual name of 'RtlGenRandom'
758
+ "SystemFunction036" => {
759
+ let ptr = this. read_scalar ( args[ 1 ] ) ?. to_ptr ( ) ?;
760
+ let len = this. read_scalar ( args[ 2 ] ) ?. to_usize ( this) ?;
761
+
762
+ let data = gen_random ( this, len as usize ) ?;
763
+ this. memory_mut ( ) . get_mut ( ptr. alloc_id ) ?
764
+ . write_bytes ( tcx, ptr, & data) ?;
765
+
766
+ this. write_scalar ( Scalar :: from_bool ( true ) , dest) ?;
767
+ }
771
768
772
769
// We can't execute anything else.
773
770
_ => {
@@ -786,3 +783,21 @@ pub trait EvalContextExt<'a, 'mir, 'tcx: 'a + 'mir>: crate::MiriEvalContextExt<'
786
783
self . eval_context_mut ( ) . write_scalar ( Scalar :: from_int ( 0 , dest. layout . size ) , dest)
787
784
}
788
785
}
786
+
787
+ fn gen_random < ' a , ' mir , ' tcx > ( this : & mut MiriEvalContext < ' a , ' mir , ' tcx > ,
788
+ len : usize ) -> Result < Vec < u8 > , EvalError < ' tcx > > {
789
+
790
+ match this. machine . rng . as_ref ( ) {
791
+ Some ( rng) => {
792
+ let mut data = vec ! [ 0 ; len] ;
793
+ rng. borrow_mut ( ) . fill_bytes ( & mut data) ;
794
+ Ok ( data)
795
+ }
796
+ None => {
797
+ err ! ( Unimplemented (
798
+ "miri does not support random number generators in deterministic mode!
799
+ Use '-Zmiri-seed=<seed>' to enable random number generation" . to_owned( ) ,
800
+ ) )
801
+ }
802
+ }
803
+ }
0 commit comments