|
10 | 10 | extern crate std; |
11 | 11 |
|
12 | 12 | use crate::util::LazyBool; |
| 13 | +use crate::util_libc::sys_fill_exact; |
13 | 14 | use crate::{use_file, Error}; |
14 | 15 | use core::num::NonZeroU32; |
15 | 16 | use std::io; |
16 | 17 |
|
17 | | -fn syscall_getrandom(dest: &mut [u8], block: bool) -> Result<usize, io::Error> { |
18 | | - let flags = if block { 0 } else { libc::GRND_NONBLOCK }; |
19 | | - let ret = unsafe { libc::syscall(libc::SYS_getrandom, dest.as_mut_ptr(), dest.len(), flags) }; |
20 | | - if ret < 0 { |
21 | | - let err = io::Error::last_os_error(); |
22 | | - if err.raw_os_error() == Some(libc::EINTR) { |
23 | | - return Ok(0); // Call was interrupted, try again |
24 | | - } |
25 | | - error!("Linux getrandom syscall failed with return value {}", ret); |
26 | | - return Err(err); |
27 | | - } |
28 | | - Ok(ret as usize) |
29 | | -} |
30 | | - |
31 | 18 | pub fn getrandom_inner(dest: &mut [u8]) -> Result<(), Error> { |
32 | 19 | static HAS_GETRANDOM: LazyBool = LazyBool::new(); |
33 | 20 | if HAS_GETRANDOM.unsync_init(is_getrandom_available) { |
34 | | - let mut start = 0; |
35 | | - while start < dest.len() { |
36 | | - start += syscall_getrandom(&mut dest[start..], true)?; |
37 | | - } |
38 | | - Ok(()) |
| 21 | + sys_fill_exact(dest, |buf| unsafe { |
| 22 | + libc::syscall(libc::SYS_getrandom, buf.as_mut_ptr(), buf.len(), 0) as libc::ssize_t |
| 23 | + }) |
39 | 24 | } else { |
40 | 25 | use_file::getrandom_inner(dest) |
41 | 26 | } |
42 | 27 | } |
43 | 28 |
|
44 | 29 | fn is_getrandom_available() -> bool { |
45 | | - match syscall_getrandom(&mut [], false) { |
46 | | - Err(err) => match err.raw_os_error() { |
| 30 | + let res = unsafe { libc::syscall(libc::SYS_getrandom, 0, 0, libc::GRND_NONBLOCK) }; |
| 31 | + if res < 0 { |
| 32 | + match io::Error::last_os_error().raw_os_error() { |
47 | 33 | Some(libc::ENOSYS) => false, // No kernel support |
48 | 34 | Some(libc::EPERM) => false, // Blocked by seccomp |
49 | 35 | _ => true, |
50 | | - }, |
51 | | - Ok(_) => true, |
| 36 | + } |
| 37 | + } else { |
| 38 | + true |
52 | 39 | } |
53 | 40 | } |
54 | 41 |
|
|
0 commit comments