From 348425aa18d7aba1101fc962319ecb7f07879fe2 Mon Sep 17 00:00:00 2001 From: Alex Brainman <alex.brainman@gmail.com> Date: Sat, 8 Jun 2024 17:11:21 +1000 Subject: [PATCH] windows/svc: do not pass theService to windows.RegisterServiceCtrlHandlerEx windows.RegisterServiceCtrlHandlerEx context parameter is uintptr, so it is unsafe to pass pointers in that parameter. Use theService global variable in ctlHandler function instead. Fixes golang/go#67437 Change-Id: I84c910eaa354603c2a5114421cd61788cb40b86f Reviewed-on: https://go-review.googlesource.com/c/sys/+/591475 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Michael Pratt <mpratt@google.com> Reviewed-by: Quim Muntal <quimmuntal@gmail.com> Reviewed-by: David Chase <drchase@google.com> --- windows/svc/service.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/windows/svc/service.go b/windows/svc/service.go index c96932d96..c4f74924d 100644 --- a/windows/svc/service.go +++ b/windows/svc/service.go @@ -199,9 +199,8 @@ var ( ) func ctlHandler(ctl, evtype, evdata, context uintptr) uintptr { - s := (*service)(unsafe.Pointer(context)) e := ctlEvent{cmd: Cmd(ctl), eventType: uint32(evtype), eventData: evdata, context: 123456} // Set context to 123456 to test issue #25660. - s.c <- e + theService.c <- e return 0 } @@ -210,7 +209,7 @@ var theService service // This is, unfortunately, a global, which means only one // serviceMain is the entry point called by the service manager, registered earlier by // the call to StartServiceCtrlDispatcher. func serviceMain(argc uint32, argv **uint16) uintptr { - handle, err := windows.RegisterServiceCtrlHandlerEx(windows.StringToUTF16Ptr(theService.name), ctlHandlerCallback, uintptr(unsafe.Pointer(&theService))) + handle, err := windows.RegisterServiceCtrlHandlerEx(windows.StringToUTF16Ptr(theService.name), ctlHandlerCallback, 0) if sysErr, ok := err.(windows.Errno); ok { return uintptr(sysErr) } else if err != nil {