From 67c38a17d9a4cfa5862f734dddaedf7a8a4cb895 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
 <sebastien.blin@savoirfairelinux.com>
Date: Thu, 29 Oct 2020 16:05:56 -0400
Subject: [PATCH] multiplexed_socket: lock callback while accessed

Change-Id: I9b3bc097fd3be9899316133ac0f5161170b44281
---
 src/jamidht/multiplexed_socket.cpp | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/src/jamidht/multiplexed_socket.cpp b/src/jamidht/multiplexed_socket.cpp
index 3422b9a337..0a9c485a1a 100644
--- a/src/jamidht/multiplexed_socket.cpp
+++ b/src/jamidht/multiplexed_socket.cpp
@@ -290,15 +290,18 @@ MultiplexedSocket::Impl::handleChannelPacket(uint16_t channel, const std::vector
             std::lock_guard<std::mutex> lkSockets(socketsMutex);
             sockets.erase(sockIt);
         } else {
-            std::unique_lock<std::mutex> lk(channelCbsMtx_);
-            auto cb = channelCbs_.find(channel);
-            if (cb != channelCbs_.end()) {
-                lk.unlock();
-                if (cb->second)
-                    cb->second(&pkt[0], pkt.size());
+            GenericSocket<uint8_t>::RecvCb cb;
+            {
+                std::lock_guard<std::mutex> lk(channelCbsMtx_);
+                auto cbIt = channelCbs_.find(channel);
+                if (cbIt != channelCbs_.end()) {
+                    cb = cbIt->second;
+                }
+            }
+            if (cb) {
+                cb(&pkt[0], pkt.size());
                 return;
             }
-            lk.unlock();
             dataIt->second->buf.insert(dataIt->second->buf.end(),
                                        std::make_move_iterator(pkt.begin()),
                                        std::make_move_iterator(pkt.end()));
-- 
GitLab