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