From 6b380cb7e0519a2464b87eda02b609284ee1cab4 Mon Sep 17 00:00:00 2001 From: Leonard Hecker Date: Thu, 22 Aug 2024 18:32:11 +0200 Subject: [PATCH] ConPTY: Raise the MAX_PATH limit (#17768) Swapped the `swprintf_s` with no failure checks against a `str_printf_nothrow` with checks. I also deduplicated the `CreateProcess` calls since they're mostly identical. Closes #16860 (cherry picked from commit b3f41626b4d212da8ca7c08077b12c289f918c86) Service-Card-Id: PVTI_lADOAF3p4s4AmhmszgS25_o Service-Version: 1.21 --- src/winconpty/winconpty.cpp | 83 +++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 44 deletions(-) diff --git a/src/winconpty/winconpty.cpp b/src/winconpty/winconpty.cpp index 4db646a283..4258b9fabd 100644 --- a/src/winconpty/winconpty.cpp +++ b/src/winconpty/winconpty.cpp @@ -93,7 +93,7 @@ static bool _HandleIsValid(HANDLE h) noexcept return (h != INVALID_HANDLE_VALUE) && (h != nullptr); } -HRESULT _CreatePseudoConsole(const HANDLE hToken, +HRESULT _CreatePseudoConsole(HANDLE hToken, const COORD size, const HANDLE hInput, const HANDLE hOutput, @@ -109,6 +109,12 @@ HRESULT _CreatePseudoConsole(const HANDLE hToken, return E_INVALIDARG; } + // CreateProcessAsUserW expects the token to be either valid or null. + if (hToken == INVALID_HANDLE_VALUE) + { + hToken = nullptr; + } + wil::unique_handle serverHandle; RETURN_IF_NTSTATUS_FAILED(CreateServerHandle(serverHandle.addressof(), TRUE)); @@ -132,21 +138,24 @@ HRESULT _CreatePseudoConsole(const HANDLE hToken, RETURN_IF_WIN32_BOOL_FALSE(CreatePipe(signalPipeConhostSide.addressof(), signalPipeOurSide.addressof(), &sa, 0)); RETURN_IF_WIN32_BOOL_FALSE(SetHandleInformation(signalPipeConhostSide.get(), HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT)); - // GH4061: Ensure that the path to executable in the format is escaped so C:\Program.exe cannot collide with C:\Program Files - // This is plenty of space to hold the formatted string - wchar_t cmd[MAX_PATH]{}; const BOOL bInheritCursor = (dwFlags & PSEUDOCONSOLE_INHERIT_CURSOR) == PSEUDOCONSOLE_INHERIT_CURSOR; const BOOL bResizeQuirk = (dwFlags & PSEUDOCONSOLE_RESIZE_QUIRK) == PSEUDOCONSOLE_RESIZE_QUIRK; - swprintf_s(cmd, - MAX_PATH, - L"\"%s\" --headless %s%s--width %hd --height %hd --signal 0x%tx --server 0x%tx", - _ConsoleHostPath(), - bInheritCursor ? L"--inheritcursor " : L"", - bResizeQuirk ? L"--resizeQuirk " : L"", - size.X, - size.Y, - std::bit_cast(signalPipeConhostSide.get()), - std::bit_cast(serverHandle.get())); + + const auto conhostPath = _ConsoleHostPath(); + + // GH4061: Ensure that the path to executable in the format is escaped so C:\Program.exe cannot collide with C:\Program Files + // This is plenty of space to hold the formatted string + wil::unique_process_heap_string cmd; + RETURN_IF_FAILED(wil::str_printf_nothrow( + cmd, + L"\"%s\" --headless %s%s--width %hd --height %hd --signal 0x%tx --server 0x%tx", + conhostPath, + bInheritCursor ? L"--inheritcursor " : L"", + bResizeQuirk ? L"--resizeQuirk " : L"", + size.X, + size.Y, + std::bit_cast(signalPipeConhostSide.get()), + std::bit_cast(serverHandle.get()))); STARTUPINFOEXW siEx{ 0 }; siEx.StartupInfo.cb = sizeof(STARTUPINFOEXW); @@ -188,7 +197,8 @@ HRESULT _CreatePseudoConsole(const HANDLE hToken, nullptr, nullptr)); wil::unique_process_information pi; - { // wow64 disabled filesystem redirection scope + { + // wow64 disabled filesystem redirection scope #if defined(BUILD_WOW6432) PVOID RedirectionFlag; RETURN_IF_NTSTATUS_FAILED(RtlWow64EnableFsRedirectionEx( @@ -198,35 +208,20 @@ HRESULT _CreatePseudoConsole(const HANDLE hToken, RtlWow64EnableFsRedirectionEx(RedirectionFlag, &RedirectionFlag); }); #endif - if (hToken == INVALID_HANDLE_VALUE || hToken == nullptr) - { - // Call create process - RETURN_IF_WIN32_BOOL_FALSE(CreateProcessW(_ConsoleHostPath(), - cmd, - nullptr, - nullptr, - TRUE, - EXTENDED_STARTUPINFO_PRESENT, - nullptr, - nullptr, - &siEx.StartupInfo, - pi.addressof())); - } - else - { - // Call create process - RETURN_IF_WIN32_BOOL_FALSE(CreateProcessAsUserW(hToken, - _ConsoleHostPath(), - cmd, - nullptr, - nullptr, - TRUE, - EXTENDED_STARTUPINFO_PRESENT, - nullptr, - nullptr, - &siEx.StartupInfo, - pi.addressof())); - } + + // Call create process + RETURN_IF_WIN32_BOOL_FALSE(CreateProcessAsUserW( + hToken, + conhostPath, + cmd.get(), + nullptr, + nullptr, + TRUE, + EXTENDED_STARTUPINFO_PRESENT, + nullptr, + nullptr, + &siEx.StartupInfo, + pi.addressof())); } pPty->hSignal = signalPipeOurSide.release();