From 5bf8d731273e0c03b84b6424f00e70b87afb248f Mon Sep 17 00:00:00 2001
From: "Jason A. Donenfeld" <Jason@zx2c4.com>
Date: Wed, 10 Feb 2021 00:21:12 +0100
Subject: [PATCH] device: create peer queues at peer creation time

Rather than racing with Start(), since we're never destroying these
queues, we just set the variables at creation time.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
---
 device/peer.go | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/device/peer.go b/device/peer.go
index 222c74f..40de59b 100644
--- a/device/peer.go
+++ b/device/peer.go
@@ -88,6 +88,9 @@ func (device *Device) NewPeer(pk NoisePublicKey) (*Peer, error) {
 
 	peer.cookieGenerator.Init(pk)
 	peer.device = device
+	peer.queue.outbound = newAutodrainingOutboundQueue(device)
+	peer.queue.inbound = newAutodrainingInboundQueue(device)
+	peer.queue.staged = make(chan *QueueOutboundElement, QueueStagedSize)
 
 	// map public key
 	_, ok := device.peers.keyMap[pk]
@@ -179,12 +182,6 @@ func (peer *Peer) Start() {
 	peer.handshake.lastSentHandshake = time.Now().Add(-(RekeyTimeout + time.Second))
 	peer.handshake.mutex.Unlock()
 
-	// prepare queues (once)
-	if peer.queue.outbound == nil {
-		peer.queue.outbound = newAutodrainingOutboundQueue(device)
-		peer.queue.inbound = newAutodrainingInboundQueue(device)
-		peer.queue.staged = make(chan *QueueOutboundElement, QueueStagedSize)
-	}
 	peer.device.queue.encryption.wg.Add(1) // keep encryption queue open for our writes
 
 	peer.timersStart()