]> git.sesse.net Git - vlc/commitdiff
modules: fix race in module_Map()
authorRémi Denis-Courmont <remi@remlab.net>
Thu, 2 Oct 2014 17:44:33 +0000 (20:44 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Thu, 2 Oct 2014 17:44:33 +0000 (20:44 +0300)
src/modules/bank.c

index 6655f006656adf205b37d4a5888bbacff5a7692d..f4fba50e301488042ef55dbd0e9185db880b090f 100644 (file)
@@ -639,23 +639,31 @@ static module_t *module_InitStatic (vlc_plugin_cb entry)
  */
 int module_Map (vlc_object_t *obj, module_t *module)
 {
+    static vlc_mutex_t lock = VLC_STATIC_MUTEX;
+
     if (module->parent != NULL)
         module = module->parent;
 
-#warning FIXME: race condition!
-    if (module->b_loaded)
-        return 0;
-    assert (module->psz_filename != NULL);
+    vlc_mutex_lock(&lock);
+    if (!module->b_loaded)
+    {
+        module_t *uncache;
 
+        assert (module->psz_filename != NULL);
 #ifdef HAVE_DYNAMIC_PLUGINS
-    module_t *uncache = module_InitDynamic (obj, module->psz_filename, false);
-    if (uncache != NULL)
-    {
-        CacheMerge (obj, module, uncache);
-        vlc_module_destroy (uncache);
-        return 0;
-    }
+        uncache = module_InitDynamic (obj, module->psz_filename, false);
+        if (uncache != NULL)
+        {
+            CacheMerge (obj, module, uncache);
+            vlc_module_destroy (uncache);
+        }
+        else
 #endif
-    msg_Err (obj, "corrupt module: %s", module->psz_filename);
-    return -1;
+        {
+            msg_Err (obj, "corrupt module: %s", module->psz_filename);
+            module = NULL;
+        }
+    }
+    vlc_mutex_unlock(&lock);
+    return -(module == NULL);
 }