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 ✅

(cherry picked from commit c669afe)
Service-Card-Id: 91719863
Service-Version: 1.20
  • Loading branch information
lhecker authored and DHowett committed Jan 31, 2024
1 parent d5a3499 commit 29a46c3
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 29a46c3

Please sign in to comment.