From 7a82beeba3a74f7db8f0b019ee8b7aa1c838e6df Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Wed, 30 Aug 2023 10:26:45 -0400
Subject: [PATCH] pupnp: lock after dispatch

Change-Id: I4c99192c95a82f6a5a386968075cb8991c807c8d
---
 src/upnp/protocol/natpmp/nat_pmp.cpp | 12 ++++++------
 src/upnp/protocol/pupnp/pupnp.cpp    | 13 +++++--------
 2 files changed, 11 insertions(+), 14 deletions(-)

diff --git a/src/upnp/protocol/natpmp/nat_pmp.cpp b/src/upnp/protocol/natpmp/nat_pmp.cpp
index 633f580..c5e8ce6 100644
--- a/src/upnp/protocol/natpmp/nat_pmp.cpp
+++ b/src/upnp/protocol/natpmp/nat_pmp.cpp
@@ -115,26 +115,26 @@ NatPmp::setObserver(UpnpMappingObserver* obs)
 void
 NatPmp::terminate(std::condition_variable& cv)
 {
+    if (logger_) logger_->debug("NAT-PMP: Terminate instance {}", fmt::ptr(this));
+
     initialized_ = false;
     observer_ = nullptr;
 
-    {
-        std::lock_guard<std::mutex> lock(natpmpMutex_);
-        shutdownComplete_ = true;
-        cv.notify_one();
-    }
+    std::lock_guard<std::mutex> lock(natpmpMutex_);
+    shutdownComplete_ = true;
+    cv.notify_one();
 }
 
 void
 NatPmp::terminate()
 {
-    std::unique_lock<std::mutex> lk(natpmpMutex_);
     std::condition_variable cv {};
 
     ioContext->dispatch([&] {
         terminate(cv);
     });
 
+    std::unique_lock<std::mutex> lk(natpmpMutex_);
     if (cv.wait_for(lk, std::chrono::seconds(10), [this] { return shutdownComplete_; })) {
         if (logger_) logger_->debug("NAT-PMP: Shutdown completed");
     } else {
diff --git a/src/upnp/protocol/pupnp/pupnp.cpp b/src/upnp/protocol/pupnp/pupnp.cpp
index d1feed9..8db0517 100644
--- a/src/upnp/protocol/pupnp/pupnp.cpp
+++ b/src/upnp/protocol/pupnp/pupnp.cpp
@@ -208,24 +208,21 @@ PUPnP::terminate(std::condition_variable& cv)
     // Clear all the lists.
     discoveredIgdList_.clear();
 
-    {
-        std::lock_guard<std::mutex> lock(pupnpMutex_);
-        validIgdList_.clear();
-        shutdownComplete_ = true;
-        cv.notify_one();
-    }
+    std::lock_guard<std::mutex> lock(pupnpMutex_);
+    validIgdList_.clear();
+    shutdownComplete_ = true;
+    cv.notify_one();
 }
 
 void
 PUPnP::terminate()
 {
-    std::unique_lock<std::mutex> lk(pupnpMutex_);
     std::condition_variable cv {};
-
     ioContext->dispatch([&] {
         terminate(cv);
     });
 
+    std::unique_lock<std::mutex> lk(pupnpMutex_);
     if (cv.wait_for(lk, std::chrono::seconds(10), [this] { return shutdownComplete_; })) {
         if (logger_) logger_->debug("PUPnP: Shutdown completed");
     } else {
-- 
GitLab