diff options
author | Josh Bleecher Snyder <josh@tailscale.com> | 2020-12-18 16:32:46 -0800 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-01-07 14:49:44 +0100 |
commit | b42e32047d16cc4389ef63550e525c7b08320172 (patch) | |
tree | 3321c5f3bce9fded5c598923f167bc2273535734 | |
parent | b5f966ac2439df9eba182886406f6381934948ad (diff) |
device: call wg.Add outside the goroutine
One of the first rules of WaitGroups is that you call wg.Add
outside of a goroutine, not inside it. Fix this embarrassing mistake.
This prevents an extremely rare race condition (2 per 100,000 runs)
which could occur when attempting to start a new peer
concurrently with shutting down a device.
Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
-rw-r--r-- | device/peer.go | 2 | ||||
-rw-r--r-- | device/send.go | 3 |
2 files changed, 2 insertions, 3 deletions
diff --git a/device/peer.go b/device/peer.go index 8006b9f..ac85c94 100644 --- a/device/peer.go +++ b/device/peer.go @@ -213,6 +213,8 @@ func (peer *Peer) Start() { // wait for routines to start + // RoutineNonce writes to the encryption queue; keep it alive until we are done. + device.queue.encryption.wg.Add(1) go peer.RoutineNonce() go peer.RoutineSequentialSender() go peer.RoutineSequentialReceiver() diff --git a/device/send.go b/device/send.go index c75d23e..55df4b3 100644 --- a/device/send.go +++ b/device/send.go @@ -352,9 +352,6 @@ func (peer *Peer) RoutineNonce() { device := peer.device logDebug := device.log.Debug - // We write to the encryption queue; keep it alive until we are done. - device.queue.encryption.wg.Add(1) - flush := func() { for { select { |