wgengine/magicsock: stop discoEndpoint timers on Close

And add some defensive early returns on c.closed.
This commit is contained in:
Brad Fitzpatrick 2020-07-08 16:50:31 -07:00
parent a8b95571fb
commit bd59bba8e6
1 changed files with 13 additions and 0 deletions

View File

@ -1400,6 +1400,10 @@ func (c *Conn) ReceiveIPv6(b []byte) (int, conn.Endpoint, *net.UDPAddr, error) {
func (c *Conn) sendDiscoMessage(dst netaddr.IPPort, dstKey key.Public, dstDisco tailcfg.DiscoKey, m disco.Message) (sent bool, err error) { func (c *Conn) sendDiscoMessage(dst netaddr.IPPort, dstKey key.Public, dstDisco tailcfg.DiscoKey, m disco.Message) (sent bool, err error) {
c.mu.Lock() c.mu.Lock()
if c.closed {
c.mu.Unlock()
return false, errClosed
}
var nonce [disco.NonceLen]byte var nonce [disco.NonceLen]byte
if _, err := crand.Read(nonce[:]); err != nil { if _, err := crand.Read(nonce[:]); err != nil {
panic(err) // worth dying for panic(err) // worth dying for
@ -1446,6 +1450,9 @@ func (c *Conn) handleDiscoMessage(msg []byte, src netaddr.IPPort) bool {
c.mu.Lock() c.mu.Lock()
defer c.mu.Unlock() defer c.mu.Unlock()
if c.closed {
return true
}
if logDisco { if logDisco {
c.logf("magicsock: disco: got disco-looking frame from %v", sender.ShortString()) c.logf("magicsock: disco: got disco-looking frame from %v", sender.ShortString())
} }
@ -1860,6 +1867,10 @@ func (c *Conn) Close() error {
} }
defer c.mu.Unlock() defer c.mu.Unlock()
for _, ep := range c.endpointOfDisco {
ep.cleanup()
}
c.closed = true c.closed = true
c.connCtxCancel() c.connCtxCancel()
c.closeAllDerpLocked("conn-close") c.closeAllDerpLocked("conn-close")
@ -3191,3 +3202,5 @@ type ippCacheKey struct {
// derpStr replaces DERP IPs in s with "derp-". // derpStr replaces DERP IPs in s with "derp-".
func derpStr(s string) string { return strings.ReplaceAll(s, "127.3.3.40:", "derp-") } func derpStr(s string) string { return strings.ReplaceAll(s, "127.3.3.40:", "derp-") }
var errClosed = errors.New("conn is closed")