From 0d47cd2284c5b89857cdc3a4d116b54086d50819 Mon Sep 17 00:00:00 2001 From: Andrew Dunham Date: Tue, 13 Dec 2022 13:14:38 -0500 Subject: [PATCH] wgengine/monitor: fix panic due to race on Windows It's possible for the 'somethingChanged' callback to be registered and then trigger before the ctx field is assigned; move the assignment earlier so this can't happen. Change-Id: Ia7ee8b937299014a083ab40adf31a8b3e0db4ec5 Signed-off-by: Andrew Dunham --- wgengine/monitor/monitor_windows.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/wgengine/monitor/monitor_windows.go b/wgengine/monitor/monitor_windows.go index d21c1409a..bd39f3b72 100644 --- a/wgengine/monitor/monitor_windows.go +++ b/wgengine/monitor/monitor_windows.go @@ -51,11 +51,13 @@ func newOSMon(logf logger.Logf, _ *Mon) (osMon, error) { messagec: make(chan eventMessage, 1), noDeadlockTicker: time.NewTicker(5000 * time.Hour), // arbitrary } + m.ctx, m.cancel = context.WithCancel(context.Background()) var err error m.addressChangeCallback, err = winipcfg.RegisterUnicastAddressChangeCallback(m.unicastAddressChanged) if err != nil { m.logf("winipcfg.RegisterUnicastAddressChangeCallback error: %v", err) + m.cancel() return nil, err } @@ -63,11 +65,10 @@ func newOSMon(logf logger.Logf, _ *Mon) (osMon, error) { if err != nil { m.addressChangeCallback.Unregister() m.logf("winipcfg.RegisterRouteChangeCallback error: %v", err) + m.cancel() return nil, err } - m.ctx, m.cancel = context.WithCancel(context.Background()) - return m, nil }