Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 046451d

Browse files
committed
Throw ub error when invoking non-vararg shim with vararg import
1 parent abe6846 commit 046451d

File tree

4 files changed

+36
-2
lines changed

4 files changed

+36
-2
lines changed

src/tools/miri/src/helpers.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -999,6 +999,11 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
999999
&'a [OpTy<'tcx>; N]: TryFrom<&'a [OpTy<'tcx>]>,
10001000
{
10011001
self.check_abi_and_shim_symbol_clash(abi, exp_abi, link_name)?;
1002+
if abi.c_variadic {
1003+
throw_ub_format!(
1004+
"calling a non-variadic function with a variadic caller-side signature"
1005+
);
1006+
}
10021007
check_arg_count(args)
10031008
}
10041009

src/tools/miri/src/shims/unix/linux/foreign_items.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
133133
this.write_scalar(ptr, dest)?;
134134
}
135135
"mremap" => {
136-
let [old_address, old_size, new_size, flags] =
137-
this.check_shim(abi, Conv::C, link_name, args)?;
136+
let ([old_address, old_size, new_size, flags], _) =
137+
this.check_shim_variadic(abi, Conv::C, link_name, args)?;
138138
let ptr = this.mremap(old_address, old_size, new_size, flags)?;
139139
this.write_scalar(ptr, dest)?;
140140
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//@ignore-target: windows # No libc pipe on Windows
2+
3+
// Declare a non-variadic function as variadic.
4+
extern "C" {
5+
fn pipe(fds: *mut std::ffi::c_int, ...) -> std::ffi::c_int;
6+
}
7+
8+
// Test the error caused by invoking non-vararg shim with a vararg import.
9+
fn main() {
10+
let mut fds = [-1, -1];
11+
let res = unsafe { pipe(fds.as_mut_ptr()) };
12+
//~^ ERROR: calling a non-variadic function with a variadic caller-side signature
13+
assert_eq!(res, 0);
14+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
error: Undefined Behavior: calling a non-variadic function with a variadic caller-side signature
2+
--> tests/fail/shims/vararg_caller_signature_mismatch.rs:LL:CC
3+
|
4+
LL | let res = unsafe { pipe(fds.as_mut_ptr()) };
5+
| ^^^^^^^^^^^^^^^^^^^^^^ calling a non-variadic function with a variadic caller-side signature
6+
|
7+
= help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
8+
= help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
9+
= note: BACKTRACE:
10+
= note: inside `main` at tests/fail/shims/vararg_caller_signature_mismatch.rs:LL:CC
11+
12+
note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace
13+
14+
error: aborting due to 1 previous error
15+

0 commit comments

Comments
 (0)