Fix ExecuteAndWait with empty environment on Windows (#158719)
CreateProcessW requires that the environemnt block to be always double
null-terminated even with an empty environemnt.
https://learn.microsoft.com/en-us/windows/win32/procthread/environment-variables
The attached test fails this way without the fix.
C:\Users\hiroshi\upstream\llvm-project\llvm\unittests\Support\ProgramTest.cpp(697):
error: Value of: ExecutionFailed
Actual: true
Expected: false
Couldn't execute program
'C:\Users\hiroshi\upstream\llvm-project\build\unittests\Support\SupportTests.exe':
The parameter is incorrect. (0x57)
diff --git a/llvm/lib/Support/Windows/Program.inc b/llvm/lib/Support/Windows/Program.inc
index 799af55..d8d2e18 100644
--- a/llvm/lib/Support/Windows/Program.inc
+++ b/llvm/lib/Support/Windows/Program.inc
@@ -220,6 +220,10 @@
llvm::append_range(EnvBlock, EnvString);
EnvBlock.push_back(0);
}
+ // If an empty environment (*Env is size zero), we need to
+ // terminate with two nulls.
+ if (Env->size() == 0)
+ EnvBlock.push_back(0);
EnvBlock.push_back(0);
}
diff --git a/llvm/unittests/Support/ProgramTest.cpp b/llvm/unittests/Support/ProgramTest.cpp
index d30bf45..eac0246 100644
--- a/llvm/unittests/Support/ProgramTest.cpp
+++ b/llvm/unittests/Support/ProgramTest.cpp
@@ -680,4 +680,22 @@
ASSERT_EQ(0, RetCode);
}
+TEST_F(ProgramEnvTest, TestExecuteEmptyEnvironment) {
+ using namespace llvm::sys;
+
+ std::string Executable =
+ sys::fs::getMainExecutable(TestMainArgv0, &ProgramTestStringArg1);
+ StringRef argv[] = {
+ Executable,
+ "--gtest_filter=" // A null invocation to avoid infinite recursion
+ };
+
+ std::string Error;
+ bool ExecutionFailed;
+ int RetCode = ExecuteAndWait(Executable, argv, ArrayRef<StringRef>{}, {}, 0,
+ 0, &Error, &ExecutionFailed);
+ EXPECT_FALSE(ExecutionFailed) << Error;
+ ASSERT_EQ(0, RetCode);
+}
+
} // end anonymous namespace