From 02dad900382f6bc9e254f0098b1a9969d41e9b2a Mon Sep 17 00:00:00 2001 From: nia <nia@NetBSD.org> Date: Sun, 20 Oct 2019 13:53:19 +0100 Subject: [PATCH 1/6] Switch to using the arandom sysctl on NetBSD (same as FreeBSD). Rename it from freebsd.rs to sysctl_arandom.rs. NetBSD has been patching rustc for some time to use the FreeBSD implementation because every single invocation of the compiler may drain from the entropy pool and cause the next to block. This can massively inflate build times for rust software, or cause it to fail entirely, especially in VMs (for example, our Xen package building cluster). --- src/lib.rs | 4 ++-- src/{freebsd.rs => sysctl_arandom.rs} | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename src/{freebsd.rs => sysctl_arandom.rs} (92%) diff --git a/src/lib.rs b/src/lib.rs index 6cb589da..21f6dd8d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -198,7 +198,7 @@ cfg_if! { } else if #[cfg(target_os = "emscripten")] { #[path = "use_file.rs"] mod imp; } else if #[cfg(target_os = "freebsd")] { - #[path = "freebsd.rs"] mod imp; + #[path = "sysctl_arandom.rs"] mod imp; } else if #[cfg(target_os = "fuchsia")] { #[path = "fuchsia.rs"] mod imp; } else if #[cfg(target_os = "haiku")] { @@ -212,7 +212,7 @@ cfg_if! { } else if #[cfg(target_os = "macos")] { #[path = "macos.rs"] mod imp; } else if #[cfg(target_os = "netbsd")] { - #[path = "use_file.rs"] mod imp; + #[path = "sysctl_arandom.rs"] mod imp; } else if #[cfg(target_os = "openbsd")] { #[path = "openbsd.rs"] mod imp; } else if #[cfg(target_os = "redox")] { diff --git a/src/freebsd.rs b/src/sysctl_arandom.rs similarity index 92% rename from src/freebsd.rs rename to src/sysctl_arandom.rs index 61feaf73..24d64a16 100644 --- a/src/freebsd.rs +++ b/src/sysctl_arandom.rs @@ -6,7 +6,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -//! Implementation for FreeBSD +//! Implementation for FreeBSD and NetBSD use crate::util_libc::{sys_fill_exact, Weak}; use crate::Error; use core::{mem, ptr}; @@ -27,7 +27,7 @@ fn kern_arnd(buf: &mut [u8]) -> libc::ssize_t { ) }; if ret == -1 { - error!("freebsd: kern.arandom syscall failed"); + error!("sysctl_arandom: kern.arandom syscall failed"); -1 } else { len as libc::ssize_t From 46f8ac86c206f0e849859cdb3fbf0decfb85ca81 Mon Sep 17 00:00:00 2001 From: nia <nia@NetBSD.org> Date: Sun, 20 Oct 2019 14:46:34 +0100 Subject: [PATCH 2/6] Disable use_file on NetBSD. --- src/use_file.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/use_file.rs b/src/use_file.rs index 21e35343..d3adaf2a 100644 --- a/src/use_file.rs +++ b/src/use_file.rs @@ -39,7 +39,7 @@ pub fn getrandom_inner(dest: &mut [u8]) -> Result<(), Error> { } cfg_if! { - if #[cfg(any(target_os = "android", target_os = "linux", target_os = "netbsd"))] { + if #[cfg(any(target_os = "android", target_os = "linux"))] { fn init_file() -> Option<libc::c_int> { // Poll /dev/random to make sure it is ok to read from /dev/urandom. let mut pfd = libc::pollfd { From 52c6ca2c930bf53c0dbf650fbe4a46a42334420c Mon Sep 17 00:00:00 2001 From: nia <nia@NetBSD.org> Date: Sun, 20 Oct 2019 14:47:12 +0100 Subject: [PATCH 3/6] Document change to NetBSD --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 21f6dd8d..e1586e1b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,7 +18,7 @@ //! | iOS | [`SecRandomCopyBytes`][4] //! | FreeBSD | [`getrandom()`][21] if available, otherwise [`kern.arandom`][5] //! | OpenBSD | [`getentropy`][6] -//! | NetBSD | [`/dev/urandom`][7] after successfully polling `/dev/random` +//! | NetBSD | [`kern.arandom`][5] //! | Dragonfly BSD | [`/dev/random`][8] //! | Solaris, illumos | [`getrandom`][9] system call if available, otherwise [`/dev/random`][10] //! | Fuchsia OS | [`cprng_draw`][11] From b0c085e9248534b4432d977a4e5f0339a10e4ee2 Mon Sep 17 00:00:00 2001 From: nia <nia@NetBSD.org> Date: Tue, 22 Oct 2019 12:16:08 +0100 Subject: [PATCH 4/6] Rename sysctl_arandom.rs to bsd_arandom.rs --- src/{sysctl_arandom.rs => bsd_arandom.rs} | 2 +- src/lib.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/{sysctl_arandom.rs => bsd_arandom.rs} (95%) diff --git a/src/sysctl_arandom.rs b/src/bsd_arandom.rs similarity index 95% rename from src/sysctl_arandom.rs rename to src/bsd_arandom.rs index 24d64a16..dced18bf 100644 --- a/src/sysctl_arandom.rs +++ b/src/bsd_arandom.rs @@ -27,7 +27,7 @@ fn kern_arnd(buf: &mut [u8]) -> libc::ssize_t { ) }; if ret == -1 { - error!("sysctl_arandom: kern.arandom syscall failed"); + error!("sysctl kern.arandom: syscall failed"); -1 } else { len as libc::ssize_t diff --git a/src/lib.rs b/src/lib.rs index e1586e1b..73ab0813 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -198,7 +198,7 @@ cfg_if! { } else if #[cfg(target_os = "emscripten")] { #[path = "use_file.rs"] mod imp; } else if #[cfg(target_os = "freebsd")] { - #[path = "sysctl_arandom.rs"] mod imp; + #[path = "bsd_arandom.rs"] mod imp; } else if #[cfg(target_os = "fuchsia")] { #[path = "fuchsia.rs"] mod imp; } else if #[cfg(target_os = "haiku")] { @@ -212,7 +212,7 @@ cfg_if! { } else if #[cfg(target_os = "macos")] { #[path = "macos.rs"] mod imp; } else if #[cfg(target_os = "netbsd")] { - #[path = "sysctl_arandom.rs"] mod imp; + #[path = "bsd_arandom.rs"] mod imp; } else if #[cfg(target_os = "openbsd")] { #[path = "openbsd.rs"] mod imp; } else if #[cfg(target_os = "redox")] { From 93b0760637aba7ea0ba98e592d197a85e44d702f Mon Sep 17 00:00:00 2001 From: Joe Richey <joerichey@google.com> Date: Tue, 22 Oct 2019 05:06:43 -0700 Subject: [PATCH 5/6] Fixed Documentation Link --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 73ab0813..9d1274ec 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,7 +18,7 @@ //! | iOS | [`SecRandomCopyBytes`][4] //! | FreeBSD | [`getrandom()`][21] if available, otherwise [`kern.arandom`][5] //! | OpenBSD | [`getentropy`][6] -//! | NetBSD | [`kern.arandom`][5] +//! | NetBSD | [`kern.arandom`][7] //! | Dragonfly BSD | [`/dev/random`][8] //! | Solaris, illumos | [`getrandom`][9] system call if available, otherwise [`/dev/random`][10] //! | Fuchsia OS | [`cprng_draw`][11] @@ -104,7 +104,7 @@ //! [4]: https://developer.apple.com/documentation/security/1399291-secrandomcopybytes?language=objc //! [5]: https://www.freebsd.org/cgi/man.cgi?query=random&sektion=4 //! [6]: https://man.openbsd.org/getentropy.2 -//! [7]: http://netbsd.gw.com/cgi-bin/man-cgi?random+4+NetBSD-current +//! [7]: https://netbsd.gw.com/cgi-bin/man-cgi?sysctl+7+NetBSD-8.0 //! [8]: https://leaf.dragonflybsd.org/cgi/web-man?command=random§ion=4 //! [9]: https://docs.oracle.com/cd/E88353_01/html/E37841/getrandom-2.html //! [10]: https://docs.oracle.com/cd/E86824_01/html/E54777/random-7d.html From a10380d4c29d19b381ece0348ffecd674363b9dd Mon Sep 17 00:00:00 2001 From: Joe Richey <joerichey@google.com> Date: Wed, 23 Oct 2019 00:06:33 -0700 Subject: [PATCH 6/6] Don't attempt getrandom(2) lookup on NetBSD --- src/bsd_arandom.rs | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/bsd_arandom.rs b/src/bsd_arandom.rs index dced18bf..eb564fff 100644 --- a/src/bsd_arandom.rs +++ b/src/bsd_arandom.rs @@ -7,11 +7,9 @@ // except according to those terms. //! Implementation for FreeBSD and NetBSD -use crate::util_libc::{sys_fill_exact, Weak}; +use crate::util_libc::sys_fill_exact; use crate::Error; -use core::{mem, ptr}; - -type GetRandomFn = unsafe extern "C" fn(*mut u8, libc::size_t, libc::c_uint) -> libc::ssize_t; +use core::ptr; fn kern_arnd(buf: &mut [u8]) -> libc::ssize_t { static MIB: [libc::c_int; 2] = [libc::CTL_KERN, libc::KERN_ARND]; @@ -35,11 +33,17 @@ fn kern_arnd(buf: &mut [u8]) -> libc::ssize_t { } pub fn getrandom_inner(dest: &mut [u8]) -> Result<(), Error> { - static GETRANDOM: Weak = unsafe { Weak::new("getrandom\0") }; - if let Some(fptr) = GETRANDOM.ptr() { - let func: GetRandomFn = unsafe { mem::transmute(fptr) }; - sys_fill_exact(dest, |buf| unsafe { func(buf.as_mut_ptr(), buf.len(), 0) }) - } else { - sys_fill_exact(dest, kern_arnd) + #[cfg(target_os = "freebsd")] + { + use crate::util_libc::Weak; + static GETRANDOM: Weak = unsafe { Weak::new("getrandom\0") }; + type GetRandomFn = + unsafe extern "C" fn(*mut u8, libc::size_t, libc::c_uint) -> libc::ssize_t; + + if let Some(fptr) = GETRANDOM.ptr() { + let func: GetRandomFn = unsafe { core::mem::transmute(fptr) }; + return sys_fill_exact(dest, |buf| unsafe { func(buf.as_mut_ptr(), buf.len(), 0) }); + } } + sys_fill_exact(dest, kern_arnd) }