multiqueue: Fix query unref race on flush

If the query has already been destroyed at this point, GST_IS_QUERY will
read garbage, can return false and we will try to unref it again.
Instead, make note of whether the item is a query when we dequeue it.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1029>
This commit is contained in:
Jan Alexander Steffens (heftig) 2021-10-04 13:49:44 +02:00 committed by Sebastian Dröge
parent c4e14ef426
commit 5aa825d004

View file

@ -2091,7 +2091,7 @@ gst_multi_queue_loop (GstPad * pad)
guint32 newid;
GstFlowReturn result;
GstClockTimeDiff next_time;
gboolean is_buffer;
gboolean is_buffer, is_query;
gboolean do_update_buffering = FALSE;
gboolean dropping = FALSE;
GstPad *srcpad = NULL;
@ -2117,6 +2117,8 @@ next:
item = (GstMultiQueueItem *) sitem;
newid = item->posid;
is_query = item->is_query;
/* steal the object and destroy the item */
object = gst_multi_queue_item_steal_object (item);
gst_multi_queue_item_destroy (item);
@ -2362,7 +2364,7 @@ done:
out_flushing:
{
if (object && !GST_IS_QUERY (object))
if (object && !is_query)
gst_mini_object_unref (object);
GST_MULTI_QUEUE_MUTEX_LOCK (mq);