ipn/desktop: use runtime.Pinner to force heap-allocation of msg

GetMessage can call back into Go, triggering stack growth and causing the stack
to be copied to a new memory region, which invalidates the original stack pointer
passed to the syscall. Since GetMessage uses that pointer to write the message
before returning, this leads to memory corruption.

In this PR, we fix this by using runtime.Pinner, which requires the pointer to refer
to heap-allocated memory.

Fixes #19263
Fixes #17832

Signed-off-by: Nick Khyl <nickk@tailscale.com>
This commit is contained in:
Nick Khyl
2026-04-07 12:40:25 -05:00
committed by Nick Khyl
parent 1b5b43787c
commit 1f84729908

View File

@@ -510,10 +510,13 @@ func sessionWatcherWndProc(hWnd windows.HWND, msg uint32, wParam, lParam uintptr
}
func pumpThreadMessages() {
var msg _MSG
for getMessage(&msg, 0, 0, 0) != 0 {
translateMessage(&msg)
dispatchMessage(&msg)
var p runtime.Pinner
defer p.Unpin()
msg := &_MSG{}
p.Pin(msg)
for getMessage(msg, 0, 0, 0) != 0 {
translateMessage(msg)
dispatchMessage(msg)
}
}