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, ®istry_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