From 1241bf82aa81aa74a1b22517b428c98d5bfeb206 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Mon, 16 Mar 2020 15:08:11 +0100 Subject: [PATCH] Protect upstreamConn.history with a lock --- downstream.go | 4 ++++ upstream.go | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/downstream.go b/downstream.go index ef61d34..8d6a9ff 100644 --- a/downstream.go +++ b/downstream.go @@ -555,7 +555,9 @@ func (dc *downstreamConn) register() error { var seqPtr *uint64 if firstDownstream { + uc.lock.Lock() seq, ok := uc.history[historyName] + uc.lock.Unlock() if ok { seqPtr = &seq } @@ -583,7 +585,9 @@ func (dc *downstreamConn) register() error { dc.user.lock.Unlock() if lastDownstream { + uc.lock.Lock() uc.history[historyName] = seq + uc.lock.Unlock() } }() }) diff --git a/upstream.go b/upstream.go index 7fc2a32..a84f17f 100644 --- a/upstream.go +++ b/upstream.go @@ -8,6 +8,7 @@ import ( "net" "strconv" "strings" + "sync" "time" "github.com/emersion/go-sasl" @@ -48,11 +49,13 @@ type upstreamConn struct { closed bool modes modeSet channels map[string]*upstreamChannel - history map[string]uint64 caps map[string]string saslClient sasl.Client saslStarted bool + + lock sync.Mutex + history map[string]uint64 // TODO: move to network } func connectToUpstream(network *network) (*upstreamConn, error) {