diff --git a/src/helpers.rs b/src/helpers.rs index e9b09d816056..c0e1ec2cd75b 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -81,12 +81,21 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx ptr: Scalar, len: usize, ) -> InterpResult<'tcx> { + // Some programs pass in a null pointer and a length of 0 + // to their platform's random-generation function (e.g. getrandom()) + // on Linux. For compatibility with these programs, we don't perform + // any additional checks - it's okay if the pointer is invalid, + // since we wouldn't actually be writing to it. + if len == 0 { + return Ok(()); + } let this = self.eval_context_mut(); - let ptr = match this.memory().check_ptr_access(ptr, Size::from_bytes(len as u64), Align::from_bytes(1).unwrap())? { - Some(ptr) => ptr, - None => return Ok(()), // zero-sized access - }; + let ptr = this.memory().check_ptr_access( + ptr, + Size::from_bytes(len as u64), + Align::from_bytes(1).unwrap() + )?.expect("we already checked for size 0"); let rng = this.memory_mut().extra.rng.get_mut(); let mut data = vec![0; len];