diff options
| author | Robert Schumacher <roschuma@microsoft.com> | 2018-10-26 21:31:59 -0700 |
|---|---|---|
| committer | Robert Schumacher <roschuma@microsoft.com> | 2018-10-26 21:31:59 -0700 |
| commit | ac1dd2022a1de05ee0a813f00346b1a9546ce03a (patch) | |
| tree | ae0f44e302b493c2bee5e37ba3dcc25b0993b5d8 | |
| parent | c538d6d99668bb416153aade75ed5dd9f7b7c28d (diff) | |
| download | vcpkg-ac1dd2022a1de05ee0a813f00346b1a9546ce03a.tar.gz vcpkg-ac1dd2022a1de05ee0a813f00346b1a9546ce03a.zip | |
[vcpkg-edit] Don't launch the editor in a clean environment
| -rw-r--r-- | toolsrc/src/vcpkg/base/system.cpp | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/toolsrc/src/vcpkg/base/system.cpp b/toolsrc/src/vcpkg/base/system.cpp index d95752bba..6797111c2 100644 --- a/toolsrc/src/vcpkg/base/system.cpp +++ b/toolsrc/src/vcpkg/base/system.cpp @@ -117,10 +117,7 @@ namespace vcpkg::System } #if defined(_WIN32) - static void windows_create_clean_process(const CStringView cmd_line, - const std::unordered_map<std::string, std::string>& extra_env, - PROCESS_INFORMATION& process_info, - DWORD dwCreationFlags) noexcept + static std::wstring compute_clean_environment(const std::unordered_map<std::string, std::string>& extra_env) { static const std::string SYSTEM_ROOT = get_environment_variable("SystemRoot").value_or_exit(VCPKG_LINE_INFO); static const std::string SYSTEM_32 = SYSTEM_ROOT + R"(\system32)"; @@ -173,9 +170,6 @@ namespace vcpkg::System L"NVCUDASAMPLES_ROOT", }; - // Flush stdout before launching external process - fflush(nullptr); - std::wstring env_cstr; for (auto&& env_wstring : env_wstrings) @@ -206,10 +200,27 @@ namespace vcpkg::System env_cstr.push_back(L'\0'); } + return env_cstr; + } +#endif + +#if defined(_WIN32) + /// <param name="maybe_environment">If non-null, an environment block to use for the new process. If null, the new + /// process will inherit the current environment.</param> + static void windows_create_process(const CStringView cmd_line, + const wchar_t* maybe_environment, + DWORD dwCreationFlags, + PROCESS_INFORMATION* process_info) noexcept + { + Checks::check_exit(VCPKG_LINE_INFO, process_info != nullptr); + STARTUPINFOW startup_info; memset(&startup_info, 0, sizeof(STARTUPINFOW)); startup_info.cb = sizeof(STARTUPINFOW); + // Flush stdout before launching external process + fflush(nullptr); + // Wrapping the command in a single set of quotes causes cmd.exe to correctly execute const std::string actual_cmd_line = Strings::format(R"###(cmd.exe /c "%s")###", cmd_line); Debug::println("CreateProcessW(%s)", actual_cmd_line); @@ -219,10 +230,10 @@ namespace vcpkg::System nullptr, FALSE, IDLE_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT | dwCreationFlags, - env_cstr.data(), + (void*)maybe_environment, nullptr, &startup_info, - &process_info); + process_info); Checks::check_exit(VCPKG_LINE_INFO, succeeded, "Process creation failed with error code: %lu", GetLastError()); } @@ -236,7 +247,7 @@ namespace vcpkg::System PROCESS_INFORMATION process_info; memset(&process_info, 0, sizeof(PROCESS_INFORMATION)); - windows_create_clean_process(cmd_line, {}, process_info, DETACHED_PROCESS); + windows_create_process(cmd_line, nullptr, DETACHED_PROCESS, &process_info); CloseHandle(process_info.hThread); CloseHandle(process_info.hProcess); @@ -255,7 +266,8 @@ namespace vcpkg::System memset(&process_info, 0, sizeof(PROCESS_INFORMATION)); GlobalState::g_ctrl_c_state.transition_to_spawn_process(); - windows_create_clean_process(cmd_line, extra_env, process_info, NULL); + auto clean_env = compute_clean_environment(extra_env); + windows_create_process(cmd_line, clean_env.c_str(), NULL, &process_info); CloseHandle(process_info.hThread); |
