gst: deviceprovider: take a ref to devices

When _probe() is called, take a ref to the newly created devices instead
if sinking the floating ref, since gst_clear_object() is called when
core is disconnected. Otherwise the devices will be freed before the
caller gets them.

Fixes the following assert in the caller:

g_object_is_floating: assertion 'G_IS_OBJECT (object)' failed

Or sometimes a segfault with the backtrace:

0  g_type_check_instance_is_fundamentally_a (type_instance=type_instance@entry=0x116c1b0, fundamental_type=fundamental_type@entry=80) at /usr/src/debug/glib-2.0/2.84.0/gobject/gtype.c:3918
1  0xb6d40cc6 in g_object_is_floating (_object=0x116c1b0) at /usr/src/debug/glib-2.0/2.84.0/gobject/gobject.c:3843
2  0xb6bc4c74 in gst_device_provider_get_devices (provider=0x109ba00) at /usr/src/debug/gstreamer1.0/1.24.12/gst/gstdeviceprovider.c:426
This commit is contained in:
Jonas Holmberg 2025-06-09 16:36:05 +02:00 committed by Wim Taymans
parent 83ada1e086
commit 269f42430e

View file

@ -324,7 +324,7 @@ static void do_add_nodes(GstPipeWireDeviceProvider *self)
if(self->list_only) {
self->devices = g_list_insert_sorted (self->devices,
gst_object_ref_sink (device),
gst_object_ref (device),
compare_device_session_priority);
} else {
gst_object_ref (device);