From 8cd4770f329c749c801630d1ec29c2765e60a8e6 Mon Sep 17 00:00:00 2001 From: Tim Culverhouse Date: Thu, 29 Sep 2022 16:27:05 -0500 Subject: [PATCH] msgstore: fix data race on access to store.needsFlags Flag fetching is debounced in the UI, creating a race condition where fields are accessed in the AfterFunc. Protect the needsFlags field with a mutex. Signed-off-by: Tim Culverhouse Acked-by: Robin Jarry --- lib/msgstore.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/msgstore.go b/lib/msgstore.go index d2d4b6e..74a021a 100644 --- a/lib/msgstore.go +++ b/lib/msgstore.go @@ -14,6 +14,7 @@ import ( // Accesses to fields must be guarded by MessageStore.Lock/Unlock type MessageStore struct { + sync.Mutex Deleted map[uint32]interface{} DirInfo models.DirectoryInfo Messages map[uint32]*models.MessageInfo @@ -247,7 +248,9 @@ func (store *MessageStore) Update(msg types.WorkerMessage) { store.Messages[msg.Info.Uid] = msg.Info } if msg.NeedsFlags { + store.Lock() store.needsFlags = append(store.needsFlags, msg.Info.Uid) + store.Unlock() store.fetchFlags() } seen := false @@ -757,9 +760,11 @@ func (store *MessageStore) fetchFlags() { store.fetchFlagsDebounce.Stop() } store.fetchFlagsDebounce = time.AfterFunc(store.fetchFlagsDelay, func() { + store.Lock() store.worker.PostAction(&types.FetchMessageFlags{ Uids: store.needsFlags, }, nil) store.needsFlags = []uint32{} + store.Unlock() }) }