Fix wslsettings crash when invoked from wslservice (#13089)

Blue committed Jun 11, 2025 at 15:06 UTC 5d20b44bc60a76b3531455f8710534301ab6fd97
2 files changed +9 -2
src/windows/common/helpers.cpp
+7 -2
@@ -92,8 +92,7 @@ public:
92 [[nodiscard]] wil::unique_handle Launch(_In_opt_ HANDLE UserToken, _In_ bool HideWindow, _In_ bool CreateNoWindow = false) const
93 {
94 // If a user token was provided, create an environment block from the token.
95 - using unique_environment_block = wil::unique_any<LPVOID, decltype(&DestroyEnvironmentBlock), DestroyEnvironmentBlock>;
96 - unique_environment_block environmentBlock{nullptr};
95 + wsl::windows::common::helpers::unique_environment_block environmentBlock{nullptr};
96 if (ARGUMENT_PRESENT(UserToken))
97 {
98 THROW_LAST_ERROR_IF(!CreateEnvironmentBlock(&environmentBlock, UserToken, false));
@@ -572,6 +571,12 @@ void wsl::windows::common::helpers::LaunchWslSettingsOOBE(_In_ HANDLE UserToken)
571 wsl::windows::common::SubProcess process(wslSettingsExePath.c_str(), commandLine);
572 process.SetToken(UserToken);
573 process.SetShowWindow(SW_SHOW);
574 +
575 + wsl::windows::common::helpers::unique_environment_block environmentBlock{nullptr};
576 + THROW_LAST_ERROR_IF(!CreateEnvironmentBlock(&environmentBlock, UserToken, false));
577 +
578 + process.SetEnvironment(environmentBlock.get());
579 +
580 process.Start();
581 }
582
src/windows/common/helpers.hpp
+2
@@ -92,6 +92,8 @@ struct GuidLess
92
93 typedef wil::unique_any_handle_null<decltype(&::ClosePseudoConsole), ::ClosePseudoConsole> unique_pseudo_console;
94
95 +using unique_environment_block = wil::unique_any<LPVOID, decltype(&DestroyEnvironmentBlock), DestroyEnvironmentBlock>;
96 +
97 inline void DeleteProcThreadAttributeList(_In_ PPROC_THREAD_ATTRIBUTE_LIST AttributeList)
98 {
99 ::DeleteProcThreadAttributeList(AttributeList);