From d451acbd63ccdbad48e0c2266e99983e727bf4cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Otto=20Kr=C3=B6pke?= Date: Sat, 21 Jun 2025 11:29:06 +0200 Subject: [PATCH] [0.30] fix: Avoid COINIT_MULTITHREADED in CoInitializeEx (#2066) (#2091) --- 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 78790f5b..38c52dfe 100644 --- a/internal/collector/scheduled_task/scheduled_task.go +++ b/internal/collector/scheduled_task/scheduled_task.go @@ -248,7 +248,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 ac0cdb5e..1ea13eb2 100644 --- a/internal/collector/update/update.go +++ b/internal/collector/update/update.go @@ -166,7 +166,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) @@ -178,17 +178,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) @@ -206,9 +206,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 a121649a..087f58b8 100644 --- a/internal/headers/schedule_service/schedule_service.go +++ b/internal/headers/schedule_service/schedule_service.go @@ -40,7 +40,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