Skip to content

Commit

Permalink
Delegate to linux_android from linux_android_with_fallback (#459)
Browse files Browse the repository at this point in the history
Instead of duplicating the implementation of
`linux_android::getrandom_inner` inline, call
`linux_android::getrandom_inner`, like we do for
`use_file::getrandom_inner`. This way, there is no doubt that they do
exactly the same thing. This then allows us to move `getrandom_syscall`
to linux_android, which is where it belongs, since it is
Linux/Android-specific.
  • Loading branch information
briansmith authored Jun 6, 2024
1 parent 05cdf6f commit 10a0ae0
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 21 deletions.
1 change: 1 addition & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,7 @@ cfg_if! {
mod util_libc;
mod use_file;
mod lazy;
mod linux_android;
#[path = "linux_android_with_fallback.rs"] mod imp;
} else if #[cfg(any(target_os = "android", target_os = "linux"))] {
mod util_libc;
Expand Down
14 changes: 13 additions & 1 deletion src/linux_android.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,17 @@ use crate::{util_libc, Error};
use core::mem::MaybeUninit;

pub fn getrandom_inner(dest: &mut [MaybeUninit<u8>]) -> Result<(), Error> {
util_libc::sys_fill_exact(dest, util_libc::getrandom_syscall)
util_libc::sys_fill_exact(dest, getrandom_syscall)
}

// Also used by linux_android_with_fallback to check if the syscall is available.
pub fn getrandom_syscall(buf: &mut [MaybeUninit<u8>]) -> libc::ssize_t {
unsafe {
libc::syscall(
libc::SYS_getrandom,
buf.as_mut_ptr().cast::<core::ffi::c_void>(),
buf.len(),
0,
) as libc::ssize_t
}
}
10 changes: 3 additions & 7 deletions src/linux_android_with_fallback.rs
Original file line number Diff line number Diff line change
@@ -1,23 +1,19 @@
//! Implementation for Linux / Android with `/dev/urandom` fallback
use crate::{
lazy::LazyBool,
util_libc::{getrandom_syscall, last_os_error, sys_fill_exact},
{use_file, Error},
};
use crate::{lazy::LazyBool, linux_android, use_file, util_libc::last_os_error, Error};
use core::mem::MaybeUninit;

pub fn getrandom_inner(dest: &mut [MaybeUninit<u8>]) -> Result<(), Error> {
// getrandom(2) was introduced in Linux 3.17
static HAS_GETRANDOM: LazyBool = LazyBool::new();
if HAS_GETRANDOM.unsync_init(is_getrandom_available) {
sys_fill_exact(dest, getrandom_syscall)
linux_android::getrandom_inner(dest)
} else {
use_file::getrandom_inner(dest)
}
}

fn is_getrandom_available() -> bool {
if getrandom_syscall(&mut []) < 0 {
if linux_android::getrandom_syscall(&mut []) < 0 {
match last_os_error().raw_os_error() {
Some(libc::ENOSYS) => false, // No kernel support
// The fallback on EPERM is intentionally not done on Android since this workaround
Expand Down
13 changes: 0 additions & 13 deletions src/util_libc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,16 +99,3 @@ pub fn open_readonly(path: &[u8]) -> Result<libc::c_int, Error> {
}
}
}

/// Thin wrapper around the `getrandom()` Linux system call
#[cfg(any(target_os = "android", target_os = "linux"))]
pub fn getrandom_syscall(buf: &mut [MaybeUninit<u8>]) -> libc::ssize_t {
unsafe {
libc::syscall(
libc::SYS_getrandom,
buf.as_mut_ptr().cast::<core::ffi::c_void>(),
buf.len(),
0,
) as libc::ssize_t
}
}

0 comments on commit 10a0ae0

Please sign in to comment.