From 28ac843828734527cc6fa0deff959cc68cc8e374 Mon Sep 17 00:00:00 2001 From: newpavlov Date: Sun, 23 Jun 2019 19:24:25 +0300 Subject: [PATCH 01/19] use getrandom crate --- src/libstd/Cargo.toml | 1 + src/libstd/collections/hash/map.rs | 13 ++- src/libstd/sys/cloudabi/mod.rs | 8 -- src/libstd/sys/redox/mod.rs | 2 - src/libstd/sys/redox/rand.rs | 3 - src/libstd/sys/sgx/mod.rs | 15 --- src/libstd/sys/unix/mod.rs | 2 - src/libstd/sys/unix/rand.rs | 176 ----------------------------- src/libstd/sys/wasi/mod.rs | 10 -- src/libstd/sys/wasm/mod.rs | 9 -- src/libstd/sys/windows/mod.rs | 2 - src/libstd/sys/windows/pipe.rs | 7 +- src/libstd/sys/windows/rand.rs | 16 --- 13 files changed, 15 insertions(+), 249 deletions(-) delete mode 100644 src/libstd/sys/redox/rand.rs delete mode 100644 src/libstd/sys/unix/rand.rs delete mode 100644 src/libstd/sys/windows/rand.rs diff --git a/src/libstd/Cargo.toml b/src/libstd/Cargo.toml index 38df1f26d95fd..c89b9dfa2f6de 100644 --- a/src/libstd/Cargo.toml +++ b/src/libstd/Cargo.toml @@ -24,6 +24,7 @@ compiler_builtins = { version = "0.1.16" } profiler_builtins = { path = "../libprofiler_builtins", optional = true } unwind = { path = "../libunwind" } hashbrown = { version = "0.4.0", features = ['rustc-dep-of-std'] } +getrandom = "0.1" [dependencies.backtrace] version = "0.3.29" diff --git a/src/libstd/collections/hash/map.rs b/src/libstd/collections/hash/map.rs index 5a2fe2b244f55..1e84aac4da202 100644 --- a/src/libstd/collections/hash/map.rs +++ b/src/libstd/collections/hash/map.rs @@ -2445,13 +2445,18 @@ impl RandomState { // iteration order allows a form of DOS attack. To counter that we // increment one of the seeds on every RandomState creation, giving // every corresponding HashMap a different iteration order. - thread_local!(static KEYS: Cell<(u64, u64)> = { - Cell::new(sys::hashmap_random_keys()) + thread_local!(static KEYS: Cell<[u64; 2]> = { + let mut buf = [0u8; 16]; + // we consciously ignore potential errors here + let _ = getrandom::getrandom(&mut buf); + // SAFETY: it's safe to transmute random 16 bytes to two `u64`s + let buf: [u64; 2] = unsafe { core::mem::transmute() }; + Cell::new(buf) }); KEYS.with(|keys| { - let (k0, k1) = keys.get(); - keys.set((k0.wrapping_add(1), k1)); + let [k0, k1] = keys.get(); + keys.set([k0.wrapping_add(1), k1]); RandomState { k0: k0, k1: k1 } }) } diff --git a/src/libstd/sys/cloudabi/mod.rs b/src/libstd/sys/cloudabi/mod.rs index c3b8bbd042606..cac0442dabd7d 100644 --- a/src/libstd/sys/cloudabi/mod.rs +++ b/src/libstd/sys/cloudabi/mod.rs @@ -56,11 +56,3 @@ pub unsafe fn abort_internal() -> ! { } pub use libc::strlen; - -pub fn hashmap_random_keys() -> (u64, u64) { - unsafe { - let mut v = mem::uninitialized(); - libc::arc4random_buf(&mut v as *mut _ as *mut libc::c_void, mem::size_of_val(&v)); - v - } -} diff --git a/src/libstd/sys/redox/mod.rs b/src/libstd/sys/redox/mod.rs index 354184f8af6e7..8fd975a2ccf13 100644 --- a/src/libstd/sys/redox/mod.rs +++ b/src/libstd/sys/redox/mod.rs @@ -3,7 +3,6 @@ use crate::io::ErrorKind; pub use libc::strlen; -pub use self::rand::hashmap_random_keys; #[path = "../unix/alloc.rs"] pub mod alloc; @@ -23,7 +22,6 @@ pub mod os; pub mod path; pub mod pipe; pub mod process; -pub mod rand; pub mod rwlock; pub mod stack_overflow; pub mod stdio; diff --git a/src/libstd/sys/redox/rand.rs b/src/libstd/sys/redox/rand.rs deleted file mode 100644 index 5b58d1782bf0a..0000000000000 --- a/src/libstd/sys/redox/rand.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub fn hashmap_random_keys() -> (u64, u64) { - (0, 0) -} diff --git a/src/libstd/sys/sgx/mod.rs b/src/libstd/sys/sgx/mod.rs index 01f5536ed7a65..e5c1c9cbb9cc5 100644 --- a/src/libstd/sys/sgx/mod.rs +++ b/src/libstd/sys/sgx/mod.rs @@ -137,21 +137,6 @@ pub unsafe extern "C" fn __rust_abort() { abort_internal(); } -pub fn hashmap_random_keys() -> (u64, u64) { - fn rdrand64() -> u64 { - unsafe { - let mut ret: u64 = crate::mem::uninitialized(); - for _ in 0..10 { - if crate::arch::x86_64::_rdrand64_step(&mut ret) == 1 { - return ret; - } - } - rtabort!("Failed to obtain random data"); - } - } - (rdrand64(), rdrand64()) -} - pub use crate::sys_common::{AsInner, FromInner, IntoInner}; pub trait TryIntoInner: Sized { diff --git a/src/libstd/sys/unix/mod.rs b/src/libstd/sys/unix/mod.rs index 821623db2721e..5146793d18351 100644 --- a/src/libstd/sys/unix/mod.rs +++ b/src/libstd/sys/unix/mod.rs @@ -18,7 +18,6 @@ use crate::io::ErrorKind; #[cfg(all(not(rustdoc), target_os = "l4re"))] pub use crate::os::linux as platform; #[cfg(all(not(rustdoc), target_os = "hermit"))] pub use crate::os::hermit as platform; -pub use self::rand::hashmap_random_keys; pub use libc::strlen; #[macro_use] @@ -47,7 +46,6 @@ pub mod os; pub mod path; pub mod pipe; pub mod process; -pub mod rand; pub mod rwlock; pub mod stack_overflow; pub mod thread; diff --git a/src/libstd/sys/unix/rand.rs b/src/libstd/sys/unix/rand.rs deleted file mode 100644 index 71c62461ee9cb..0000000000000 --- a/src/libstd/sys/unix/rand.rs +++ /dev/null @@ -1,176 +0,0 @@ -use crate::mem; -use crate::slice; - -pub fn hashmap_random_keys() -> (u64, u64) { - let mut v = (0, 0); - unsafe { - let view = slice::from_raw_parts_mut(&mut v as *mut _ as *mut u8, - mem::size_of_val(&v)); - imp::fill_bytes(view); - } - return v -} - -#[cfg(all(unix, - not(target_os = "ios"), - not(target_os = "openbsd"), - not(target_os = "freebsd"), - not(target_os = "fuchsia")))] -mod imp { - use crate::fs::File; - use crate::io::Read; - - #[cfg(any(target_os = "linux", target_os = "android"))] - fn getrandom(buf: &mut [u8]) -> libc::c_long { - unsafe { - libc::syscall(libc::SYS_getrandom, buf.as_mut_ptr(), buf.len(), libc::GRND_NONBLOCK) - } - } - - #[cfg(not(any(target_os = "linux", target_os = "android")))] - fn getrandom_fill_bytes(_buf: &mut [u8]) -> bool { false } - - #[cfg(any(target_os = "linux", target_os = "android"))] - fn getrandom_fill_bytes(v: &mut [u8]) -> bool { - use crate::sync::atomic::{AtomicBool, Ordering}; - use crate::sys::os::errno; - - static GETRANDOM_UNAVAILABLE: AtomicBool = AtomicBool::new(false); - if GETRANDOM_UNAVAILABLE.load(Ordering::Relaxed) { - return false; - } - - let mut read = 0; - while read < v.len() { - let result = getrandom(&mut v[read..]); - if result == -1 { - let err = errno() as libc::c_int; - if err == libc::EINTR { - continue; - } else if err == libc::ENOSYS || err == libc::EPERM { - // Fall back to reading /dev/urandom if `getrandom` is not - // supported on the current kernel. - // - // Also fall back in case it is disabled by something like - // seccomp or inside of virtual machines. - GETRANDOM_UNAVAILABLE.store(true, Ordering::Relaxed); - return false; - } else if err == libc::EAGAIN { - return false; - } else { - panic!("unexpected getrandom error: {}", err); - } - } else { - read += result as usize; - } - } - true - } - - pub fn fill_bytes(v: &mut [u8]) { - // getrandom_fill_bytes here can fail if getrandom() returns EAGAIN, - // meaning it would have blocked because the non-blocking pool (urandom) - // has not initialized in the kernel yet due to a lack of entropy. The - // fallback we do here is to avoid blocking applications which could - // depend on this call without ever knowing they do and don't have a - // work around. The PRNG of /dev/urandom will still be used but over a - // possibly predictable entropy pool. - if getrandom_fill_bytes(v) { - return; - } - - // getrandom failed because it is permanently or temporarily (because - // of missing entropy) unavailable. Open /dev/urandom, read from it, - // and close it again. - let mut file = File::open("/dev/urandom").expect("failed to open /dev/urandom"); - file.read_exact(v).expect("failed to read /dev/urandom") - } -} - -#[cfg(target_os = "openbsd")] -mod imp { - use crate::sys::os::errno; - - pub fn fill_bytes(v: &mut [u8]) { - // getentropy(2) permits a maximum buffer size of 256 bytes - for s in v.chunks_mut(256) { - let ret = unsafe { - libc::getentropy(s.as_mut_ptr() as *mut libc::c_void, s.len()) - }; - if ret == -1 { - panic!("unexpected getentropy error: {}", errno()); - } - } - } -} - -// On iOS and MacOS `SecRandomCopyBytes` calls `CCRandomCopyBytes` with -// `kCCRandomDefault`. `CCRandomCopyBytes` manages a CSPRNG which is seeded -// from `/dev/random` and which runs on its own thread accessed via GCD. -// This seems needlessly heavyweight for the purposes of generating two u64s -// once per thread in `hashmap_random_keys`. Therefore `SecRandomCopyBytes` is -// only used on iOS where direct access to `/dev/urandom` is blocked by the -// sandbox. -#[cfg(target_os = "ios")] -mod imp { - use crate::io; - use crate::ptr; - use libc::{c_int, size_t}; - - enum SecRandom {} - - #[allow(non_upper_case_globals)] - const kSecRandomDefault: *const SecRandom = ptr::null(); - - extern { - fn SecRandomCopyBytes(rnd: *const SecRandom, - count: size_t, - bytes: *mut u8) -> c_int; - } - - pub fn fill_bytes(v: &mut [u8]) { - let ret = unsafe { - SecRandomCopyBytes(kSecRandomDefault, - v.len(), - v.as_mut_ptr()) - }; - if ret == -1 { - panic!("couldn't generate random bytes: {}", - io::Error::last_os_error()); - } - } -} - -#[cfg(target_os = "freebsd")] -mod imp { - use crate::ptr; - - pub fn fill_bytes(v: &mut [u8]) { - let mib = [libc::CTL_KERN, libc::KERN_ARND]; - // kern.arandom permits a maximum buffer size of 256 bytes - for s in v.chunks_mut(256) { - let mut s_len = s.len(); - let ret = unsafe { - libc::sysctl(mib.as_ptr(), mib.len() as libc::c_uint, - s.as_mut_ptr() as *mut _, &mut s_len, - ptr::null(), 0) - }; - if ret == -1 || s_len != s.len() { - panic!("kern.arandom sysctl failed! (returned {}, s.len() {}, oldlenp {})", - ret, s.len(), s_len); - } - } - } -} - -#[cfg(target_os = "fuchsia")] -mod imp { - #[link(name = "zircon")] - extern { - fn zx_cprng_draw(buffer: *mut u8, len: usize); - } - - pub fn fill_bytes(v: &mut [u8]) { - unsafe { zx_cprng_draw(v.as_mut_ptr(), v.len()) } - } -} diff --git a/src/libstd/sys/wasi/mod.rs b/src/libstd/sys/wasi/mod.rs index e22434439f5bb..b8d63b3566dcc 100644 --- a/src/libstd/sys/wasi/mod.rs +++ b/src/libstd/sys/wasi/mod.rs @@ -84,16 +84,6 @@ pub unsafe fn abort_internal() -> ! { libc::abort() } -pub fn hashmap_random_keys() -> (u64, u64) { - let mut ret = (0u64, 0u64); - unsafe { - let base = &mut ret as *mut (u64, u64) as *mut libc::c_void; - let len = mem::size_of_val(&ret); - cvt_wasi(libc::__wasi_random_get(base, len)).unwrap(); - } - return ret -} - #[doc(hidden)] pub trait IsMinusOne { fn is_minus_one(&self) -> bool; diff --git a/src/libstd/sys/wasm/mod.rs b/src/libstd/sys/wasm/mod.rs index 7d157709eb6bf..7b8a800bd7f68 100644 --- a/src/libstd/sys/wasm/mod.rs +++ b/src/libstd/sys/wasm/mod.rs @@ -93,15 +93,6 @@ pub unsafe fn abort_internal() -> ! { ExitSysCall::perform(1) } -// We don't have randomness yet, but I totally used a random number generator to -// generate these numbers. -// -// More seriously though this is just for DOS protection in hash maps. It's ok -// if we don't do that on wasm just yet. -pub fn hashmap_random_keys() -> (u64, u64) { - (1, 2) -} - // Implement a minimal set of system calls to enable basic IO pub enum SysCallIndex { Read = 0, diff --git a/src/libstd/sys/windows/mod.rs b/src/libstd/sys/windows/mod.rs index 1cb5553912981..ab23089355c51 100644 --- a/src/libstd/sys/windows/mod.rs +++ b/src/libstd/sys/windows/mod.rs @@ -8,7 +8,6 @@ use crate::path::PathBuf; use crate::time::Duration; pub use libc::strlen; -pub use self::rand::hashmap_random_keys; #[macro_use] pub mod compat; @@ -31,7 +30,6 @@ pub mod os_str; pub mod path; pub mod pipe; pub mod process; -pub mod rand; pub mod rwlock; pub mod stack_overflow; pub mod thread; diff --git a/src/libstd/sys/windows/pipe.rs b/src/libstd/sys/windows/pipe.rs index 493ee8a9a2d7c..1e7ba9eafe3f1 100644 --- a/src/libstd/sys/windows/pipe.rs +++ b/src/libstd/sys/windows/pipe.rs @@ -11,7 +11,6 @@ use crate::sync::atomic::AtomicUsize; use crate::sys::c; use crate::sys::fs::{File, OpenOptions}; use crate::sys::handle::Handle; -use crate::sys::hashmap_random_keys; //////////////////////////////////////////////////////////////////////////////// // Anonymous pipes @@ -154,7 +153,11 @@ fn random_number() -> usize { return N.fetch_add(1, SeqCst) } - N.store(hashmap_random_keys().0 as usize, SeqCst); + let mut buf = [0u8; 8]; + getrandom::getrandom(&mut buf).expect("OS RNG failure"); + // SAFETY: `buf` should be aligned, so it's safe to transmute it to `u64` + let n: u64 = unsafe { core::mem::transmute(buf) } as usize; + N.store(n, SeqCst); } } diff --git a/src/libstd/sys/windows/rand.rs b/src/libstd/sys/windows/rand.rs deleted file mode 100644 index 0193f4defa1ff..0000000000000 --- a/src/libstd/sys/windows/rand.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::io; -use crate::mem; -use crate::sys::c; - -pub fn hashmap_random_keys() -> (u64, u64) { - let mut v = (0, 0); - let ret = unsafe { - c::RtlGenRandom(&mut v as *mut _ as *mut u8, - mem::size_of_val(&v) as c::ULONG) - }; - if ret == 0 { - panic!("couldn't generate random bytes: {}", - io::Error::last_os_error()); - } - return v -} From 621ef049568839b2c9bd54c92d33f5d2c0ee744a Mon Sep 17 00:00:00 2001 From: Artyom Pavlov Date: Sun, 23 Jun 2019 19:35:54 +0000 Subject: [PATCH 02/19] transmute fix Co-Authored-By: Joe ST --- src/libstd/collections/hash/map.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libstd/collections/hash/map.rs b/src/libstd/collections/hash/map.rs index 1e84aac4da202..ce3f9d772bec6 100644 --- a/src/libstd/collections/hash/map.rs +++ b/src/libstd/collections/hash/map.rs @@ -2450,7 +2450,7 @@ impl RandomState { // we consciously ignore potential errors here let _ = getrandom::getrandom(&mut buf); // SAFETY: it's safe to transmute random 16 bytes to two `u64`s - let buf: [u64; 2] = unsafe { core::mem::transmute() }; + let buf: [u64; 2] = unsafe { core::mem::transmute(buf) }; Cell::new(buf) }); From 98be6f77a01c1ab104db6105b564bc0f156f2750 Mon Sep 17 00:00:00 2001 From: Artyom Pavlov Date: Mon, 24 Jun 2019 11:59:39 +0000 Subject: [PATCH 03/19] use from_ne_bytes instead of transmute --- src/libstd/sys/windows/pipe.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libstd/sys/windows/pipe.rs b/src/libstd/sys/windows/pipe.rs index 1e7ba9eafe3f1..48e016e3ffe43 100644 --- a/src/libstd/sys/windows/pipe.rs +++ b/src/libstd/sys/windows/pipe.rs @@ -156,7 +156,7 @@ fn random_number() -> usize { let mut buf = [0u8; 8]; getrandom::getrandom(&mut buf).expect("OS RNG failure"); // SAFETY: `buf` should be aligned, so it's safe to transmute it to `u64` - let n: u64 = unsafe { core::mem::transmute(buf) } as usize; + let n = u64::from_ne_bytes(buf) as usize; N.store(n, SeqCst); } } From 79ffb24949dcefbcd5c4c93a1452709800de9f0c Mon Sep 17 00:00:00 2001 From: Artyom Pavlov Date: Mon, 24 Jun 2019 12:56:50 +0000 Subject: [PATCH 04/19] remove comment --- src/libstd/sys/windows/pipe.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libstd/sys/windows/pipe.rs b/src/libstd/sys/windows/pipe.rs index 48e016e3ffe43..7e41851a7f13f 100644 --- a/src/libstd/sys/windows/pipe.rs +++ b/src/libstd/sys/windows/pipe.rs @@ -155,7 +155,6 @@ fn random_number() -> usize { let mut buf = [0u8; 8]; getrandom::getrandom(&mut buf).expect("OS RNG failure"); - // SAFETY: `buf` should be aligned, so it's safe to transmute it to `u64` let n = u64::from_ne_bytes(buf) as usize; N.store(n, SeqCst); } From 26a110801fe4ceffd3d78ccb99c90bfd7d26cfb9 Mon Sep 17 00:00:00 2001 From: Artyom Pavlov Date: Tue, 25 Jun 2019 09:55:32 +0000 Subject: [PATCH 05/19] use transmute_copy --- src/libstd/collections/hash/map.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libstd/collections/hash/map.rs b/src/libstd/collections/hash/map.rs index ce3f9d772bec6..bc638239caeb3 100644 --- a/src/libstd/collections/hash/map.rs +++ b/src/libstd/collections/hash/map.rs @@ -2449,8 +2449,8 @@ impl RandomState { let mut buf = [0u8; 16]; // we consciously ignore potential errors here let _ = getrandom::getrandom(&mut buf); - // SAFETY: it's safe to transmute random 16 bytes to two `u64`s - let buf: [u64; 2] = unsafe { core::mem::transmute(buf) }; + // SAFETY: it's safe to transmute_copy random 16 bytes to two `u64`s + let buf: [u64; 2] = unsafe { core::mem::transmute_copy(&buf) }; Cell::new(buf) }); From 66e799decbcf7ea5197dd46ec45cf79eef7d888b Mon Sep 17 00:00:00 2001 From: Artyom Pavlov Date: Tue, 25 Jun 2019 11:29:56 +0000 Subject: [PATCH 06/19] Update src/libstd/sys/windows/pipe.rs Co-Authored-By: Oliver Middleton --- src/libstd/sys/windows/pipe.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libstd/sys/windows/pipe.rs b/src/libstd/sys/windows/pipe.rs index 7e41851a7f13f..2b8f01f8b43ec 100644 --- a/src/libstd/sys/windows/pipe.rs +++ b/src/libstd/sys/windows/pipe.rs @@ -153,7 +153,7 @@ fn random_number() -> usize { return N.fetch_add(1, SeqCst) } - let mut buf = [0u8; 8]; + let mut buf = [0u8; mem::size_of::()]; getrandom::getrandom(&mut buf).expect("OS RNG failure"); let n = u64::from_ne_bytes(buf) as usize; N.store(n, SeqCst); From b6c76730ec2e662c302031242c1ae1b339e74e74 Mon Sep 17 00:00:00 2001 From: Artyom Pavlov Date: Tue, 25 Jun 2019 11:30:12 +0000 Subject: [PATCH 07/19] Update src/libstd/sys/windows/pipe.rs Co-Authored-By: Oliver Middleton --- src/libstd/sys/windows/pipe.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libstd/sys/windows/pipe.rs b/src/libstd/sys/windows/pipe.rs index 2b8f01f8b43ec..287ba0ddf6937 100644 --- a/src/libstd/sys/windows/pipe.rs +++ b/src/libstd/sys/windows/pipe.rs @@ -155,7 +155,7 @@ fn random_number() -> usize { let mut buf = [0u8; mem::size_of::()]; getrandom::getrandom(&mut buf).expect("OS RNG failure"); - let n = u64::from_ne_bytes(buf) as usize; + let n = usize::from_ne_bytes(buf); N.store(n, SeqCst); } } From 0056e1d60515ef18ab6514f37fa20628de3d8aa4 Mon Sep 17 00:00:00 2001 From: Artyom Pavlov Date: Tue, 25 Jun 2019 11:34:30 +0000 Subject: [PATCH 08/19] ignore only Error::UNAVAILABLE, use u128::from_ne_bytes to remove unsafe --- src/libstd/collections/hash/map.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/libstd/collections/hash/map.rs b/src/libstd/collections/hash/map.rs index bc638239caeb3..3189f0e1f4952 100644 --- a/src/libstd/collections/hash/map.rs +++ b/src/libstd/collections/hash/map.rs @@ -2447,11 +2447,13 @@ impl RandomState { // every corresponding HashMap a different iteration order. thread_local!(static KEYS: Cell<[u64; 2]> = { let mut buf = [0u8; 16]; - // we consciously ignore potential errors here - let _ = getrandom::getrandom(&mut buf); - // SAFETY: it's safe to transmute_copy random 16 bytes to two `u64`s - let buf: [u64; 2] = unsafe { core::mem::transmute_copy(&buf) }; - Cell::new(buf) + // in case of `Error::UNAVAILABLE` we use a constant value + match getrandom::getrandom(&mut buf) { + Ok(()) | Err(Error::UNAVAILABLE) => (), + Err(err) => panic!("getrandom failure: {:?}", err), + } + let n = u128::from_ne_bytes(buf); + Cell::new([n as u64, (n >> 64) as u64]) }); KEYS.with(|keys| { From 67ea52941513849df2cf63a3fe9fe802590671cc Mon Sep 17 00:00:00 2001 From: newpavlov Date: Fri, 28 Jun 2019 20:05:50 +0300 Subject: [PATCH 09/19] whitelist wasm32-unknown-unknown target, update Cargo.lock --- Cargo.lock | 20 ++++++++++++++++++++ src/libstd/collections/hash/map.rs | 7 +++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 40b8cf507e97c..82db15eb818d9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1078,6 +1078,15 @@ dependencies = [ "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "getrandom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.54 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "git2" version = "0.9.1" @@ -1392,6 +1401,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "lazy_static" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "lazycell" @@ -3495,6 +3507,11 @@ dependencies = [ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "spin" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "stable_deref_trait" version = "1.1.0" @@ -3512,6 +3529,7 @@ dependencies = [ "core 0.0.0", "dlmalloc 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "fortanix-sgx-abi 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "hashbrown 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.54 (registry+https://github.com/rust-lang/crates.io-index)", "panic_abort 0.0.0", @@ -4486,6 +4504,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum fwdansi 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34dd4c507af68d37ffef962063dfa1944ce0dd4d5b82043dbab1dabe088610c3" "checksum generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef25c5683767570c2bbd7deba372926a55eaae9982d7726ee2a1050239d45b9d" "checksum getopts 0.2.19 (registry+https://github.com/rust-lang/crates.io-index)" = "72327b15c228bfe31f1390f93dd5e9279587f0463836393c9df719ce62a3e450" +"checksum getrandom 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "82d68102e030c3d41969bb76ebf55ed731fd946a0a91e0fa7e02f6392cc6db21" "checksum git2 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "924b2e7d2986e625dcad89e8a429a7b3adee3c3d71e585f4a66c4f7e78715e31" "checksum git2-curl 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f21f0550fd5d3f7c5adb94797fcd3d1002d7fc1fa349c82fe44f3c97ef80b62c" "checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" @@ -4668,6 +4687,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ab606a9c5e214920bb66c458cd7be8ef094f813f20fe77a54cc7dbfff220d4b7" "checksum socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d11a52082057d87cb5caa31ad812f4504b97ab44732cd8359df2e9ff9f48e7" +"checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55" "checksum stable_deref_trait 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ffbc596e092fe5f598b12ef46cc03754085ac2f4d8c739ad61c4ae266cc3b3fa" "checksum string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25d70109977172b127fe834e5449e5ab1740b9ba49fa18a2020f509174f25423" "checksum string_cache_codegen 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1eea1eee654ef80933142157fdad9dd8bc43cf7c74e999e369263496f04ff4da" diff --git a/src/libstd/collections/hash/map.rs b/src/libstd/collections/hash/map.rs index 3189f0e1f4952..c840aa03a753b 100644 --- a/src/libstd/collections/hash/map.rs +++ b/src/libstd/collections/hash/map.rs @@ -2447,9 +2447,12 @@ impl RandomState { // every corresponding HashMap a different iteration order. thread_local!(static KEYS: Cell<[u64; 2]> = { let mut buf = [0u8; 16]; - // in case of `Error::UNAVAILABLE` we use a constant value + // In case of `Error::UNAVAILABLE` we use a constant value + // for the following whitelisted targets + let whitelisted = cfg!(target="wasm32-unknown-unknown"); match getrandom::getrandom(&mut buf) { - Ok(()) | Err(Error::UNAVAILABLE) => (), + Ok(()) => (), + Err(Error::UNAVAILABLE) if whitelisted => (), Err(err) => panic!("getrandom failure: {:?}", err), } let n = u128::from_ne_bytes(buf); From e6d3ed375cac501b62c216c14ac93286b9a5ac28 Mon Sep 17 00:00:00 2001 From: newpavlov Date: Fri, 28 Jun 2019 20:25:41 +0300 Subject: [PATCH 10/19] use => {} --- src/libstd/collections/hash/map.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libstd/collections/hash/map.rs b/src/libstd/collections/hash/map.rs index c840aa03a753b..1efc9b2fc26eb 100644 --- a/src/libstd/collections/hash/map.rs +++ b/src/libstd/collections/hash/map.rs @@ -2451,9 +2451,9 @@ impl RandomState { // for the following whitelisted targets let whitelisted = cfg!(target="wasm32-unknown-unknown"); match getrandom::getrandom(&mut buf) { - Ok(()) => (), - Err(Error::UNAVAILABLE) if whitelisted => (), - Err(err) => panic!("getrandom failure: {:?}", err), + Ok(()) => {} + Err(Error::UNAVAILABLE) if whitelisted => {} + Err(err) => panic!("getrandom failure: {:?}", err) } let n = u128::from_ne_bytes(buf); Cell::new([n as u64, (n >> 64) as u64]) From 7ac37e2a080816a400da438908f55ccf66e87dfa Mon Sep 17 00:00:00 2001 From: newpavlov Date: Wed, 14 Aug 2019 17:27:16 +0300 Subject: [PATCH 11/19] update Cargo.lock --- Cargo.lock | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index da65859d49ad6..0d0344b3c4a26 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1050,11 +1050,12 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", + "wasi 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2246,7 +2247,7 @@ name = "rand" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "getrandom 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2286,7 +2287,7 @@ name = "rand_core" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "getrandom 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3534,7 +3535,7 @@ dependencies = [ "core 0.0.0", "dlmalloc 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "fortanix-sgx-abi 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "getrandom 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "hashbrown 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", "panic_abort 0.0.0", @@ -4270,6 +4271,11 @@ dependencies = [ "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "wasi" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "winapi" version = "0.2.8" @@ -4444,7 +4450,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum fwdansi 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34dd4c507af68d37ffef962063dfa1944ce0dd4d5b82043dbab1dabe088610c3" "checksum generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef25c5683767570c2bbd7deba372926a55eaae9982d7726ee2a1050239d45b9d" "checksum getopts 0.2.19 (registry+https://github.com/rust-lang/crates.io-index)" = "72327b15c228bfe31f1390f93dd5e9279587f0463836393c9df719ce62a3e450" -"checksum getrandom 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "34f33de6f0ae7c9cb5e574502a562e2b512799e32abb801cd1e79ad952b62b49" +"checksum getrandom 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "2512b3191f22e2763a5db387f1c9409379772e2050841722eb4a8c4f497bf096" "checksum git2 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8cb400360e8a4d61b10e648285bbfa919bbf9519d0d5d5720354456f44349226" "checksum git2-curl 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2293de73491c3dc4174c5949ef53d2cc037b27613f88d72032e3f5237247a7dd" "checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" @@ -4704,6 +4710,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum vte 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4f42f536e22f7fcbb407639765c8fd78707a33109301f834a594758bedd6e8cf" "checksum walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d9d7ed3431229a144296213105a390676cc49c9b6a72bd19f3176c98e129fa1" "checksum want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" +"checksum wasi 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fd5442abcac6525a045cc8c795aedb60da7a2e5e89c7bf18a0d5357849bb23c7" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" From facdc28803b66ac6f1cf9591c36bea6f7fac5c4f Mon Sep 17 00:00:00 2001 From: newpavlov Date: Wed, 14 Aug 2019 17:28:35 +0300 Subject: [PATCH 12/19] enable rustc-dep-of-std for getrandom --- src/libstd/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libstd/Cargo.toml b/src/libstd/Cargo.toml index 73384051b64ed..7d07c1be3b0f9 100644 --- a/src/libstd/Cargo.toml +++ b/src/libstd/Cargo.toml @@ -24,7 +24,7 @@ compiler_builtins = { version = "0.1.16" } profiler_builtins = { path = "../libprofiler_builtins", optional = true } unwind = { path = "../libunwind" } hashbrown = { version = "0.4.0", features = ['rustc-dep-of-std'] } -getrandom = "0.1" +getrandom = { version = "0.1.9", features = ['rustc-dep-of-std'] } [dependencies.backtrace] version = "0.3.34" From 5d0ae5924c41dc65f2d599a11eeb28f60b56e76a Mon Sep 17 00:00:00 2001 From: newpavlov Date: Wed, 14 Aug 2019 17:40:55 +0300 Subject: [PATCH 13/19] wasm32-unknown-unknown exception --- Cargo.lock | 2 ++ src/libstd/Cargo.toml | 6 ++++++ src/libstd/collections/hash/map.rs | 16 +++++++++------- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0d0344b3c4a26..bad7e1630473d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1054,7 +1054,9 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "compiler_builtins 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-std-workspace-core 1.0.0", "wasi 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/src/libstd/Cargo.toml b/src/libstd/Cargo.toml index 7d07c1be3b0f9..0c6c15d3cc229 100644 --- a/src/libstd/Cargo.toml +++ b/src/libstd/Cargo.toml @@ -24,6 +24,12 @@ compiler_builtins = { version = "0.1.16" } profiler_builtins = { path = "../libprofiler_builtins", optional = true } unwind = { path = "../libunwind" } hashbrown = { version = "0.4.0", features = ['rustc-dep-of-std'] } + +[target.'cfg(not(all( + target_arch = "wasm32", + target_vendor = "unknown", + target_os = "unknown", +)))'.dependencies] getrandom = { version = "0.1.9", features = ['rustc-dep-of-std'] } [dependencies.backtrace] diff --git a/src/libstd/collections/hash/map.rs b/src/libstd/collections/hash/map.rs index 22ca7c9a9a21e..fe9a05cd7f51e 100644 --- a/src/libstd/collections/hash/map.rs +++ b/src/libstd/collections/hash/map.rs @@ -2447,13 +2447,15 @@ impl RandomState { // every corresponding HashMap a different iteration order. thread_local!(static KEYS: Cell<[u64; 2]> = { let mut buf = [0u8; 16]; - // In case of `Error::UNAVAILABLE` we use a constant value - // for the following whitelisted targets - let whitelisted = cfg!(target="wasm32-unknown-unknown"); - match getrandom::getrandom(&mut buf) { - Ok(()) => {} - Err(Error::UNAVAILABLE) if whitelisted => {} - Err(err) => panic!("getrandom failure: {:?}", err) + // Use a constant seed on wasm32-unknown-unknown. + // `cfg(target = "..")` does not work right now, see: + // https://github.com/rust-lang/rust/issues/63217 + if cfg!(not(all( + target_arch = "wasm32", + target_vendor = "unknown", + target_os = "unknown", + ))) { + getrandom::getrandom(&mut buf).unwrap(); } let n = u128::from_ne_bytes(buf); Cell::new([n as u64, (n >> 64) as u64]) From 1fdf620058c199ad78e1d9edbc0fdaae5823f1ec Mon Sep 17 00:00:00 2001 From: newpavlov Date: Wed, 14 Aug 2019 17:47:37 +0300 Subject: [PATCH 14/19] remove bcrypt linking --- src/libstd/build.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/libstd/build.rs b/src/libstd/build.rs index 8db7bc12cd308..2e43932f3257d 100644 --- a/src/libstd/build.rs +++ b/src/libstd/build.rs @@ -39,8 +39,6 @@ fn main() { println!("cargo:rustc-link-lib=resolv"); } else if target.contains("uwp") { println!("cargo:rustc-link-lib=ws2_32"); - // For BCryptGenRandom - println!("cargo:rustc-link-lib=bcrypt"); } else if target.contains("windows") { println!("cargo:rustc-link-lib=advapi32"); println!("cargo:rustc-link-lib=ws2_32"); From f94d928ad88179f37920fb624d9f833a379558e0 Mon Sep 17 00:00:00 2001 From: newpavlov Date: Wed, 14 Aug 2019 17:49:06 +0300 Subject: [PATCH 15/19] fix Cargo.toml --- src/libstd/Cargo.toml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/libstd/Cargo.toml b/src/libstd/Cargo.toml index 0c6c15d3cc229..4e72a01c2e409 100644 --- a/src/libstd/Cargo.toml +++ b/src/libstd/Cargo.toml @@ -25,11 +25,7 @@ profiler_builtins = { path = "../libprofiler_builtins", optional = true } unwind = { path = "../libunwind" } hashbrown = { version = "0.4.0", features = ['rustc-dep-of-std'] } -[target.'cfg(not(all( - target_arch = "wasm32", - target_vendor = "unknown", - target_os = "unknown", -)))'.dependencies] +[target.'cfg(not(all(target_arch = "wasm32", target_vendor = "unknown", target_os = "unknown")))'.dependencies] getrandom = { version = "0.1.9", features = ['rustc-dep-of-std'] } [dependencies.backtrace] From dd9af377f730f5b02ee74969f6b2cc3896c50e8c Mon Sep 17 00:00:00 2001 From: newpavlov Date: Wed, 14 Aug 2019 18:06:13 +0300 Subject: [PATCH 16/19] add wasi to whitelist --- src/tools/tidy/src/deps.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/tidy/src/deps.rs b/src/tools/tidy/src/deps.rs index de54eb8f57312..add6a38744e68 100644 --- a/src/tools/tidy/src/deps.rs +++ b/src/tools/tidy/src/deps.rs @@ -168,6 +168,7 @@ const WHITELIST: &[Crate<'_>] = &[ Crate("vcpkg"), Crate("version_check"), Crate("void"), + Crate("wasi"), Crate("winapi"), Crate("winapi-build"), Crate("winapi-i686-pc-windows-gnu"), From 4f3e2a0bd91c6b12d3538a73b0fe2c04008ac49d Mon Sep 17 00:00:00 2001 From: newpavlov Date: Wed, 14 Aug 2019 18:46:07 +0300 Subject: [PATCH 17/19] add tidy check exception --- src/tools/tidy/src/pal.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/tools/tidy/src/pal.rs b/src/tools/tidy/src/pal.rs index c6bb16318b6ee..f23a78d7c3b30 100644 --- a/src/tools/tidy/src/pal.rs +++ b/src/tools/tidy/src/pal.rs @@ -82,6 +82,9 @@ const EXCEPTION_PATHS: &[&str] = &[ "src/librustdoc", "src/libsyntax", "src/bootstrap", + + // constant hash map seed for `wasm32-unknown-unknown` + "src/libstd/collections/hash/map.rs", ]; pub fn check(path: &Path, bad: &mut bool) { From 93c89fe21ac9f5dde4a990bed1c984dcd3521847 Mon Sep 17 00:00:00 2001 From: newpavlov Date: Wed, 14 Aug 2019 18:57:04 +0300 Subject: [PATCH 18/19] remove unused import --- src/libstd/collections/hash/map.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libstd/collections/hash/map.rs b/src/libstd/collections/hash/map.rs index fe9a05cd7f51e..cd274adadb82c 100644 --- a/src/libstd/collections/hash/map.rs +++ b/src/libstd/collections/hash/map.rs @@ -12,7 +12,6 @@ use crate::fmt::{self, Debug}; use crate::hash::{BuildHasher, Hash, Hasher, SipHasher13}; use crate::iter::{FromIterator, FusedIterator}; use crate::ops::Index; -use crate::sys; /// A hash map implemented with quadratic probing and SIMD lookup. /// From f584f92071e8a7a1e825a2a0486fae024149ad06 Mon Sep 17 00:00:00 2001 From: newpavlov Date: Wed, 14 Aug 2019 19:39:12 +0300 Subject: [PATCH 19/19] remove unused extern fns --- src/libstd/sys/windows/c.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/libstd/sys/windows/c.rs b/src/libstd/sys/windows/c.rs index f706709c9ccf4..6c77bdf23b542 100644 --- a/src/libstd/sys/windows/c.rs +++ b/src/libstd/sys/windows/c.rs @@ -664,8 +664,6 @@ if #[cfg(not(target_vendor = "uwp"))] { pub const TOKEN_READ: DWORD = 0x20008; extern "system" { - #[link_name = "SystemFunction036"] - pub fn RtlGenRandom(RandomBuffer: *mut u8, RandomBufferLength: ULONG) -> BOOLEAN; pub fn ReadConsoleW(hConsoleInput: HANDLE, lpBuffer: LPVOID, @@ -724,8 +722,6 @@ if #[cfg(target_vendor = "uwp")] { fileInfoClass: FILE_INFO_BY_HANDLE_CLASS, lpFileInformation: LPVOID, dwBufferSize: DWORD) -> BOOL; - pub fn BCryptGenRandom(hAlgorithm: LPVOID, pBuffer: *mut u8, - cbBuffer: ULONG, dwFlags: ULONG) -> LONG; } } }