From 7e7f1656ca361b4d3e6ee4d1f2b1dfad6fe08a64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denizhan=20Dak=C4=B1l=C4=B1r?= Date: Sat, 10 Jan 2026 21:11:13 +0300 Subject: [PATCH] fix: add Win32_Storage_FileSystem feature and improve handle closing logic (#17374) ## Summary fix https://github.com/astral-sh/uv/issues/17174 mentioned the invalid issues here: results of diagnostics: before: ``` --- TRAMPOLINE DIAGNOSTICS: STARTUP --- STDIN: Handle=184 -> Console Mode: 503 STDOUT: Handle=536 -> Console Mode: 7 STDERR: Handle=540 -> Console Mode: 7 ------------------------------------------- --- TRAMPOLINE DIAGNOSTICS: AFTER CLOSE_HANDLES --- STDIN: INVALID STDOUT: INVALID STDERR: Handle=540 -> Console Mode: 7 ``` after: ``` --- TRAMPOLINE DIAGNOSTICS: STARTUP --- STDIN: Handle=716 -> Console Mode: 503 STDOUT: Handle=580 -> Console Mode: 7 STDERR: Handle=604 -> Console Mode: 7 ------------------------------------------- --- TRAMPOLINE DIAGNOSTICS: AFTER CLOSE_HANDLES --- STDIN: Handle=716 -> Console Mode: 503 STDOUT: Handle=580 -> Console Mode: 7 STDERR: Handle=604 -> Console Mode: 7 ``` the problem was we were closing the handlers whatever they were from pipes (byte streams) or consoles, this will make sure we close only the handlers from pipes by using `FILE_TYPE_PIPE` ## Test Plan completely manual by adding debug statements and running a simple script to open the pdb. --- crates/uv-trampoline/Cargo.toml | 1 + crates/uv-trampoline/src/bounce.rs | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/crates/uv-trampoline/Cargo.toml b/crates/uv-trampoline/Cargo.toml index 6a16fa8f9..8f0a70579 100644 --- a/crates/uv-trampoline/Cargo.toml +++ b/crates/uv-trampoline/Cargo.toml @@ -47,6 +47,7 @@ windows = { version = "0.61.0", features = [ "Win32_System_LibraryLoader", "Win32_System_Threading", "Win32_UI_WindowsAndMessaging", + "Win32_Storage_FileSystem", ] } ufmt-write = "0.1.0" ufmt = { version = "0.2.0", features = ["std"] } diff --git a/crates/uv-trampoline/src/bounce.rs b/crates/uv-trampoline/src/bounce.rs index c1fb236eb..23ee6b8f0 100644 --- a/crates/uv-trampoline/src/bounce.rs +++ b/crates/uv-trampoline/src/bounce.rs @@ -8,6 +8,7 @@ use windows::Win32::{ Foundation::{ CloseHandle, HANDLE, HANDLE_FLAG_INHERIT, INVALID_HANDLE_VALUE, SetHandleInformation, TRUE, }, + Storage::FileSystem::{FILE_TYPE_PIPE, GetFileType}, System::Console::{ GetStdHandle, STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, SetConsoleCtrlHandler, SetStdHandle, }, @@ -345,6 +346,9 @@ fn close_handles(si: &STARTUPINFOA) { // Unlike cleanup_standard_io(), we don't close STD_ERROR_HANDLE to retain warn! for std_handle in [STD_INPUT_HANDLE, STD_OUTPUT_HANDLE] { if let Ok(handle) = unsafe { GetStdHandle(std_handle) } { + if handle.is_invalid() || unsafe { GetFileType(handle) } != FILE_TYPE_PIPE { + continue; + } unsafe { CloseHandle(handle) }.unwrap_or_else(|_| { warn!("Failed to close standard device handle {}", handle.0 as u32); });