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