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:
- Create a Windows app with a SystemTray.
- Build a tray menu with a few normal items, e.g. About, Quit, separators, and optionally some disabled items.
- On a short timer, rebuild the menu and call SystemTray.SetMenu(newMenu).
- 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
Additional context
No response
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-b1fd8e9bd122The fatal presents as:
and the stack is in the Windows tray/popup menu code, for example:
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:
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
Additional context
No response