From 0ce86e813a7df752a25b18fa080f386721adf0a8 Mon Sep 17 00:00:00 2001 From: James Tucker Date: Thu, 8 Aug 2024 11:02:30 -0700 Subject: [PATCH] wgengine/magicsock: fix the freshness of endpoints in callmemaybe Endpoint storage and state updates are all over the place so the full story is hard to track, but explicitly callmemaybe is executed by a callback that is triggered before the write of new endpoints into the storage that CallMeMaybe sends read from. This is now reordered, so that CallMeMaybe should always observe the most recent endpoints. Signed-off-by: James Tucker --- wgengine/magicsock/magicsock.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/wgengine/magicsock/magicsock.go b/wgengine/magicsock/magicsock.go index 1d0fa58c3..6178bdab2 100644 --- a/wgengine/magicsock/magicsock.go +++ b/wgengine/magicsock/magicsock.go @@ -634,16 +634,17 @@ func (c *Conn) setEndpoints(endpoints []tailcfg.Endpoint) (changed bool) { } c.lastEndpointsTime = time.Now() + if !endpointSetsEqual(endpoints, c.lastEndpoints) { + changed = true + } + // lastEndpoints must be updated before onEndpointsRefreshed, + // as CallMyMaybe sent via this callback must observe the new endpoints. + c.lastEndpoints = endpoints for de, fn := range c.onEndpointRefreshed { go fn() delete(c.onEndpointRefreshed, de) } - - if endpointSetsEqual(endpoints, c.lastEndpoints) { - return false - } - c.lastEndpoints = endpoints - return true + return changed } // SetStaticEndpoints sets static endpoints to the provided value and triggers