diff --git a/src/shims/unix/macos/foreign_items.rs b/src/shims/unix/macos/foreign_items.rs index ecc07e28a2..ab7bc438a6 100644 --- a/src/shims/unix/macos/foreign_items.rs +++ b/src/shims/unix/macos/foreign_items.rs @@ -183,6 +183,16 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> { this.write_scalar(res, dest)?; } + "CCRandomGenerateBytes" => { + let [buf, bufsize] = + this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?; + let buf = this.read_pointer(buf)?; + let bufsize = this.read_target_usize(bufsize)?; + this.gen_random(buf, bufsize)?; + // returning 0 (kCCSuccess) + this.write_scalar(Scalar::from_i32(0), dest)?; + } + _ => return Ok(EmulateForeignItemResult::NotSupported), }; diff --git a/tests/pass-dep/shims/libc-ccrandomgeneratebytes.rs b/tests/pass-dep/shims/libc-ccrandomgeneratebytes.rs new file mode 100644 index 0000000000..7a5c85edd5 --- /dev/null +++ b/tests/pass-dep/shims/libc-ccrandomgeneratebytes.rs @@ -0,0 +1,14 @@ +//@ignore-target-windows: no libc +//@ignore-target-linux: macOs only +//@ignore-target-freebsd: macOs only + +fn main() { + let mut buf = [0u8; 1024]; + unsafe { + assert_eq!( + libc::CCRandomGenerateBytes(buf.as_mut_ptr() as *mut libc::c_void, buf.len()), + libc::kCCSuccess + ); + } +} +