From db44b8d97232386ca7687058dcda937d8db9d60b Mon Sep 17 00:00:00 2001
From: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com>
Date: Mon, 16 Mar 2020 14:55:04 -0400
Subject: [PATCH] multiplexed socket: complete shutdown before destroy

When shutdown called from callback before it called from destructor sockets
could be destroyed.

Change-Id: I0fd92646726969c0d9b947a51fecbed495439fb8
---
 src/jamidht/multiplexed_socket.cpp | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/jamidht/multiplexed_socket.cpp b/src/jamidht/multiplexed_socket.cpp
index e8cde3f02f..946b39d5dc 100644
--- a/src/jamidht/multiplexed_socket.cpp
+++ b/src/jamidht/multiplexed_socket.cpp
@@ -51,7 +51,15 @@ public:
     }) } { }
 
     ~Impl() {
-        shutdown();
+        if (!isShutdown_) {
+            shutdown();
+        } else {
+            std::lock_guard<std::mutex> lkSockets(socketsMutex);
+            for (auto& socket : sockets) {
+                if (socket.second) socket.second->stop();
+            }
+            sockets.clear();
+        }
     }
 
     void shutdown() {
@@ -68,6 +76,7 @@ public:
                 // No need to write the EOF for the channel, the write will fail because endpoint is already shutdown
                 if (socket.second) socket.second->stop();
             }
+            sockets.clear();
         }
     }
 
-- 
GitLab