mirror of
https://github.com/microsoft/terminal.git
synced 2025-12-25 02:01:28 -05:00
#16592 passes the return value of `GetEnvironmentStringsW` directly
to the `hstring` constructor even though the former returns a
double-null terminated string and the latter expects a regular one.
This PR fixes the issue by using a basic strlen() loop to compute
the length ourselves. It's still theoretically beneficial over
the previous code, but now it's rather bitter since the code isn't
particularly short anymore and so the biggest benefit is gone.
Closes #16623
## Validation Steps Performed
* Validated the `env` string in a debugger ✅
It's 1 character shorter than the old `til::env` string.
That's fine however, since any `HSTRING` is always null-terminated
anyways and so we get an extra null-terminator for free.
* `wt powershell` works ✅
(cherry picked from commit c669afe2a0)
Service-Card-Id: 91719861
Service-Version: 1.18
This commit is contained in:
committed by
Dustin L. Howett
parent
8ac494b8c1
commit
78de1147e9
@@ -74,7 +74,23 @@ void WindowEmperor::HandleCommandlineArgs(int nCmdShow)
|
||||
}
|
||||
}
|
||||
|
||||
const Remoting::CommandlineArgs eventArgs{ args, cwd, gsl::narrow_cast<uint32_t>(nCmdShow), GetEnvironmentStringsW() };
|
||||
// GetEnvironmentStringsW() returns a double-null terminated string.
|
||||
// The hstring(wchar_t*) constructor however only works for regular null-terminated strings.
|
||||
// Due to that we need to manually search for the terminator.
|
||||
winrt::hstring env;
|
||||
{
|
||||
const wil::unique_environstrings_ptr strings{ GetEnvironmentStringsW() };
|
||||
const auto beg = strings.get();
|
||||
auto end = beg;
|
||||
|
||||
for (; *end; end += wcsnlen(end, SIZE_T_MAX) + 1)
|
||||
{
|
||||
}
|
||||
|
||||
env = winrt::hstring{ beg, gsl::narrow<uint32_t>(end - beg) };
|
||||
}
|
||||
|
||||
const Remoting::CommandlineArgs eventArgs{ args, cwd, gsl::narrow_cast<uint32_t>(nCmdShow), std::move(env) };
|
||||
const auto isolatedMode{ _app.Logic().IsolatedMode() };
|
||||
const auto result = _manager.ProposeCommandline(eventArgs, isolatedMode);
|
||||
int exitCode = 0;
|
||||
|
||||
Reference in New Issue
Block a user