From 0580b330a5de88243603bda0cf08322e57c69e96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Otto=20Kr=C3=B6pke?= Date: Thu, 29 May 2025 21:58:42 +0200 Subject: [PATCH] fix: Avoid COINIT_MULTITHREADED in CoInitializeEx (#2066) --- internal/collector/scheduled_task/scheduled_task.go | 2 +- internal/collector/update/update.go | 12 ++++++------ .../headers/schedule_service/schedule_service.go | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/internal/collector/scheduled_task/scheduled_task.go b/internal/collector/scheduled_task/scheduled_task.go index a8044369..8100c152 100644 --- a/internal/collector/scheduled_task/scheduled_task.go +++ b/internal/collector/scheduled_task/scheduled_task.go @@ -250,7 +250,7 @@ func getScheduledTasks() (ScheduledTasks, error) { runtime.LockOSThread() defer runtime.UnlockOSThread() - if err := ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED); err != nil { + if err := ole.CoInitializeEx(0, ole.COINIT_APARTMENTTHREADED|ole.COINIT_DISABLE_OLE1DDE); err != nil { var oleCode *ole.OleError if errors.As(err, &oleCode) && oleCode.Code() != ole.S_OK && oleCode.Code() != S_FALSE { return nil, err diff --git a/internal/collector/update/update.go b/internal/collector/update/update.go index c068918b..bcc75ded 100644 --- a/internal/collector/update/update.go +++ b/internal/collector/update/update.go @@ -220,7 +220,7 @@ func (c *Collector) scheduleUpdateStatus(ctx context.Context, logger *slog.Logge runtime.LockOSThread() defer runtime.UnlockOSThread() - if err := ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED); err != nil { + if err := ole.CoInitializeEx(0, ole.COINIT_APARTMENTTHREADED|ole.COINIT_DISABLE_OLE1DDE); err != nil { var oleCode *ole.OleError if errors.As(err, &oleCode) && oleCode.Code() != ole.S_OK && oleCode.Code() != 0x00000001 { initErrCh <- fmt.Errorf("CoInitializeEx: %w", err) @@ -232,17 +232,17 @@ func (c *Collector) scheduleUpdateStatus(ctx context.Context, logger *slog.Logge defer ole.CoUninitialize() // Create a new instance of the WMI object - mus, err := oleutil.CreateObject("Microsoft.Update.Session") + sessionObj, err := oleutil.CreateObject("Microsoft.Update.Session") if err != nil { initErrCh <- fmt.Errorf("create Microsoft.Update.Session: %w", err) return } - defer mus.Release() + defer sessionObj.Release() // Query the IDispatch interface of the object - musQueryInterface, err := mus.QueryInterface(ole.IID_IDispatch) + musQueryInterface, err := sessionObj.QueryInterface(ole.IID_IDispatch) if err != nil { initErrCh <- fmt.Errorf("IID_IDispatch: %w", err) @@ -267,9 +267,9 @@ func (c *Collector) scheduleUpdateStatus(ctx context.Context, logger *slog.Logge // https://learn.microsoft.com/en-us/windows/win32/api/wuapi/nf-wuapi-iupdatesession-createupdatesearcher us, err := oleutil.CallMethod(musQueryInterface, "CreateUpdateSearcher") - defer func(hc *ole.VARIANT) { + defer func(us *ole.VARIANT) { if us != nil { - _ = hc.Clear() + _ = us.Clear() } }(us) diff --git a/internal/headers/schedule_service/schedule_service.go b/internal/headers/schedule_service/schedule_service.go index 27fcbc5a..666b76ec 100644 --- a/internal/headers/schedule_service/schedule_service.go +++ b/internal/headers/schedule_service/schedule_service.go @@ -44,7 +44,7 @@ func (s *ScheduleService) Connect() error { runtime.LockOSThread() defer runtime.UnlockOSThread() - if err := ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED|ole.COINIT_DISABLE_OLE1DDE); err != nil { + if err := ole.CoInitializeEx(0, ole.COINIT_APARTMENTTHREADED|ole.COINIT_DISABLE_OLE1DDE); err != nil { var oleCode *ole.OleError if errors.As(err, &oleCode) && oleCode.Code() != ole.S_OK && oleCode.Code() != 0x00000001 { return err