From 88ca4fb3f5d0c9b81a5cb7c79a4ae0fbcbe9f097 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
 <sebastien.blin@savoirfairelinux.com>
Date: Thu, 21 Oct 2021 17:10:26 -0400
Subject: [PATCH] conversationmodel: protect interaction's iterator

find() returns an iterator that must not change

Change-Id: I02650ba17149be1bad002b754f459e8664746fc1
---
 src/conversationmodel.cpp | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/src/conversationmodel.cpp b/src/conversationmodel.cpp
index aa2f7ebf..61093d44 100644
--- a/src/conversationmodel.cpp
+++ b/src/conversationmodel.cpp
@@ -3181,16 +3181,18 @@ ConversationModelPimpl::addOrUpdateCallMessage(const QString& callId,
     auto msgId = storage::addOrUpdateMessage(db, conv_it->uid, msg, callId);
     // now set the formatted call message string in memory only
     msg.body = storage::getCallInteractionString(uriString, duration);
-    auto interactionIt = conv_it->interactions->find(msgId);
-    auto newInteraction = interactionIt == conv_it->interactions->end();
-    if (newInteraction) {
-        conv_it->lastMessageUid = msgId;
-        std::lock_guard<std::mutex> lk(interactionsLocks[conv_it->uid]);
-        conv_it->interactions->emplace(msgId, msg);
-    } else {
+    bool newInteraction = false;
+    {
         std::lock_guard<std::mutex> lk(interactionsLocks[conv_it->uid]);
-        interactionIt->second = msg;
-        conv_it->interactions->emitDataChanged(interactionIt);
+        auto interactionIt = conv_it->interactions->find(msgId);
+        newInteraction = interactionIt == conv_it->interactions->end();
+        if (newInteraction) {
+            conv_it->lastMessageUid = msgId;
+            conv_it->interactions->emplace(msgId, msg);
+        } else {
+            interactionIt->second = msg;
+            conv_it->interactions->emitDataChanged(interactionIt);
+        }
     }
 
     if (newInteraction)
-- 
GitLab