From 4fd5db293e4db8d5d3fe57f2bb893a148b38d0ec Mon Sep 17 00:00:00 2001 From: Jeffrey Dallatezza Date: Fri, 26 Jun 2026 10:38:19 -0700 Subject: [PATCH] Add entropy for macos --- crates/runtime/src/sim_std.rs | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/crates/runtime/src/sim_std.rs b/crates/runtime/src/sim_std.rs index 5305c6ea16..70ddc0042d 100644 --- a/crates/runtime/src/sim_std.rs +++ b/crates/runtime/src/sim_std.rs @@ -134,10 +134,11 @@ unsafe extern "C" fn pthread_attr_init(attr: *mut libc::pthread_attr_t) -> libc: // Randomness syscall hooks. -// Hook OS randomness by interposing `getrandom`. +// Hook OS randomness by interposing the platform randomness entry point. // // This crate no longer tries to make host randomness deterministic. Any such // request is surfaced with a warning and then delegated to the host OS. +#[cfg(target_os = "linux")] #[unsafe(no_mangle)] #[inline(never)] unsafe extern "C" fn getrandom(buf: *mut u8, buflen: usize, flags: u32) -> isize { @@ -159,16 +160,12 @@ fn real_getrandom() -> unsafe extern "C" fn(*mut u8, usize, u32) -> isize { }) } -#[cfg(not(target_os = "linux"))] -fn real_getrandom() -> unsafe extern "C" fn(*mut u8, usize, u32) -> isize { - compile_error!("unsupported OS for DST getrandom override"); -} - // Hook `getentropy` and route it through the same deterministic path as // `getrandom`. // // The 256-byte limit is part of the getentropy contract. Keeping this wrapper // small means all entropy decisions stay centralized in `getrandom`. +#[cfg(target_os = "linux")] #[unsafe(no_mangle)] #[inline(never)] unsafe extern "C" fn getentropy(buf: *mut u8, buflen: usize) -> i32 { @@ -181,6 +178,29 @@ unsafe extern "C" fn getentropy(buf: *mut u8, buflen: usize) -> i32 { } } +// macOS does not expose Linux's `getrandom`, so interpose `getentropy` directly. +#[cfg(target_os = "macos")] +#[unsafe(no_mangle)] +#[inline(never)] +unsafe extern "C" fn getentropy(buf: *mut u8, buflen: usize) -> i32 { + if in_simulation() { + eprintln!("warning: randomness requested; delegating to host OS"); + eprintln!("{}", std::backtrace::Backtrace::force_capture()); + } + unsafe { real_getentropy()(buf, buflen) } +} + +#[cfg(target_os = "macos")] +fn real_getentropy() -> unsafe extern "C" fn(*mut u8, usize) -> i32 { + type GetentropyFn = unsafe extern "C" fn(*mut u8, usize) -> i32; + static GETENTROPY: OnceLock = OnceLock::new(); + *GETENTROPY.get_or_init(|| unsafe { + let ptr = libc::dlsym(libc::RTLD_NEXT, c"getentropy".as_ptr().cast()); + assert!(!ptr.is_null(), "failed to resolve original getentropy"); + std::mem::transmute(ptr) + }) +} + #[cfg(test)] mod tests { use crate::sim;