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 b3f41626b4)
Service-Card-Id: PVTI_lADOAF3p4s4AmhmszgS25_o
Service-Version: 1.21
This commit is contained in:
Leonard Hecker 2024-08-22 18:32:11 +02:00 committed by Dustin Howett
parent 84a33afb8c
commit 6b380cb7e0
1 changed files with 39 additions and 44 deletions

View File

@ -93,7 +93,7 @@ static bool _HandleIsValid(HANDLE h) noexcept
return (h != INVALID_HANDLE_VALUE) && (h != nullptr); return (h != INVALID_HANDLE_VALUE) && (h != nullptr);
} }
HRESULT _CreatePseudoConsole(const HANDLE hToken, HRESULT _CreatePseudoConsole(HANDLE hToken,
const COORD size, const COORD size,
const HANDLE hInput, const HANDLE hInput,
const HANDLE hOutput, const HANDLE hOutput,
@ -109,6 +109,12 @@ HRESULT _CreatePseudoConsole(const HANDLE hToken,
return E_INVALIDARG; return E_INVALIDARG;
} }
// CreateProcessAsUserW expects the token to be either valid or null.
if (hToken == INVALID_HANDLE_VALUE)
{
hToken = nullptr;
}
wil::unique_handle serverHandle; wil::unique_handle serverHandle;
RETURN_IF_NTSTATUS_FAILED(CreateServerHandle(serverHandle.addressof(), TRUE)); 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(CreatePipe(signalPipeConhostSide.addressof(), signalPipeOurSide.addressof(), &sa, 0));
RETURN_IF_WIN32_BOOL_FALSE(SetHandleInformation(signalPipeConhostSide.get(), HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT)); 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 bInheritCursor = (dwFlags & PSEUDOCONSOLE_INHERIT_CURSOR) == PSEUDOCONSOLE_INHERIT_CURSOR;
const BOOL bResizeQuirk = (dwFlags & PSEUDOCONSOLE_RESIZE_QUIRK) == PSEUDOCONSOLE_RESIZE_QUIRK; const BOOL bResizeQuirk = (dwFlags & PSEUDOCONSOLE_RESIZE_QUIRK) == PSEUDOCONSOLE_RESIZE_QUIRK;
swprintf_s(cmd,
MAX_PATH, const auto conhostPath = _ConsoleHostPath();
L"\"%s\" --headless %s%s--width %hd --height %hd --signal 0x%tx --server 0x%tx",
_ConsoleHostPath(), // GH4061: Ensure that the path to executable in the format is escaped so C:\Program.exe cannot collide with C:\Program Files
bInheritCursor ? L"--inheritcursor " : L"", // This is plenty of space to hold the formatted string
bResizeQuirk ? L"--resizeQuirk " : L"", wil::unique_process_heap_string cmd;
size.X, RETURN_IF_FAILED(wil::str_printf_nothrow(
size.Y, cmd,
std::bit_cast<uintptr_t>(signalPipeConhostSide.get()), L"\"%s\" --headless %s%s--width %hd --height %hd --signal 0x%tx --server 0x%tx",
std::bit_cast<uintptr_t>(serverHandle.get())); conhostPath,
bInheritCursor ? L"--inheritcursor " : L"",
bResizeQuirk ? L"--resizeQuirk " : L"",
size.X,
size.Y,
std::bit_cast<uintptr_t>(signalPipeConhostSide.get()),
std::bit_cast<uintptr_t>(serverHandle.get())));
STARTUPINFOEXW siEx{ 0 }; STARTUPINFOEXW siEx{ 0 };
siEx.StartupInfo.cb = sizeof(STARTUPINFOEXW); siEx.StartupInfo.cb = sizeof(STARTUPINFOEXW);
@ -188,7 +197,8 @@ HRESULT _CreatePseudoConsole(const HANDLE hToken,
nullptr, nullptr,
nullptr)); nullptr));
wil::unique_process_information pi; wil::unique_process_information pi;
{ // wow64 disabled filesystem redirection scope {
// wow64 disabled filesystem redirection scope
#if defined(BUILD_WOW6432) #if defined(BUILD_WOW6432)
PVOID RedirectionFlag; PVOID RedirectionFlag;
RETURN_IF_NTSTATUS_FAILED(RtlWow64EnableFsRedirectionEx( RETURN_IF_NTSTATUS_FAILED(RtlWow64EnableFsRedirectionEx(
@ -198,35 +208,20 @@ HRESULT _CreatePseudoConsole(const HANDLE hToken,
RtlWow64EnableFsRedirectionEx(RedirectionFlag, &RedirectionFlag); RtlWow64EnableFsRedirectionEx(RedirectionFlag, &RedirectionFlag);
}); });
#endif #endif
if (hToken == INVALID_HANDLE_VALUE || hToken == nullptr)
{ // Call create process
// Call create process RETURN_IF_WIN32_BOOL_FALSE(CreateProcessAsUserW(
RETURN_IF_WIN32_BOOL_FALSE(CreateProcessW(_ConsoleHostPath(), hToken,
cmd, conhostPath,
nullptr, cmd.get(),
nullptr, nullptr,
TRUE, nullptr,
EXTENDED_STARTUPINFO_PRESENT, TRUE,
nullptr, EXTENDED_STARTUPINFO_PRESENT,
nullptr, nullptr,
&siEx.StartupInfo, nullptr,
pi.addressof())); &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()));
}
} }
pPty->hSignal = signalPipeOurSide.release(); pPty->hSignal = signalPipeOurSide.release();