about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDrMeepster <19316085+DrMeepster@users.noreply.github.com>2023-06-02 16:24:41 -0700
committerDrMeepster <19316085+DrMeepster@users.noreply.github.com>2023-06-02 16:24:41 -0700
commit9d1d651d1d87777883d0b536df676ef110b44e9a (patch)
tree71a128555d01b3d8b7bf246b283782afae16f506
parent13c20f297f62b1fbc818ab76e406a0b76b66beb2 (diff)
add deref_pointer_as
-rw-r--r--src/tools/miri/src/helpers.rs14
-rw-r--r--src/tools/miri/src/shims/unix/linux/sync.rs8
2 files changed, 19 insertions, 3 deletions
diff --git a/src/tools/miri/src/helpers.rs b/src/tools/miri/src/helpers.rs
index ae5a975bb87..c19d691ede6 100644
--- a/src/tools/miri/src/helpers.rs
+++ b/src/tools/miri/src/helpers.rs
@@ -746,6 +746,20 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
         Ok(mplace)
     }
 
+    fn deref_pointer_as(
+        &self,
+        val: &ImmTy<'tcx, Provenance>,
+        layout: TyAndLayout<'tcx>,
+    ) -> InterpResult<'tcx, MPlaceTy<'tcx, Provenance>> {
+        let this = self.eval_context_ref();
+        let mut mplace = this.ref_to_mplace(val)?;
+
+        mplace.layout = layout;
+        mplace.align = layout.align.abi;
+
+        Ok(mplace)
+    }
+
     /// Calculates the MPlaceTy given the offset and layout of an access on an operand
     fn deref_operand_and_offset(
         &self,
diff --git a/src/tools/miri/src/shims/unix/linux/sync.rs b/src/tools/miri/src/shims/unix/linux/sync.rs
index e26e29362ad..873b84e3059 100644
--- a/src/tools/miri/src/shims/unix/linux/sync.rs
+++ b/src/tools/miri/src/shims/unix/linux/sync.rs
@@ -85,8 +85,11 @@ pub fn futex<'tcx>(
                 return Ok(());
             }
 
-            let timeout_op = &args[3];
-            let timeout_time = if this.ptr_is_null(this.read_pointer(timeout_op)?)? {
+            let timeout = this.deref_pointer_as(
+                &this.read_immediate(&args[3])?,
+                this.libc_ty_layout("timespec"),
+            )?;
+            let timeout_time = if this.ptr_is_null(timeout.ptr)? {
                 None
             } else {
                 let realtime = op & futex_realtime == futex_realtime;
@@ -95,7 +98,6 @@ pub fn futex<'tcx>(
                         "`futex` syscall with `op=FUTEX_WAIT` and non-null timeout with `FUTEX_CLOCK_REALTIME`",
                     )?;
                 }
-                let timeout = this.deref_operand_as(timeout_op, this.libc_ty_layout("timespec"))?;
                 let duration = match this.read_timespec(&timeout)? {
                     Some(duration) => duration,
                     None => {