Recommit "[lldb] Fix TestSettings.test_pass_host_env_vars on windows"

This patch was reverted because it introduced a failure in
TestHelloWorld.py. The reason for that was running "ls" shell command
failed as it was evaluated in an environment with an empty path. This
has now been fixed with D77123, which ensures that all shell commands
inherit the host environment, so this patch should be safe to recommit.

The original commit message was:

A defensive check in ProcessLauncherWindows meant that we would never
attempt to launch a process with a completely empty environment -- the
host environment would be used instead. Instead, I make the function add
an extra null wchar_t at the end of an empty environment. The
documentation on this is a bit fuzzy, but it seems to be what is needed
to make windows accept these kinds of environments.

Reviewers: amccarth, friss

Differential Revision: https://reviews.llvm.org/D76835
This commit is contained in:
Pavel Labath 2020-03-25 13:39:05 +01:00
parent 8cc6f5beb8
commit 62be83463a
2 changed files with 7 additions and 7 deletions

View File

@ -23,10 +23,9 @@ using namespace lldb_private;
namespace {
void CreateEnvironmentBuffer(const Environment &env,
std::vector<char> &buffer) {
if (env.size() == 0)
return;
// Environment buffer is a null terminated list of null terminated strings
// The buffer is a list of null-terminated UTF-16 strings, followed by an
// extra L'\0' (two bytes of 0). An empty environment must have one
// empty string, followed by an extra L'\0'.
for (const auto &KV : env) {
std::wstring warg;
if (llvm::ConvertUTF8toWide(Environment::compose(KV), warg)) {
@ -38,6 +37,9 @@ void CreateEnvironmentBuffer(const Environment &env,
// One null wchar_t (to end the block) is two null bytes
buffer.push_back(0);
buffer.push_back(0);
// Insert extra two bytes, just in case the environment was empty.
buffer.push_back(0);
buffer.push_back(0);
}
bool GetFlattenedWindowsCommandString(Args args, std::string &command) {
@ -94,8 +96,7 @@ ProcessLauncherWindows::LaunchProcess(const ProcessLaunchInfo &launch_info,
LPVOID env_block = nullptr;
::CreateEnvironmentBuffer(launch_info.GetEnvironment(), environment);
if (!environment.empty())
env_block = environment.data();
env_block = environment.data();
executable = launch_info.GetExecutableFile().GetPath();
GetFlattenedWindowsCommandString(launch_info.GetArguments(), commandLine);

View File

@ -286,7 +286,6 @@ class SettingsCommandTestCase(TestBase):
"Environment variable 'MY_ENV_VAR' successfully passed."])
@skipIfRemote # it doesn't make sense to send host env to remote target
@skipIf(oslist=["windows"])
def test_pass_host_env_vars(self):
"""Test that the host env vars are passed to the launched process."""
self.build()