From 7a937ae2395160fc74ca0c3f596f769ffe64ff40 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sat, 24 Jan 2026 11:10:48 +0100 Subject: [PATCH] add test for DuplicateHandle on a pseudo handle --- .../fail-dep/win/duplicate-pseudo-handle.rs | 22 +++++++++++++++++++ .../win/duplicate-pseudo-handle.stderr | 12 ++++++++++ 2 files changed, 34 insertions(+) create mode 100644 src/tools/miri/tests/fail-dep/win/duplicate-pseudo-handle.rs create mode 100644 src/tools/miri/tests/fail-dep/win/duplicate-pseudo-handle.stderr diff --git a/src/tools/miri/tests/fail-dep/win/duplicate-pseudo-handle.rs b/src/tools/miri/tests/fail-dep/win/duplicate-pseudo-handle.rs new file mode 100644 index 000000000000..c69ea419f7d2 --- /dev/null +++ b/src/tools/miri/tests/fail-dep/win/duplicate-pseudo-handle.rs @@ -0,0 +1,22 @@ +//@only-target: windows # Uses win32 api functions +use windows_sys::Win32::Foundation::{CloseHandle, DUPLICATE_SAME_ACCESS, DuplicateHandle}; +use windows_sys::Win32::System::Threading::{GetCurrentProcess, GetCurrentThread}; + +fn main() { + unsafe { + let cur_proc = GetCurrentProcess(); + + let pseudo = GetCurrentThread(); + let mut out = std::mem::zeroed(); + let res = + DuplicateHandle(cur_proc, pseudo, cur_proc, &mut out, 0, 0, DUPLICATE_SAME_ACCESS); + //~^ERROR: pseudo handle + assert!(res != 0); + assert!(out.addr() != 0); + // Since the original handle was a pseudo handle, we must return something different. + assert!(out != pseudo); + // And closing it should work (which it does not for a pseudo handle). + let res = CloseHandle(out); + assert!(res != 0); + } +} diff --git a/src/tools/miri/tests/fail-dep/win/duplicate-pseudo-handle.stderr b/src/tools/miri/tests/fail-dep/win/duplicate-pseudo-handle.stderr new file mode 100644 index 000000000000..bbab2af67781 --- /dev/null +++ b/src/tools/miri/tests/fail-dep/win/duplicate-pseudo-handle.stderr @@ -0,0 +1,12 @@ +error: unsupported operation: `DuplicateHandle` called on a pseudo handle, which is unsupported + --> tests/fail-dep/win/duplicate-pseudo-handle.rs:LL:CC + | +LL | DuplicateHandle(cur_proc, pseudo, cur_proc, &mut out, 0, 0, DUPLICATE_SAME_ACCESS); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unsupported operation occurred here + | + = help: this is likely not a bug in the program; it indicates that the program performed an operation that Miri does not support + +note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace + +error: aborting due to 1 previous error +