From f6bc9113cef765d363e8af6e0e8d3379c8b09c1e Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 11 Sep 2020 16:39:05 +0200 Subject: [PATCH] gst: stop the thread loop before destroying objects When we destroy the proxy we should either take the thread lock or stop the thread loop because the destroy might trigger a reply to remove the object from another thread. This can cause the refcounting to become invalid and cause double free. Fixes #286 --- src/gst/gstpipewiredeviceprovider.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gst/gstpipewiredeviceprovider.c b/src/gst/gstpipewiredeviceprovider.c index 755eb1c8d..f7c7724c6 100644 --- a/src/gst/gstpipewiredeviceprovider.c +++ b/src/gst/gstpipewiredeviceprovider.c @@ -571,6 +571,7 @@ gst_pipewire_device_provider_probe (GstDeviceProvider * provider) GST_DEBUG_OBJECT (self, "disconnect"); pw_proxy_destroy ((struct pw_proxy*)data->registry); pw_core_disconnect (self->core); + self->core = NULL; pw_context_destroy (c); pw_loop_destroy (l); @@ -660,6 +661,9 @@ gst_pipewire_device_provider_stop (GstDeviceProvider * provider) GstPipeWireDeviceProvider *self = GST_PIPEWIRE_DEVICE_PROVIDER (provider); GST_DEBUG_OBJECT (self, "stopping provider"); + if (self->loop) + pw_thread_loop_stop (self->loop); + if (self->registry) { pw_proxy_destroy ((struct pw_proxy*)self->registry); self->registry = NULL;