summaryrefslogtreecommitdiffstats
path: root/third_party/rust/getrandom/src/linux_android_with_fallback.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-12 05:43:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-12 05:43:14 +0000
commit8dd16259287f58f9273002717ec4d27e97127719 (patch)
tree3863e62a53829a84037444beab3abd4ed9dfc7d0 /third_party/rust/getrandom/src/linux_android_with_fallback.rs
parentReleasing progress-linux version 126.0.1-1~progress7.99u1. (diff)
downloadfirefox-8dd16259287f58f9273002717ec4d27e97127719.tar.xz
firefox-8dd16259287f58f9273002717ec4d27e97127719.zip
Merging upstream version 127.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/getrandom/src/linux_android_with_fallback.rs')
-rw-r--r--third_party/rust/getrandom/src/linux_android_with_fallback.rs33
1 files changed, 33 insertions, 0 deletions
diff --git a/third_party/rust/getrandom/src/linux_android_with_fallback.rs b/third_party/rust/getrandom/src/linux_android_with_fallback.rs
new file mode 100644
index 0000000000..0f5ea8a992
--- /dev/null
+++ b/third_party/rust/getrandom/src/linux_android_with_fallback.rs
@@ -0,0 +1,33 @@
+//! 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 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)
+ } else {
+ use_file::getrandom_inner(dest)
+ }
+}
+
+fn is_getrandom_available() -> bool {
+ if 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
+ // seems to be needed only for specific Linux-based products that aren't based
+ // on Android. See https://github.com/rust-random/getrandom/issues/229.
+ #[cfg(target_os = "linux")]
+ Some(libc::EPERM) => false, // Blocked by seccomp
+ _ => true,
+ }
+ } else {
+ true
+ }
+}