Skip to content

[v3] SystemTray updates can fatal the process #5227

Description

@johnmaguire

Description

On Windows, a systray app that updates its tray menu via SystemTray.SetMenu() can fatally crash inside the Windows popup-menu build path.

I reproduced this on current upstream Wails: github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122

The fatal presents as:

time="2026-04-23T16:26:18-04:00" level=error msg="Fatal error in Wails application"
error="... error adding menu item 'Debug item 192 rebuild 246' ..."

and the stack is in the Windows tray/popup menu code, for example:

  goroutine 1 [running, locked to thread]:
  github.com/DefinedNet/dnclient/internal/ui.New.func3({0x7ff62d35c940, 0x400166ab88})
  	github.com/DefinedNet/dnclient/internal/ui/ui.go:92 +0x54
  github.com/wailsapp/wails/v3/pkg/application.(*App).handleError(0x4000634d00?, {0x7ff62d35c940?, 0x400166ab88?})
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/application.go:445 +0x38
  github.com/wailsapp/wails/v3/pkg/application.(*App).handleFatalError(0x4000171408, {0x7ff62d35b4e0, 0x4000634d00})
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/application.go:474 +0x70
  github.com/wailsapp/wails/v3/pkg/application.(*App).fatal(0x4000171408, {0x7ff62cff9f0e?, 0x4?}, {0x400063a450?, 0xe2961?, 0x0?})
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/application.go:532 +0x4c
  github.com/wailsapp/wails/v3/pkg/application.(*Win32Menu).buildMenu(0x40000b2540, 0xe2961, 0x4000dfa8c0)
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/popupmenu_windows.go:146 +0x5b4
  github.com/wailsapp/wails/v3/pkg/application.(*Win32Menu).Update(0x40000b2540)
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/popupmenu_windows.go:167 +0x70
  github.com/wailsapp/wails/v3/pkg/application.NewPopupMenu(...)
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/popupmenu_windows.go:179
  github.com/wailsapp/wails/v3/pkg/application.(*windowsSystemTray).updateMenu(0x4000380120, 0x4000dfa8c0)
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/systemtray_windows.go:489 +0x98
  github.com/wailsapp/wails/v3/pkg/application.(*windowsSystemTray).setMenu(0x18?, 0x400063a628?)
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/systemtray_windows.go:203 +0x1c
  github.com/wailsapp/wails/v3/pkg/application.(*SystemTray).SetMenu.func1()
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/systemtray.go:220 +0x28
  github.com/wailsapp/wails/v3/pkg/application.InvokeSync.func1()
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/mainthread.go:28 +0x44
  github.com/wailsapp/wails/v3/pkg/application.(*windowsApp).invokeCallback(0x40001541e0, 0x4000000121?, 0x2?)
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/mainthread_windows.go:125 +0x298
  github.com/wailsapp/wails/v3/pkg/application.(*windowsApp).wndProc(0x0?, 0x400063a8e8?, 0x63a888?, 0x0?, 0x400063ab18?)
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/application_windows.go:232 +0x784
  syscall.SyscallN(0x0?, {0x4000231920?, 0x7ff62da25f40?, 0x7ff62c6cbd50?})
  	runtime/syscall_windows.go:500 +0x24
  syscall.(*Proc).Call(0x7ff62da25f20?, {0x4000231920?, 0x100ab2301?, 0x1f678940658?})
  	syscall/dll_windows.go:167 +0x24
  syscall.(*LazyProc).Call(0x7ff62da25f20, {0x4000231920, 0x6, 0x6})
  	syscall/dll_windows.go:287 +0x4c
  github.com/wailsapp/wails/v3/pkg/w32.TrackPopupMenuEx(...)
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/w32/user32.go:973
  github.com/wailsapp/wails/v3/pkg/application.(*Win32Menu).ShowAt(0x40002d99e0, 0xa23, 0x690)
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/popupmenu_windows.go:227 +0x264
  github.com/wailsapp/wails/v3/pkg/application.(*windowsSystemTray).openMenu(0x4000380120)
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/systemtray_windows.go:66 +0x44
  github.com/wailsapp/wails/v3/pkg/application.InvokeSync.func1()
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/mainthread.go:28 +0x44
  github.com/wailsapp/wails/v3/pkg/application.(*App).dispatchOnMainThread(0x4000171408, 0x4000dbd290)
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/application.go:846 +0xcc
  github.com/wailsapp/wails/v3/pkg/application.InvokeSync(0x4000dbd278)
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/mainthread.go:26 +0x8c
  github.com/wailsapp/wails/v3/pkg/application.(*SystemTray).OpenMenu(...)
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/systemtray.go:368
  github.com/wailsapp/wails/v3/pkg/application.(*SystemTray).ShowMenu(...)
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/systemtray.go:165
  github.com/wailsapp/wails/v3/pkg/application.(*windowsSystemTray).wndProc(0x4000380120, 0x401, 0x6a70a54, 0x10205)
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/systemtray_windows.go:453 +0xe8
  github.com/wailsapp/wails/v3/pkg/application.(*windowsApp).wndProc(0x40001541e0, 0x80356, 0x401, 0x6a70a54, 0x10205)
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/application_windows.go:310 +0x598
  syscall.SyscallN(0x0?, {0x4000edd6e0?, 0x8?, 0x0?})
  	runtime/syscall_windows.go:500 +0x24
  syscall.(*Proc).Call(0x20?, {0x4000edd6e0?, 0x300187b01?, 0x7ff62cd1689c?})
  	syscall/dll_windows.go:167 +0x24
  syscall.(*LazyProc).Call(0x7ff62da23e60, {0x4000edd6e0, 0x4, 0x4})
  	syscall/dll_windows.go:287 +0x4c
  github.com/wailsapp/wails/v3/pkg/w32.GetMessage(...)
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/w32/user32.go:466
  github.com/wailsapp/wails/v3/pkg/application.(*windowsApp).runMainLoop(0x40001541e0)
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/mainthread_windows.go:62 +0x16c
  github.com/wailsapp/wails/v3/pkg/application.(*windowsApp).run(0x40001541e0)
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/application_windows.go:190 +0x33c
  github.com/wailsapp/wails/v3/pkg/application.(*App).Run(0x4000171408)
  	github.com/wailsapp/wails/v3@v3.0.0-alpha.78.0.20260422083913-b1fd8e9bd122/pkg/application/application.go:650 +0x6f8
  main.main()
  	github.com/DefinedNet/dnclient/cmd/dnclient-desktop/main.go:47 +0x668

To Reproduce

A minimal repro should be a Windows systray app that updates its tray menu frequently via SystemTray.SetMenu().

The pattern that reproduces for me is:

  1. Create a Windows app with a SystemTray.
  2. Build a tray menu with a few normal items, e.g. About, Quit, separators, and optionally some disabled items.
  3. On a short timer, rebuild the menu and call SystemTray.SetMenu(newMenu).
  4. After enough iterations, Wails fatally crashes in popupmenu_windows.go with error adding menu item '...'.

In my app, the menu was rebuilt from a background goroutine and handed to SystemTray.SetMenu() repeatedly.

Expected behaviour

SystemTray.SetMenu() should not fatally crash the process.

Screenshots

No response

Attempted Fixes

I have a PR incoming with fixes. The issue is related to resource leaks.

System Details

n/a

Additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugSomething isn't workingawaiting feedbackMore information is required from the requestor

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions