Fix a bug caused by #16592 (#16624)

#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:
Leonard Hecker
2024-01-31 01:16:24 +01:00
committed by Dustin L. Howett
parent 8ac494b8c1
commit 78de1147e9

View File

@@ -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;