net/dnscache: don't cancel the TLS context before writing to the result channel.

Cancelling the context makes the timeout goroutine race with the write that
reports a successful TLS handshake, so you can end up with a successful TLS
handshake that mysteriously reports that it timed out after ~0s in flight.

The context is always canceled and cleaned up as the function exits, which
happens mere microseconds later, so just let function exit clean up and
thereby avoid races.

Signed-off-by: David Anderson <danderson@tailscale.com>
This commit is contained in:
David Anderson 2022-01-13 13:01:29 -08:00 committed by Dave Anderson
parent 9fe5ece833
commit a9da6b73a8

View File

@ -457,9 +457,7 @@ func TLSDialer(fwd DialContextFunc, dnsCache *Resolver, tlsConfigBase *tls.Confi
}
}()
go func() {
err := tlsConn.Handshake()
handshakeTimeoutCancel()
errc <- err
errc <- tlsConn.Handshake()
}()
if err := <-errc; err != nil {
tcpConn.Close()