mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 08:44:35 +00:00
move randomness tests into a single file and share the getrandom implementation across unices
This commit is contained in:
parent
352b21033a
commit
aaf5c5e742
@ -143,12 +143,12 @@ case $HOST_TARGET in
|
|||||||
# Partially supported targets (tier 2)
|
# Partially supported targets (tier 2)
|
||||||
VERY_BASIC="integer vec string btreemap" # common things we test on all of them (if they have std), requires no target-specific shims
|
VERY_BASIC="integer vec string btreemap" # common things we test on all of them (if they have std), requires no target-specific shims
|
||||||
BASIC="$VERY_BASIC hello hashmap alloc align" # ensures we have the shims for stdout and basic data structures
|
BASIC="$VERY_BASIC hello hashmap alloc align" # ensures we have the shims for stdout and basic data structures
|
||||||
MIRI_TEST_TARGET=x86_64-unknown-freebsd run_tests_minimal $BASIC panic/panic concurrency/simple atomic threadname libc-getentropy libc-getrandom libc-misc fs env num_cpus
|
MIRI_TEST_TARGET=x86_64-unknown-freebsd run_tests_minimal $BASIC panic/panic concurrency/simple atomic threadname libc-misc libc-random libc-time fs env num_cpus
|
||||||
MIRI_TEST_TARGET=i686-unknown-freebsd run_tests_minimal $BASIC panic/panic concurrency/simple atomic threadname libc-getentropy libc-getrandom libc-misc fs env num_cpus
|
MIRI_TEST_TARGET=i686-unknown-freebsd run_tests_minimal $BASIC panic/panic concurrency/simple atomic threadname libc-misc libc-random libc-time fs env num_cpus
|
||||||
MIRI_TEST_TARGET=aarch64-linux-android run_tests_minimal $VERY_BASIC hello panic/panic
|
MIRI_TEST_TARGET=x86_64-unknown-illumos run_tests_minimal $VERY_BASIC hello panic/panic concurrency/simple pthread-sync libc-misc libc-random
|
||||||
MIRI_TEST_TARGET=x86_64-unknown-illumos run_tests_minimal $VERY_BASIC hello panic/panic concurrency/simple pthread-sync libc-misc
|
|
||||||
# TODO fix solaris stack guard
|
# TODO fix solaris stack guard
|
||||||
# MIRI_TEST_TARGET=x86_64-pc-solaris run_tests_minimal $VERY_BASIC hello panic/panic pthread-sync
|
# MIRI_TEST_TARGET=x86_64-pc-solaris run_tests_minimal $VERY_BASIC hello panic/panic pthread-sync
|
||||||
|
MIRI_TEST_TARGET=aarch64-linux-android run_tests_minimal $VERY_BASIC hello panic/panic
|
||||||
MIRI_TEST_TARGET=wasm32-wasi run_tests_minimal $VERY_BASIC wasm
|
MIRI_TEST_TARGET=wasm32-wasi run_tests_minimal $VERY_BASIC wasm
|
||||||
MIRI_TEST_TARGET=wasm32-unknown-unknown run_tests_minimal $VERY_BASIC wasm
|
MIRI_TEST_TARGET=wasm32-unknown-unknown run_tests_minimal $VERY_BASIC wasm
|
||||||
MIRI_TEST_TARGET=thumbv7em-none-eabihf run_tests_minimal no_std
|
MIRI_TEST_TARGET=thumbv7em-none-eabihf run_tests_minimal no_std
|
||||||
|
@ -23,7 +23,7 @@ pub fn is_dyn_sym(name: &str, target_os: &str) -> bool {
|
|||||||
// well allow it in `dlsym`.
|
// well allow it in `dlsym`.
|
||||||
"signal" => true,
|
"signal" => true,
|
||||||
// needed at least on macOS to avoid file-based fallback in getrandom
|
// needed at least on macOS to avoid file-based fallback in getrandom
|
||||||
"getentropy" => true,
|
"getentropy" | "getrandom" => true,
|
||||||
// Give specific OSes a chance to allow their symbols.
|
// Give specific OSes a chance to allow their symbols.
|
||||||
_ =>
|
_ =>
|
||||||
match target_os {
|
match target_os {
|
||||||
@ -632,6 +632,24 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||||||
this.write_scalar(Scalar::from_i32(0), dest)?;
|
this.write_scalar(Scalar::from_i32(0), dest)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
"getrandom" => {
|
||||||
|
// This function is non-standard but exists with the same signature and behavior on
|
||||||
|
// Linux, FreeBSD and Solaris/Illumos.
|
||||||
|
if !matches!(&*this.tcx.sess.target.os, "linux" | "freebsd" | "illumos" | "solaris") {
|
||||||
|
throw_unsup_format!(
|
||||||
|
"`getentropy` is not supported on {}",
|
||||||
|
this.tcx.sess.target.os
|
||||||
|
);
|
||||||
|
}
|
||||||
|
let [ptr, len, flags] =
|
||||||
|
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
||||||
|
let ptr = this.read_pointer(ptr)?;
|
||||||
|
let len = this.read_target_usize(len)?;
|
||||||
|
let _flags = this.read_scalar(flags)?.to_i32()?;
|
||||||
|
// We ignore the flags, just always use the same PRNG / host RNG.
|
||||||
|
this.gen_random(ptr, len)?;
|
||||||
|
this.write_scalar(Scalar::from_target_usize(len, this), dest)?;
|
||||||
|
}
|
||||||
|
|
||||||
// Incomplete shims that we "stub out" just to get pre-main initialization code to work.
|
// Incomplete shims that we "stub out" just to get pre-main initialization code to work.
|
||||||
// These shims are enabled only when the caller is in the standard library.
|
// These shims are enabled only when the caller is in the standard library.
|
||||||
|
@ -20,11 +20,6 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||||||
let this = self.eval_context_mut();
|
let this = self.eval_context_mut();
|
||||||
match link_name.as_str() {
|
match link_name.as_str() {
|
||||||
// Threading
|
// Threading
|
||||||
"pthread_attr_get_np" if this.frame_in_std() => {
|
|
||||||
let [_thread, _attr] =
|
|
||||||
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
|
||||||
this.write_null(dest)?;
|
|
||||||
}
|
|
||||||
"pthread_set_name_np" => {
|
"pthread_set_name_np" => {
|
||||||
let [thread, name] =
|
let [thread, name] =
|
||||||
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
||||||
@ -75,27 +70,20 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Miscellaneous
|
// Miscellaneous
|
||||||
"getrandom" => {
|
|
||||||
let [ptr, len, flags] =
|
|
||||||
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
|
||||||
let ptr = this.read_pointer(ptr)?;
|
|
||||||
let len = this.read_target_usize(len)?;
|
|
||||||
let _flags = this.read_scalar(flags)?.to_i32()?;
|
|
||||||
// flags on freebsd does not really matter
|
|
||||||
// in practice, GRND_RANDOM does not particularly draw from /dev/random
|
|
||||||
// since it is the same as to /dev/urandom.
|
|
||||||
// GRND_INSECURE is only an alias of GRND_NONBLOCK, which
|
|
||||||
// does not affect the RNG.
|
|
||||||
// https://man.freebsd.org/cgi/man.cgi?query=getrandom&sektion=2&n=1
|
|
||||||
this.gen_random(ptr, len)?;
|
|
||||||
this.write_scalar(Scalar::from_target_usize(len, this), dest)?;
|
|
||||||
}
|
|
||||||
"__error" => {
|
"__error" => {
|
||||||
let [] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
let [] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
||||||
let errno_place = this.last_error_place()?;
|
let errno_place = this.last_error_place()?;
|
||||||
this.write_scalar(errno_place.to_ref(this).to_scalar(), dest)?;
|
this.write_scalar(errno_place.to_ref(this).to_scalar(), dest)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Incomplete shims that we "stub out" just to get pre-main initialization code to work.
|
||||||
|
// These shims are enabled only when the caller is in the standard library.
|
||||||
|
"pthread_attr_get_np" if this.frame_in_std() => {
|
||||||
|
let [_thread, _attr] =
|
||||||
|
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
||||||
|
this.write_null(dest)?;
|
||||||
|
}
|
||||||
|
|
||||||
_ => return Ok(EmulateItemResult::NotSupported),
|
_ => return Ok(EmulateItemResult::NotSupported),
|
||||||
}
|
}
|
||||||
Ok(EmulateItemResult::NeedsJumping)
|
Ok(EmulateItemResult::NeedsJumping)
|
||||||
|
@ -11,7 +11,7 @@ use shims::unix::linux::mem::EvalContextExt as _;
|
|||||||
use shims::unix::linux::sync::futex;
|
use shims::unix::linux::sync::futex;
|
||||||
|
|
||||||
pub fn is_dyn_sym(name: &str) -> bool {
|
pub fn is_dyn_sym(name: &str) -> bool {
|
||||||
matches!(name, "getrandom" | "statx")
|
matches!(name, "statx")
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for crate::MiriInterpCx<'mir, 'tcx> {}
|
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for crate::MiriInterpCx<'mir, 'tcx> {}
|
||||||
@ -140,11 +140,6 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Miscellaneous
|
// Miscellaneous
|
||||||
"getrandom" => {
|
|
||||||
let [ptr, len, flags] =
|
|
||||||
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
|
||||||
getrandom(this, ptr, len, flags, dest)?;
|
|
||||||
}
|
|
||||||
"mmap64" => {
|
"mmap64" => {
|
||||||
let [addr, length, prot, flags, fd, offset] =
|
let [addr, length, prot, flags, fd, offset] =
|
||||||
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
//@ignore-target-windows: no libc
|
|
||||||
|
|
||||||
use libc::getentropy;
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
let mut buf1 = [0u8; 256];
|
|
||||||
let mut buf2 = [0u8; 257];
|
|
||||||
unsafe {
|
|
||||||
assert_eq!(getentropy(buf1.as_mut_ptr() as *mut libc::c_void, buf1.len()), 0);
|
|
||||||
assert_eq!(getentropy(buf2.as_mut_ptr() as *mut libc::c_void, buf2.len()), -1);
|
|
||||||
assert_eq!(std::io::Error::last_os_error().raw_os_error().unwrap(), libc::EIO);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,41 +0,0 @@
|
|||||||
//@only-target-linux
|
|
||||||
//@compile-flags: -Zmiri-disable-isolation
|
|
||||||
|
|
||||||
use std::ptr;
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
let mut buf = [0u8; 5];
|
|
||||||
unsafe {
|
|
||||||
assert_eq!(
|
|
||||||
libc::syscall(
|
|
||||||
libc::SYS_getrandom,
|
|
||||||
ptr::null_mut::<libc::c_void>(),
|
|
||||||
0 as libc::size_t,
|
|
||||||
0 as libc::c_uint,
|
|
||||||
),
|
|
||||||
0,
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
libc::syscall(
|
|
||||||
libc::SYS_getrandom,
|
|
||||||
buf.as_mut_ptr() as *mut libc::c_void,
|
|
||||||
5 as libc::size_t,
|
|
||||||
0 as libc::c_uint,
|
|
||||||
),
|
|
||||||
5,
|
|
||||||
);
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
libc::getrandom(ptr::null_mut::<libc::c_void>(), 0 as libc::size_t, 0 as libc::c_uint),
|
|
||||||
0,
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
libc::getrandom(
|
|
||||||
buf.as_mut_ptr() as *mut libc::c_void,
|
|
||||||
5 as libc::size_t,
|
|
||||||
0 as libc::c_uint,
|
|
||||||
),
|
|
||||||
5,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,9 +1,29 @@
|
|||||||
//@ignore-target-windows: no libc
|
//@ignore-target-windows: no libc
|
||||||
//@ignore-target-apple: no getrandom
|
//@revisions: isolation no_isolation
|
||||||
|
//@[no_isolation]compile-flags: -Zmiri-disable-isolation
|
||||||
use std::ptr;
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
test_getentropy();
|
||||||
|
#[cfg(not(target_os = "macos"))]
|
||||||
|
test_getrandom();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_getentropy() {
|
||||||
|
use libc::getentropy;
|
||||||
|
|
||||||
|
let mut buf1 = [0u8; 256];
|
||||||
|
let mut buf2 = [0u8; 257];
|
||||||
|
unsafe {
|
||||||
|
assert_eq!(getentropy(buf1.as_mut_ptr() as *mut libc::c_void, buf1.len()), 0);
|
||||||
|
assert_eq!(getentropy(buf2.as_mut_ptr() as *mut libc::c_void, buf2.len()), -1);
|
||||||
|
assert_eq!(std::io::Error::last_os_error().raw_os_error().unwrap(), libc::EIO);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "macos"))]
|
||||||
|
fn test_getrandom() {
|
||||||
|
use std::ptr;
|
||||||
|
|
||||||
let mut buf = [0u8; 5];
|
let mut buf = [0u8; 5];
|
||||||
unsafe {
|
unsafe {
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
Loading…
Reference in New Issue
Block a user