bin: When copying the sort iterator, also copy its internal queue

Otherwise both iterators share the same references, the second one
usually resulting in a crash when being freed.

https://bugzilla.gnome.org/show_bug.cgi?id=771649
This commit is contained in:
Kouhei Sutou 2016-09-19 10:04:55 -04:00 committed by Sebastian Dröge
parent b724894b27
commit a195e47633

View file

@ -1945,6 +1945,16 @@ typedef struct _GstBinSortIterator
gboolean dirty; /* we detected structure change */
} GstBinSortIterator;
static void
copy_to_queue (gpointer data, gpointer user_data)
{
GstElement *element = data;
GQueue *queue = user_data;
gst_object_ref (element);
g_queue_push_tail (queue, element);
}
static void
gst_bin_sort_iterator_copy (const GstBinSortIterator * it,
GstBinSortIterator * copy)
@ -1952,8 +1962,8 @@ gst_bin_sort_iterator_copy (const GstBinSortIterator * it,
GHashTableIter iter;
gpointer key, value;
copy->queue = it->queue;
g_queue_foreach (&copy->queue, (GFunc) gst_object_ref, NULL);
g_queue_init (&copy->queue);
g_queue_foreach (&it->queue, copy_to_queue, &copy->queue);
copy->bin = gst_object_ref (it->bin);
if (it->best)