Repository navigation
Avoid stop service race window during uninstall - #40625
Feng Wang (chemwolf6922) merged 3 commits into
Conversation
There was a problem hiding this comment.
Pull request overview
This PR addresses an uninstall-time race where WSLService can be reactivated (e.g., via wsl / COM activation) while MSI is trying to stop it, potentially causing the StopServices step to hang (notably when Docker Desktop is open). It adds MSI custom actions to disable the service before stopping it and re-enable it on rollback.
Changes:
- Export new MSI custom actions from
wslinstall.dll:DisableWslServiceandEnableWslService. - Implement service start-type toggling via
ChangeServiceConfigWin the installer DLL. - Sequence new deferred/rollback custom actions before
StopServicesduring full uninstall.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| src/windows/wslinstall/wslinstall.def | Exports DisableWslService / EnableWslService from wslinstall.dll. |
| src/windows/wslinstall/DllMain.cpp | Adds helper to change WSLService start type and implements the new custom actions. |
| msipackage/package.wix.in | Defines and sequences the new deferred + rollback custom actions before StopServices on uninstall. |
|
I think this looks like a good approach, Blue (@OneBlue) let's discuss. |
|
Thank you for doing this Feng Wang (@chemwolf6922). The |
|
Hi Blue (@OneBlue) I shared the log internally. |
Blue (OneBlue)
left a comment
There was a problem hiding this comment.
LGTM. It's wild that MSI doesn't do that on its own, but this change should be relatively low risk and a clear improvement.
Thank you for root causing this !
Disable service before stopping service during uninstall. (cherry picked from commit c28bd15)
* Validate NUL-termination of flexible-array Buffer in interop messages (#40402) * Validate NUL-termination of flexible-array Buffer in interop messages Use string::FromMessageBuffer<T>() instead of directly accessing the Buffer[] flexible-array member in interop message structs. FromMessageBuffer validates that a NUL terminator exists within the span bounds, preventing out-of-bounds reads when a malformed message contains no Buffer data or lacks NUL termination. Affected message handlers: - LxInitMessageQueryEnvironmentVariable (config.cpp) - LxInitMessageCreateLoginSession (config.cpp) - LxMiniInitMessageUnmount (main.cpp) Co-authored-by: Copilot <[email protected]> * Remove unused Message parameter name in WSLC_UNMOUNT handler After switching to FromMessageBuffer, the Message parameter is no longer referenced directly. Remove the name to avoid -Wunused-parameter. Co-authored-by: Copilot <[email protected]> --------- Co-authored-by: Ben Hillis <[email protected]> Co-authored-by: Copilot <[email protected]> (cherry picked from commit 909d5eb) * Bind KdRelay to loopback (#41260) Restrict the KdRelay listener to local connections. Co-authored-by: Copilot <[email protected]> Co-authored-by: Ben Hillis <[email protected]> Copilot-Session: d9d1a097-a7bc-4c1b-806b-d3778adfd23a (cherry picked from commit 5eb2138) * Update Microsoft.NETCore.App.Runtime to 10.0.11 (#41332) (cherry picked from commit 8edd976) * Fix unvalidated TerminalProfileSize during distribution import (#41495) * Fix unvalidated TerminalProfileSize when importing a distribution _ProcessImportResultMessage constructed the terminal profile string_view using the message-supplied TerminalProfileSize without validating it against the received buffer length. Use the bounds-checked two-argument span::subspan() overload (matching the existing ShortcutIconSize handling a few lines above) so an inconsistent size value throws instead of producing a string_view that runs past the end of the buffer. Co-authored-by: Copilot <[email protected]> Copilot-Session: 35281c30-3d08-4f05-8c84-2ce4711023d5 * format source --------- Co-authored-by: Ben Hillis <[email protected]> Co-authored-by: Copilot <[email protected]> Copilot-Session: 35281c30-3d08-4f05-8c84-2ce4711023d5 (cherry picked from commit f2d87e0) * Avoid stop service race window during uninstall (#40625) Disable service before stopping service during uninstall. (cherry picked from commit c28bd15) --------- Co-authored-by: Ben Hillis <[email protected]> Co-authored-by: Copilot <[email protected]> Co-authored-by: Blue <[email protected]> Co-authored-by: Feng Wang <[email protected]> Copilot-Session: d9d1a097-a7bc-4c1b-806b-d3778adfd23a Copilot-Session: 35281c30-3d08-4f05-8c84-2ce4711023d5
Summary of the Pull Request
There is a race window in the
ServiceControl StopServiceaction. Where the service can be started again by awslcall. This causes the stop service step to stuck when docker desktop is open.This PR adds a custom action to disable the service before stopping it to avoid this race window. Add also adds a custom action to revert (enable the service) on failure.
PR Checklist
Detailed Description of the Pull Request / Additional comments
Validation Steps Performed