Skip to content

Fix memory leak in OOBE window escape key handler - #13687

Closed
Ben Hillis (benhillis) with Copilot wants to merge 6 commits into
user/benhill/wslsettings_close_oobefrom
copilot/sub-pr-13686
Closed

Ben Hillis (benhillis) with Copilot wants to merge 6 commits into
user/benhill/wslsettings_close_oobefrom
copilot/sub-pr-13686

Conversation

Copilot AI commented Nov 6, 2025 •

Copy link
Copy Markdown
Contributor

Summary of the Pull Request

Addresses memory leak in OOBEWindow where the escape key KeyboardAccelerator.Invoked event handler was subscribed but never unsubscribed, preventing proper garbage collection of the window and page objects.

PR Checklist

  • Closes: Part of wslsettings: allow OOBE window to close with escape key #13686
  • Communication: I've discussed this with core contributors already. If work hasn't been agreed, this work might be rejected
  • Tests: Added/updated if needed and all pass
  • Localization: All end user facing strings can be localized
  • Dev docs: Added/updated if needed
  • Documentation updated: If checked, please file a pull request on our docs repo and link it here: #xxx

Detailed Description of the Pull Request / Additional comments

Root cause: Event subscription without cleanup creates reference cycle preventing GC.

Changes:

  • Added escapeAccelerator and page fields to track lifecycle
  • Extracted cleanup logic into CleanupEscapeAccelerator() method
  • Unsubscribe event handler and remove accelerator from collection in Dispose()
  • Added defensive cleanup in OnWindowActivated() before creating new accelerator
private void CleanupEscapeAccelerator()
{
    if (escapeAccelerator != null)
    {
        escapeAccelerator.Invoked -= OnCloseKeyboardAcceleratorInvoked;
        page?.KeyboardAccelerators.Remove(escapeAccelerator);
        escapeAccelerator = null;
    }
    page = null;
}

Validation Steps Performed

Code review completed. Full build and runtime testing requires Windows with Visual Studio (current environment is Linux).


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Copilot AI commented Nov 6, 2025

Copy link
Copy Markdown
Contributor Author

Just as a heads up, I was blocked by some firewall rules while working on your feedback. Expand below for details.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • 1oavsblobprodcus350.vsblob.vsassets.io
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/777B6CC405D19BB091B1730BAD80B769/missingpackages_workingdir --packages /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 1s1vsblobprodcus386.vsblob.vsassets.io
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/9C8ADA15032753F539EF2624306D199E/missingpackages_workingdir --packages /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 37cvsblobprodcus359.vsblob.vsassets.io
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/F4E345C841DA77E68A135758C8C193F3/missingpackages_workingdir --packages /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 5dkvsblobprodcus355.vsblob.vsassets.io
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/76DECDE965FC69B565D84C8811358126/missingpackages_workingdir --packages /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 6s7vsblobprodcus313.vsblob.vsassets.io
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/7F0AD5B89EC078FE77CFD6BDA2F52E08/missingpackages_workingdir --packages /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • cflvsblobprodcus383.vsblob.vsassets.io
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/E7821C1D735B7B74EC2D8FBC5687D15A/missingpackages_workingdir --packages /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • ckzvsblobprodcus347.vsblob.vsassets.io
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/F31145A4DBB2FF8BDC33A23A7806A07C/missingpackages_workingdir --packages /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • gervsblobprodcus329.vsblob.vsassets.io
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/042EF07C476C9D021FD9277657107FFC/missingpackages_workingdir --packages /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • josvsblobprodcus372.vsblob.vsassets.io
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/506CFBE8BDA6FD8181FC8ED63994F906/missingpackages_workingdir --packages /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • jrqvsblobprodcus343.vsblob.vsassets.io
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/E89EB3C1EA0D230B7927398F5FD1F1FD/missingpackages_workingdir --packages /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • kgfvsblobprodcus314.vsblob.vsassets.io
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/B86D4EBFBAE843E7C1DDFE86945610BB/missingpackages_workingdir --packages /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • kmuvsblobprodcus389.vsblob.vsassets.io
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/446FD05360E67E5619A8ED1478D06FA2/missingpackages_workingdir --packages /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • kxqvsblobprodcus376.vsblob.vsassets.io
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/647C64FDD74299326E39E07FE236C432/missingpackages_workingdir --packages /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • l7avsblobprodcus319.vsblob.vsassets.io
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/A97C6D529877C9C476811026D6CFA0D1/missingpackages_workingdir --packages /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • m16vsblobprodcus374.vsblob.vsassets.io
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/71F144D101874EC242988DF65A1E0888/missingpackages_workingdir --packages /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • nn8vsblobprodcus340.vsblob.vsassets.io
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/93F4B156C2AC7510375487F3B071BA8C/missingpackages_workingdir --packages /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • p2ovsblobprodcus312.vsblob.vsassets.io
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/3951ADD19F983D5DAC9F6BEB2378BF47/missingpackages_workingdir --packages /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • ukkvsblobprodcus352.vsblob.vsassets.io
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/8CB7AECE6DD7070AC045D7D8E723E44A/missingpackages_workingdir --packages /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • vwvvsblobprodcus334.vsblob.vsassets.io
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/67B4128E2B4C12F8D6E830AE22935BA4/missingpackages_workingdir --packages /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • ytvvsblobprodcus310.vsblob.vsassets.io
    • Triggering command: dotnet restore --no-dependencies /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/C08286DDCB284A178BD71E2B2D1C915F/missingpackages_workingdir --packages /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WSL/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Copilot AI changed the title [WIP] Update OOBE window escape key functionality based on feedback Fix memory leak in OOBE window escape key handler Nov 6, 2025
@benhillis
Ben Hillis (benhillis) deleted the copilot/sub-pr-13686 branch April 23, 2026 17:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants