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);