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:
parent
84a33afb8c
commit
6b380cb7e0
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue