Skip to content

Commit addda5b

Browse files
committed
wgengine/magicsock: fix watchdog timeout on Close when IPv6 not available
The blockForeverConn was only using its sync.Cond one side. Looks like it was just forgotten. Fixes tailscale#3671 Change-Id: I4ed0191982cdd0bfd451f133139428a4fa48238c Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
1 parent 64c2657 commit addda5b

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

wgengine/magicsock/magicsock.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3121,6 +3121,7 @@ func (c *blockForeverConn) Close() error {
31213121
return net.ErrClosed
31223122
}
31233123
c.closed = true
3124+
c.cond.Broadcast()
31243125
return nil
31253126
}
31263127

wgengine/magicsock/magicsock_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1763,3 +1763,27 @@ func (m *peerMap) validate() error {
17631763

17641764
return nil
17651765
}
1766+
1767+
func TestBlockForeverConnUnblocks(t *testing.T) {
1768+
c := newBlockForeverConn()
1769+
done := make(chan error, 1)
1770+
go func() {
1771+
defer close(done)
1772+
_, _, err := c.ReadFrom(make([]byte, 1))
1773+
done <- err
1774+
}()
1775+
time.Sleep(50 * time.Millisecond) // give ReadFrom time to get blocked
1776+
if err := c.Close(); err != nil {
1777+
t.Fatal(err)
1778+
}
1779+
timer := time.NewTimer(5 * time.Second)
1780+
defer timer.Stop()
1781+
select {
1782+
case err := <-done:
1783+
if err != net.ErrClosed {
1784+
t.Errorf("got %v; want net.ErrClosed", err)
1785+
}
1786+
case <-timer.C:
1787+
t.Fatal("timeout")
1788+
}
1789+
}

0 commit comments

Comments
 (0)