diff --git a/src/vxworks.rs b/src/vxworks.rs index 5c75847b..8362ef2d 100644 --- a/src/vxworks.rs +++ b/src/vxworks.rs @@ -1,6 +1,7 @@ //! Implementation for VxWorks use crate::{util_libc::last_os_error, Error}; use core::{ + cmp::Ordering::{Equal, Greater, Less}, mem::MaybeUninit, sync::atomic::{AtomicBool, Ordering::Relaxed}, }; @@ -9,17 +10,19 @@ pub fn getrandom_inner(dest: &mut [MaybeUninit]) -> Result<(), Error> { static RNG_INIT: AtomicBool = AtomicBool::new(false); while !RNG_INIT.load(Relaxed) { let ret = unsafe { libc::randSecure() }; - if ret < 0 { - return Err(Error::VXWORKS_RAND_SECURE); - } else if ret > 0 { - RNG_INIT.store(true, Relaxed); - break; + match ret.cmp(&0) { + Greater => { + RNG_INIT.store(true, Relaxed); + break; + } + Equal => unsafe { libc::usleep(10); }, + Less => return Err(Error::VXWORKS_RAND_SECURE), } - unsafe { libc::usleep(10) }; } // Prevent overflow of i32 - for chunk in dest.chunks_mut(i32::max_value() as usize) { + let chunk_size = usize::try_from(i32::MAX).expect("VxWorks does not support 16-bit targets"); + for chunk in dest.chunks_mut(chunk_size) { let ret = unsafe { libc::randABytes(chunk.as_mut_ptr().cast::(), chunk.len() as i32) }; if ret != 0 { return Err(last_os_error());