This commit is contained in:
The Miri Conjob Bot 2023-10-17 05:07:13 +00:00
parent 2ca415c1c2
commit d6f52bff27
11 changed files with 14 additions and 49 deletions

View File

@ -206,11 +206,7 @@ fn tb_reborrow(
// Make sure the new permission makes sense as the initial permission of a fresh tag. // Make sure the new permission makes sense as the initial permission of a fresh tag.
assert!(new_perm.initial_state.is_initial()); assert!(new_perm.initial_state.is_initial());
// Ensure we bail out if the pointer goes out-of-bounds (see miri#1050). // Ensure we bail out if the pointer goes out-of-bounds (see miri#1050).
this.check_ptr_access( this.check_ptr_access(place.ptr(), ptr_size, CheckInAllocMsg::InboundsTest)?;
place.ptr(),
ptr_size,
CheckInAllocMsg::InboundsTest,
)?;
// It is crucial that this gets called on all code paths, to ensure we track tag creation. // It is crucial that this gets called on all code paths, to ensure we track tag creation.
let log_creation = |this: &MiriInterpCx<'mir, 'tcx>, let log_creation = |this: &MiriInterpCx<'mir, 'tcx>,

View File

@ -1017,10 +1017,7 @@ fn atomic_access_check(&self, place: &MPlaceTy<'tcx, Provenance>) -> InterpResul
// even if the type they wrap would be less aligned (e.g. AtomicU64 on 32bit must // even if the type they wrap would be less aligned (e.g. AtomicU64 on 32bit must
// be 8-aligned). // be 8-aligned).
let align = Align::from_bytes(place.layout.size.bytes()).unwrap(); let align = Align::from_bytes(place.layout.size.bytes()).unwrap();
this.check_ptr_align( this.check_ptr_align(place.ptr(), align)?;
place.ptr(),
align,
)?;
// Ensure the allocation is mutable. Even failing (read-only) compare_exchange need mutable // Ensure the allocation is mutable. Even failing (read-only) compare_exchange need mutable
// memory on many targets (i.e., they segfault if taht memory is mapped read-only), and // memory on many targets (i.e., they segfault if taht memory is mapped read-only), and
// atomic loads can be implemented via compare_exchange on some targets. There could // atomic loads can be implemented via compare_exchange on some targets. There could

View File

@ -868,9 +868,7 @@ fn write_wide_str(
let size2 = Size::from_bytes(2); let size2 = Size::from_bytes(2);
let this = self.eval_context_mut(); let this = self.eval_context_mut();
this.check_ptr_align(ptr, Align::from_bytes(2).unwrap())?; this.check_ptr_align(ptr, Align::from_bytes(2).unwrap())?;
let mut alloc = this let mut alloc = this.get_ptr_alloc_mut(ptr, size2 * string_length)?.unwrap(); // not a ZST, so we will get a result
.get_ptr_alloc_mut(ptr, size2 * string_length)?
.unwrap(); // not a ZST, so we will get a result
for (offset, wchar) in wide_str.iter().copied().chain(iter::once(0x0000)).enumerate() { for (offset, wchar) in wide_str.iter().copied().chain(iter::once(0x0000)).enumerate() {
let offset = u64::try_from(offset).unwrap(); let offset = u64::try_from(offset).unwrap();
alloc.write_scalar(alloc_range(size2 * offset, size2), Scalar::from_u16(wchar))?; alloc.write_scalar(alloc_range(size2 * offset, size2), Scalar::from_u16(wchar))?;

View File

@ -805,12 +805,7 @@ fn emulate_foreign_item_inner(
this.ptr_get_alloc_id(ptr_dest)?; this.ptr_get_alloc_id(ptr_dest)?;
this.ptr_get_alloc_id(ptr_src)?; this.ptr_get_alloc_id(ptr_src)?;
this.mem_copy( this.mem_copy(ptr_src, ptr_dest, Size::from_bytes(n), true)?;
ptr_src,
ptr_dest,
Size::from_bytes(n),
true,
)?;
this.write_pointer(ptr_dest, dest)?; this.write_pointer(ptr_dest, dest)?;
} }
"strcpy" => { "strcpy" => {
@ -826,12 +821,7 @@ fn emulate_foreign_item_inner(
// reason to have `strcpy` destroy pointer provenance. // reason to have `strcpy` destroy pointer provenance.
// This reads at least 1 byte, so we are already enforcing that this is a valid pointer. // This reads at least 1 byte, so we are already enforcing that this is a valid pointer.
let n = this.read_c_str(ptr_src)?.len().checked_add(1).unwrap(); let n = this.read_c_str(ptr_src)?.len().checked_add(1).unwrap();
this.mem_copy( this.mem_copy(ptr_src, ptr_dest, Size::from_bytes(n), true)?;
ptr_src,
ptr_dest,
Size::from_bytes(n),
true,
)?;
this.write_pointer(ptr_dest, dest)?; this.write_pointer(ptr_dest, dest)?;
} }

View File

@ -756,11 +756,7 @@ fn read(
trace!("Reading from FD {}, size {}", fd, count); trace!("Reading from FD {}, size {}", fd, count);
// Check that the *entire* buffer is actually valid memory. // Check that the *entire* buffer is actually valid memory.
this.check_ptr_access( this.check_ptr_access(buf, Size::from_bytes(count), CheckInAllocMsg::MemoryAccessTest)?;
buf,
Size::from_bytes(count),
CheckInAllocMsg::MemoryAccessTest,
)?;
// We cap the number of read bytes to the largest value that we are able to fit in both the // We cap the number of read bytes to the largest value that we are able to fit in both the
// host's and target's `isize`. This saves us from having to handle overflows later. // host's and target's `isize`. This saves us from having to handle overflows later.
@ -809,11 +805,7 @@ fn write(
// Isolation check is done via `FileDescriptor` trait. // Isolation check is done via `FileDescriptor` trait.
// Check that the *entire* buffer is actually valid memory. // Check that the *entire* buffer is actually valid memory.
this.check_ptr_access( this.check_ptr_access(buf, Size::from_bytes(count), CheckInAllocMsg::MemoryAccessTest)?;
buf,
Size::from_bytes(count),
CheckInAllocMsg::MemoryAccessTest,
)?;
// We cap the number of written bytes to the largest value that we are able to fit in both the // We cap the number of written bytes to the largest value that we are able to fit in both the
// host's and target's `isize`. This saves us from having to handle overflows later. // host's and target's `isize`. This saves us from having to handle overflows later.

View File

@ -85,10 +85,7 @@ pub fn futex<'tcx>(
return Ok(()); return Ok(());
} }
let timeout = this.deref_pointer_as( let timeout = this.deref_pointer_as(&args[3], this.libc_ty_layout("timespec"))?;
&args[3],
this.libc_ty_layout("timespec"),
)?;
let timeout_time = if this.ptr_is_null(timeout.ptr())? { let timeout_time = if this.ptr_is_null(timeout.ptr())? {
None None
} else { } else {

View File

@ -321,8 +321,8 @@ fn WaitOnAddress(
this.atomic_fence(AtomicFenceOrd::SeqCst)?; this.atomic_fence(AtomicFenceOrd::SeqCst)?;
let layout = this.machine.layouts.uint(size).unwrap(); let layout = this.machine.layouts.uint(size).unwrap();
let futex_val = this let futex_val =
.read_scalar_atomic(&this.ptr_to_mplace(ptr, layout), AtomicReadOrd::Relaxed)?; this.read_scalar_atomic(&this.ptr_to_mplace(ptr, layout), AtomicReadOrd::Relaxed)?;
let compare_val = this.read_scalar(&this.ptr_to_mplace(compare, layout))?; let compare_val = this.read_scalar(&this.ptr_to_mplace(compare, layout))?;
if futex_val == compare_val { if futex_val == compare_val {

View File

@ -73,12 +73,7 @@ fn emulate_x86_sse3_intrinsic(
let src_ptr = this.read_pointer(src_ptr)?; let src_ptr = this.read_pointer(src_ptr)?;
let dest = dest.force_mplace(this)?; let dest = dest.force_mplace(this)?;
this.mem_copy( this.mem_copy(src_ptr, dest.ptr(), dest.layout.size, /*nonoverlapping*/ true)?;
src_ptr,
dest.ptr(),
dest.layout.size,
/*nonoverlapping*/ true,
)?;
} }
_ => return Ok(EmulateForeignItemResult::NotSupported), _ => return Ok(EmulateForeignItemResult::NotSupported),
} }

View File

@ -1,7 +1,7 @@
// Should be caught even without retagging // Should be caught even without retagging
//@compile-flags: -Zmiri-disable-stacked-borrows //@compile-flags: -Zmiri-disable-stacked-borrows
#![feature(strict_provenance)] #![feature(strict_provenance)]
use std::ptr::{addr_of_mut, self}; use std::ptr::{self, addr_of_mut};
// Deref'ing a dangling raw pointer is fine, but for a dangling box it is not. // Deref'ing a dangling raw pointer is fine, but for a dangling box it is not.
// We do this behind a pointer indirection to potentially fool validity checking. // We do this behind a pointer indirection to potentially fool validity checking.

View File

@ -1,7 +1,7 @@
// Should be caught even without retagging // Should be caught even without retagging
//@compile-flags: -Zmiri-disable-stacked-borrows //@compile-flags: -Zmiri-disable-stacked-borrows
#![feature(strict_provenance)] #![feature(strict_provenance)]
use std::ptr::{addr_of_mut, self}; use std::ptr::{self, addr_of_mut};
// Deref'ing a dangling raw pointer is fine, but for a dangling reference it is not. // Deref'ing a dangling raw pointer is fine, but for a dangling reference it is not.
// We do this behind a pointer indirection to potentially fool validity checking. // We do this behind a pointer indirection to potentially fool validity checking.

View File

@ -1,6 +1,6 @@
#![feature(strict_provenance)] #![feature(strict_provenance)]
use std::ptr::{self, addr_of};
use std::mem; use std::mem;
use std::ptr::{self, addr_of};
fn basic_raw() { fn basic_raw() {
let mut x = 12; let mut x = 12;