From 0d0cf808a31e2e7908aa650ee452b23096e7800a Mon Sep 17 00:00:00 2001 From: Blue Date: Tue, 10 Jun 2025 17:55:45 -0700 Subject: [PATCH] Fix wslsettings crash when invoked from wslservice --- 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 ba36cead..61e57e23 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 64acadaa..5d3b0f04 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);