diff options
| author | Ralf Jung <post@ralfj.de> | 2024-08-24 09:58:16 +0200 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2024-08-24 09:58:16 +0200 |
| commit | 7f968ba98d853f29042c8e917d2d8047043551f8 (patch) | |
| tree | 857c146f61fcb62dde6679df55f2eae5e83bbb85 | |
| parent | 8b10bda1e497df32cffaec1cdbc1e818eb70ba3b (diff) | |
| download | rust-7f968ba98d853f29042c8e917d2d8047043551f8.tar.gz rust-7f968ba98d853f29042c8e917d2d8047043551f8.zip | |
fix calling pipe, pipe2, socketpair with a pointer-to-array
| -rw-r--r-- | src/tools/miri/src/shims/unix/unnamed_socket.rs | 2 | ||||
| -rw-r--r-- | src/tools/miri/tests/pass-dep/libc/libc-pipe.rs | 11 |
2 files changed, 12 insertions, 1 deletions
diff --git a/src/tools/miri/src/shims/unix/unnamed_socket.rs b/src/tools/miri/src/shims/unix/unnamed_socket.rs index 745f27398d0..127aef29244 100644 --- a/src/tools/miri/src/shims/unix/unnamed_socket.rs +++ b/src/tools/miri/src/shims/unix/unnamed_socket.rs @@ -339,7 +339,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> { ) -> InterpResult<'tcx, Scalar> { let this = self.eval_context_mut(); - let pipefd = this.deref_pointer(pipefd)?; + let pipefd = this.deref_pointer_as(pipefd, this.machine.layouts.i32)?; let flags = match flags { Some(flags) => this.read_scalar(flags)?.to_i32()?, None => 0, diff --git a/src/tools/miri/tests/pass-dep/libc/libc-pipe.rs b/src/tools/miri/tests/pass-dep/libc/libc-pipe.rs index 5dff612bd89..90dbd888392 100644 --- a/src/tools/miri/tests/pass-dep/libc/libc-pipe.rs +++ b/src/tools/miri/tests/pass-dep/libc/libc-pipe.rs @@ -6,6 +6,7 @@ fn main() { test_pipe(); test_pipe_threaded(); test_race(); + test_pipe_array(); } fn test_pipe() { @@ -97,3 +98,13 @@ fn test_race() { thread::yield_now(); thread1.join().unwrap(); } + +fn test_pipe_array() { + // Declare `pipe` to take an array rather than a `*mut i32`. + extern "C" { + fn pipe(pipefd: &mut [i32; 2]) -> i32; + } + + let mut fds: [i32; 2] = [0; 2]; + assert_eq!(unsafe { pipe(&mut fds) }, 0); +} |
