|
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