diff --git a/wgengine/magicsock/magicsock.go b/wgengine/magicsock/magicsock.go index 2be8b304b..8132e7f1b 100644 --- a/wgengine/magicsock/magicsock.go +++ b/wgengine/magicsock/magicsock.go @@ -1160,7 +1160,15 @@ func (c *Conn) runDerpReader(ctx context.Context, derpFakeAddr netaddr.IPPort, d case <-ctx.Done(): return case c.derpRecvCh <- res: - <-didCopy + continue + } + // The copy will not happen if connCtx is cancelled before we reach copyBuf. + // This has resulted in a rare inifite wait in practice. + select { + case <-ctx.Done(): + return + case <-didCopy: + continue } } }