From 5d20b44bc60a76b3531455f8710534301ab6fd97 Mon Sep 17 00:00:00 2001 From: Blue Date: Wed, 11 Jun 2025 15:06:04 -0700 Subject: [PATCH] Fix wslsettings crash when invoked from wslservice (#13089) --- src/windows/common/helpers.cpp | 9 +++++++-- src/windows/common/helpers.hpp | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/windows/common/helpers.cpp b/src/windows/common/helpers.cpp index ba36cea..61e57e2 100644 --- a/src/windows/common/helpers.cpp +++ b/src/windows/common/helpers.cpp @@ -92,8 +92,7 @@ public: [[nodiscard]] wil::unique_handle Launch(_In_opt_ HANDLE UserToken, _In_ bool HideWindow, _In_ bool CreateNoWindow = false) const { // If a user token was provided, create an environment block from the token. - using unique_environment_block = wil::unique_any; - unique_environment_block environmentBlock{nullptr}; + wsl::windows::common::helpers::unique_environment_block environmentBlock{nullptr}; if (ARGUMENT_PRESENT(UserToken)) { THROW_LAST_ERROR_IF(!CreateEnvironmentBlock(&environmentBlock, UserToken, false)); @@ -572,6 +571,12 @@ void wsl::windows::common::helpers::LaunchWslSettingsOOBE(_In_ HANDLE UserToken) wsl::windows::common::SubProcess process(wslSettingsExePath.c_str(), commandLine); process.SetToken(UserToken); process.SetShowWindow(SW_SHOW); + + wsl::windows::common::helpers::unique_environment_block environmentBlock{nullptr}; + THROW_LAST_ERROR_IF(!CreateEnvironmentBlock(&environmentBlock, UserToken, false)); + + process.SetEnvironment(environmentBlock.get()); + process.Start(); } diff --git a/src/windows/common/helpers.hpp b/src/windows/common/helpers.hpp index 64acada..5d3b0f0 100644 --- a/src/windows/common/helpers.hpp +++ b/src/windows/common/helpers.hpp @@ -92,6 +92,8 @@ struct GuidLess typedef wil::unique_any_handle_null unique_pseudo_console; +using unique_environment_block = wil::unique_any; + inline void DeleteProcThreadAttributeList(_In_ PPROC_THREAD_ATTRIBUTE_LIST AttributeList) { ::DeleteProcThreadAttributeList(AttributeList);