queue2: Hold the lock when modifying sinkresult
authorEdward Hervey <edward@centricular.com>
Mon, 3 Oct 2022 09:16:25 +0000 (11:16 +0200)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Mon, 3 Oct 2022 15:18:09 +0000 (15:18 +0000)
As it's done elsewhere. Avoids a potential race of the field being modified in
the meantime.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3110>

subprojects/gstreamer/plugins/elements/gstqueue2.c

index a7b160c..d50435c 100644 (file)
@@ -2675,12 +2675,14 @@ gst_queue2_handle_sink_event (GstPad * pad, GstObject * parent,
 
         /* STREAM_START and SEGMENT reset the EOS status of a
          * pad. Change the cached sinkpad flow result accordingly */
+        GST_QUEUE2_MUTEX_LOCK (queue);
         if (queue->sinkresult == GST_FLOW_EOS
             && (GST_EVENT_TYPE (event) == GST_EVENT_STREAM_START
                 || GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT))
           queue->sinkresult = GST_FLOW_OK;
+        else if (queue->sinkresult != GST_FLOW_OK)
+          goto out_flushing;
 
-        GST_QUEUE2_MUTEX_LOCK_CHECK (queue, queue->sinkresult, out_flushing);
         if (queue->srcresult != GST_FLOW_OK) {
           /* Errors in sticky event pushing are no problem and ignored here
            * as they will cause more meaningful errors during data flow.