fix calling pipe, pipe2, socketpair with a pointer-to-array

This commit is contained in:
Ralf Jung 2024-08-24 09:58:16 +02:00
parent 8b10bda1e4
commit 7f968ba98d
2 changed files with 12 additions and 1 deletions

View file

@ -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,

View file

@ -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);
}