From a06fd5925c22cea44fff40f5acd98d29a96ada2b Mon Sep 17 00:00:00 2001
From: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
Date: Sat, 25 Feb 2017 23:16:27 -0500
Subject: [PATCH] upnp: fix waiting while holding a lock

Blocking function (sleep) called when inside locked region.
This patch uses a move-in-temporary idiom to prevent that.
Was detected by Coverity scan.

Change-Id: I7ab74001c3d9de11e1d95b5e4a1c1bd0a8dce8c9
Reviewed-by: Olivier SOLDANO <olivier.soldano@savoirfairelinux.com>
---
 src/upnp/upnp_context.cpp | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/upnp/upnp_context.cpp b/src/upnp/upnp_context.cpp
index ecfe88a664..3dade205a6 100644
--- a/src/upnp/upnp_context.cpp
+++ b/src/upnp/upnp_context.cpp
@@ -138,9 +138,13 @@ UPnPContext::UPnPContext()
                     pmp_igd->clearAll_ = false;
                     pmp_igd->toRemove_.clear();
                 } else if (not pmp_igd->toRemove_.empty()) {
-                    for (auto& m : pmp_igd->toRemove_)
-                        PMPaddPortMapping(*pmp_igd, natpmp, m, true);
+                    decltype(pmp_igd->toRemove_) removed = std::move(pmp_igd->toRemove_);
                     pmp_igd->toRemove_.clear();
+                    lk.unlock();
+                    for (auto& m : removed) {
+                        PMPaddPortMapping(*pmp_igd, natpmp, m, true);
+                    }
+                    lk.lock();
                 }
                 auto mapping = pmp_igd->getNextMappingToRenew();
                 if (mapping and mapping->renewal_ < now)
-- 
GitLab