From 29bbd7983074130168ca5f6aa3ccfa58fef40b31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Barnab=C3=A1s=20P=C5=91cze?= Date: Wed, 24 Dec 2025 01:10:04 +0100 Subject: [PATCH] gst: deviceprovider: unregister `pw_core` event hooks A `pw_core` may be shared between multiple streams, device provider instances, thus when the reference of the given component to the core is dropped, the event handlers must be unregistered so as to avoid use-after-free and similar issues. Fixes #5030 Fixes: 2bc3e0ca1011a9 ("gst: deviceprodiver: Use GstPipeWireCore and some cleanups") --- src/gst/gstpipewiredeviceprovider.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gst/gstpipewiredeviceprovider.c b/src/gst/gstpipewiredeviceprovider.c index 744cf2752..4ba265a66 100644 --- a/src/gst/gstpipewiredeviceprovider.c +++ b/src/gst/gstpipewiredeviceprovider.c @@ -792,6 +792,7 @@ gst_pipewire_device_provider_probe (GstDeviceProvider * provider) GST_DEBUG_OBJECT (self, "disconnect"); g_clear_pointer ((struct pw_proxy**)&self->registry, pw_proxy_destroy); + spa_hook_remove (&self->core_listener); pw_thread_loop_unlock (self->core->loop); g_clear_pointer (&self->core, gst_pipewire_core_release); @@ -866,6 +867,7 @@ gst_pipewire_device_provider_stop (GstDeviceProvider * provider) g_clear_pointer ((struct pw_proxy**)&self->registry, pw_proxy_destroy); if (self->core != NULL) { + spa_hook_remove (&self->core_listener); pw_thread_loop_unlock (self->core->loop); } g_clear_pointer (&self->core, gst_pipewire_core_release);