From f28cb80507f4f63a23684271ee1bae03562ca2da Mon Sep 17 00:00:00 2001 From: Peter Limkilde Svendsen Date: Sat, 11 Apr 2026 16:07:48 +0200 Subject: [PATCH] Replace static mut in seed48() --- src/header/stdlib/mod.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/header/stdlib/mod.rs b/src/header/stdlib/mod.rs index 6e06356b92..2afc7f627c 100644 --- a/src/header/stdlib/mod.rs +++ b/src/header/stdlib/mod.rs @@ -1248,19 +1248,24 @@ pub unsafe extern "C" fn secure_getenv(name: *const c_char) -> *mut c_char { /// state. #[unsafe(no_mangle)] pub unsafe extern "C" fn seed48(seed16v: *mut c_ushort) -> *mut c_ushort { - static mut BUFFER: [c_ushort; 3] = [0; 3]; + static RETURN_BUFFER: RawCell<[c_ushort; 3]> = RawCell::new([0; 3]); let mut params = rand48::params_mut(); let mut xsubi = rand48::xsubi_lock(); + // SAFETY: the caller is required to ensure seed16v is convertible to + // &[c_ushort; 3]. let seed16v_ref: &[c_ushort; 3] = unsafe { slice::from_raw_parts(seed16v, 3) } .try_into() .unwrap(); - unsafe { BUFFER = (*xsubi).into() }; + // SAFETY: the caller is required to ensure exclusive access to + // RETURN_BUFFER. + let return_buffer_mut = unsafe { RETURN_BUFFER.unsafe_mut() }; + *return_buffer_mut = (*xsubi).into(); *xsubi = seed16v_ref.into(); params.reset(); - (&raw mut BUFFER).cast() + RETURN_BUFFER.as_mut_ptr().cast() } unsafe fn copy_kv(