* [`str` turning a shared reference into a mutable one](https://github.com/rust-lang/rust/pull/58200)
* [`rand` performing unaligned reads](https://github.com/rust-random/rand/issues/779)
* [The Unix allocator calling `posix_memalign` in an invalid way](https://github.com/rust-lang/rust/issues/62251)
+* [`getrandom` calling the `getrandom` syscall in an invalid way](https://github.com/rust-random/getrandom/pull/73)
Violations of Stacked Borrows found that are likely bugs (but Stacked Borrows is currently just an experiment):
ptr: Scalar<Tag>,
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];