From 156ca3965ea3311826bebc77e400c77e165336e5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= <remi@remlab.net>
Date: Mon, 28 Oct 2019 06:23:30 +0200
Subject: [PATCH] Wayland: fix race when setting the queue

The queue cannot be set on live object that receives events.
See wl_proxy_create_wrapper() documentation for details.
---
 modules/video_output/wayland/registry.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/modules/video_output/wayland/registry.c b/modules/video_output/wayland/registry.c
index 02be60d717c5..77fc83dee533 100644
--- a/modules/video_output/wayland/registry.c
+++ b/modules/video_output/wayland/registry.c
@@ -227,18 +227,20 @@ struct vlc_wl_registry *vlc_wl_registry_get(struct wl_display *display,
     if (unlikely(vr == NULL))
         return NULL;
 
-    vr->registry = wl_display_get_registry(display);
+    struct wl_display *wrapper = wl_proxy_create_wrapper(display);
+    if (unlikely(wrapper == NULL))
+        goto error;
+
+    wl_proxy_set_queue((struct wl_proxy *)wrapper, queue);
+    vr->registry = wl_display_get_registry(wrapper);
+    wl_proxy_wrapper_destroy(wrapper);
+
     if (unlikely(vr->registry == NULL))
-    {
-        free(vr);
-        return NULL;
-    }
+        goto error;
 
     vr->interfaces = NULL;
     vr->names = NULL;
 
-    /* FIXME: setting queue is not thread safe */
-    wl_proxy_set_queue((struct wl_proxy *)vr->registry, queue);
     wl_registry_add_listener(vr->registry, &registry_cbs, vr);
 
      /* complete registry enumeration */
@@ -248,6 +250,9 @@ struct vlc_wl_registry *vlc_wl_registry_get(struct wl_display *display,
         vr = NULL;
     }
 
+    return vr;
+error:
+    free(vr);
     return vr;
 }
 
-- 
GitLab