wgengine/magicsock: move firstDerp check after nil derpMap check
This fixes a race condition which caused `c.muCond.Broadcast()` to never fire in the `firstDerp` if block. It resulted in `Close()` hanging forever. Signed-off-by: Kyle Carberry <kyle@carberry.com>
This commit is contained in:
parent
2c447de6cc
commit
91794f6498
|
@ -1318,6 +1318,9 @@ func (c *Conn) derpWriteChanOfAddr(addr netip.AddrPort, peer key.NodePublic) cha
|
|||
if !c.wantDerpLocked() || c.closed {
|
||||
return nil
|
||||
}
|
||||
if c.derpMap == nil || c.derpMap.Regions[regionID] == nil {
|
||||
return nil
|
||||
}
|
||||
if c.privateKey.IsZero() {
|
||||
c.logf("magicsock: DERP lookup of %v with no private key; ignoring", addr)
|
||||
return nil
|
||||
|
@ -1362,9 +1365,6 @@ func (c *Conn) derpWriteChanOfAddr(addr netip.AddrPort, peer key.NodePublic) cha
|
|||
c.activeDerp = make(map[int]activeDerp)
|
||||
c.prevDerp = make(map[int]*syncs.WaitGroupChan)
|
||||
}
|
||||
if c.derpMap == nil || c.derpMap.Regions[regionID] == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Note that derphttp.NewRegionClient does not dial the server
|
||||
// (it doesn't block) so it is safe to do under the c.mu lock.
|
||||
|
|
Loading…
Reference in New Issue