<div dir="auto"><div>This patch can lead to deadlock if release() is called when there are pending callbacks. UpnpFinish() will wait for all pending callbacks to finish, but they can't finish since release() holds s_lock.<br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, 7 Aug 2019, 16:46 Hugo Beauzée-Luyssen, <<a href="mailto:hugo@beauzee.fr">hugo@beauzee.fr</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">If two threads call UpnpFinish at the same time (or more precisely, if a<br>
2nd thread calls UpnpFinish before the first one sets UpnpSdkInit to 0)<br>
we can end up double releasing most libupnp resources<br>
---<br>
 modules/services_discovery/upnp-wrapper.cpp | 3 +--<br>
 1 file changed, 1 insertion(+), 2 deletions(-)<br>
<br>
diff --git a/modules/services_discovery/upnp-wrapper.cpp b/modules/services_discovery/upnp-wrapper.cpp<br>
index c001492f37..3b8037b3f1 100644<br>
--- a/modules/services_discovery/upnp-wrapper.cpp<br>
+++ b/modules/services_discovery/upnp-wrapper.cpp<br>
@@ -113,13 +113,12 @@ UpnpInstanceWrapper *UpnpInstanceWrapper::get(vlc_object_t *p_obj)<br>
 void UpnpInstanceWrapper::release()<br>
 {<br>
     UpnpInstanceWrapper *p_delete = NULL;<br>
-    vlc_mutex_lock( &s_lock );<br>
+    vlc::threads::mutex_locker lock( &s_lock );<br>
     if (--s_instance->m_refcount == 0)<br>
     {<br>
         p_delete = s_instance;<br>
         s_instance = NULL;<br>
     }<br>
-    vlc_mutex_unlock( &s_lock );<br>
     delete p_delete;<br>
 }<br>
<br>
-- <br>
2.20.1<br>
<br>
_______________________________________________<br>
vlc-devel mailing list<br>
To unsubscribe or modify your subscription options:<br>
<a href="https://mailman.videolan.org/listinfo/vlc-devel" rel="noreferrer noreferrer" target="_blank">https://mailman.videolan.org/listinfo/vlc-devel</a></blockquote></div></div></div>