summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorNick Khyl <nickk@tailscale.com>2025-06-16 17:49:03 -0500
committerNick Khyl <nickk@tailscale.com>2025-06-16 17:49:03 -0500
commit0f7e7c333ad8453d699a5310910ea07a63ae5cb2 (patch)
treeb3e8c26ede80a84b1deda29d0349bc72fc47dc9d
parent735f15cb49520a198cd2e063bcf9e8e511bcc691 (diff)
downloadtailscale-nickkhyl/authreconfig-defer-unlock.tar.xz
tailscale-nickkhyl/authreconfig-defer-unlock.zip
ipn/ipnlocal: ensure b.mu is always unlocked in (*LocalBackend).authReconfignickkhyl/authreconfig-defer-unlock
Updates tailscale/corp#27502 (caused a deadlock in a test while working on it) Signed-off-by: Nick Khyl <nickk@tailscale.com>
-rw-r--r--ipn/ipnlocal/local.go41
1 files changed, 28 insertions, 13 deletions
diff --git a/ipn/ipnlocal/local.go b/ipn/ipnlocal/local.go
index cd30e92bb..2e620c8d7 100644
--- a/ipn/ipnlocal/local.go
+++ b/ipn/ipnlocal/local.go
@@ -4857,19 +4857,34 @@ func (b *LocalBackend) readvertiseAppConnectorRoutes() {
// updates are not currently blocked, based on the cached netmap and
// user prefs.
func (b *LocalBackend) authReconfig() {
- b.mu.Lock()
- blocked := b.blocked
- prefs := b.pm.CurrentPrefs()
- cn := b.currentNode()
- nm := cn.NetMap()
- hasPAC := b.prevIfState.HasPAC()
- disableSubnetsIfPAC := cn.SelfHasCap(tailcfg.NodeAttrDisableSubnetsIfPAC)
- dohURL, dohURLOK := cn.exitNodeCanProxyDNS(prefs.ExitNodeID())
- dcfg := cn.dnsConfigForNetmap(prefs, b.keyExpired, b.logf, version.OS())
- // If the current node is an app connector, ensure the app connector machine is started
- b.reconfigAppConnectorLocked(nm, prefs)
- closing := b.shutdownCalled
- b.mu.Unlock()
+ var (
+ blocked bool
+ prefs ipn.PrefsView
+ hasPAC bool
+ cn *nodeBackend
+ nm *netmap.NetworkMap
+ disableSubnetsIfPAC bool
+ dohURL string
+ dohURLOK bool
+ dcfg *dns.Config
+ closing bool
+ )
+
+ func() { // make sure b.mu gets unlocked if anything below panics
+ b.mu.Lock()
+ defer b.mu.Unlock()
+ blocked = b.blocked
+ prefs = b.pm.CurrentPrefs()
+ cn = b.currentNode()
+ nm = cn.NetMap()
+ hasPAC = b.prevIfState.HasPAC()
+ disableSubnetsIfPAC = cn.SelfHasCap(tailcfg.NodeAttrDisableSubnetsIfPAC)
+ dohURL, dohURLOK = cn.exitNodeCanProxyDNS(prefs.ExitNodeID())
+ dcfg = cn.dnsConfigForNetmap(prefs, b.keyExpired, b.logf, version.OS())
+ // If the current node is an app connector, ensure the app connector machine is started
+ b.reconfigAppConnectorLocked(nm, prefs)
+ closing = b.shutdownCalled
+ }()
if closing {
b.logf("[v1] authReconfig: skipping because in shutdown")