Skip to content

Commit

Permalink
Fix a bug caused by #16592 (#16624)
Browse files Browse the repository at this point in the history
#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 ✅
  • Loading branch information
lhecker authored Jan 31, 2024
1 parent ce30e7c commit c669afe
Showing 1 changed file with 17 additions and 1 deletion.
18 changes: 17 additions & 1 deletion src/cascadia/WindowsTerminal/WindowEmperor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit c669afe

Please sign in to comment.