From 3c03d82c8489e0f408daa052760e5db651145ca2 Mon Sep 17 00:00:00 2001 From: beepster4096 <19316085+beepster4096@users.noreply.github.com> Date: Sun, 18 Jan 2026 14:18:12 -0800 Subject: [PATCH 1/2] error on DuplicateHandle of pseudo handle --- src/tools/miri/src/shims/windows/handle.rs | 6 +++++- .../miri/tests/fail-dep/concurrency/windows_join_main.rs | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/tools/miri/src/shims/windows/handle.rs b/src/tools/miri/src/shims/windows/handle.rs index 92d6321bed1f..b0d29bdd6f27 100644 --- a/src/tools/miri/src/shims/windows/handle.rs +++ b/src/tools/miri/src/shims/windows/handle.rs @@ -314,7 +314,11 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> { "`DuplicateHandle` called on a thread handle, which is unsupported" ); } - Handle::Pseudo(pseudo) => Handle::Pseudo(pseudo), + Handle::Pseudo(_) => { + throw_unsup_format!( + "`DuplicateHandle` called on a pseudo handle, which is unsupported" + ); + } Handle::Null | Handle::Invalid => this.invalid_handle("DuplicateHandle")?, }; diff --git a/src/tools/miri/tests/fail-dep/concurrency/windows_join_main.rs b/src/tools/miri/tests/fail-dep/concurrency/windows_join_main.rs index a71778b1d0d4..8c085384a688 100644 --- a/src/tools/miri/tests/fail-dep/concurrency/windows_join_main.rs +++ b/src/tools/miri/tests/fail-dep/concurrency/windows_join_main.rs @@ -12,7 +12,7 @@ use windows_sys::Win32::System::Threading::{INFINITE, WaitForSingleObject}; // XXX HACK: This is how miri represents the handle for thread 0. // This value can be "legitimately" obtained by using `GetCurrentThread` with `DuplicateHandle` -// but miri does not implement `DuplicateHandle` yet. (FIXME: it does now.) +// but miri does not implement `DuplicateHandle` for pseudo handles yet. const MAIN_THREAD: HANDLE = (2i32 << 29) as HANDLE; fn main() { From 7a937ae2395160fc74ca0c3f596f769ffe64ff40 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sat, 24 Jan 2026 11:10:48 +0100 Subject: [PATCH 2/2] 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 +