v4l2: Block recursive calls to resurect_buffer
authorMatt Fischer <matt.fischer@garmin.com>
Wed, 28 Jun 2017 19:05:27 +0000 (14:05 -0500)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 29 Jun 2017 19:54:42 +0000 (15:54 -0400)
When resurrecting a buffer, the subsequent free call can result
in the group-released handler being called again, which causes
a recursive loop.  This patch blocks the signal handler during
the time that it executes, ensuring that the loop will not occur.

https://bugzilla.gnome.org/show_bug.cgi?id=759292

sys/v4l2/gstv4l2bufferpool.c

index 5a58dc2..16abfcc 100644 (file)
@@ -680,6 +680,9 @@ gst_v4l2_buffer_pool_resurect_buffer (GstV4l2BufferPool * pool)
 
   GST_DEBUG_OBJECT (pool, "A buffer was lost, reallocating it");
 
+  /* block recursive calls to this function */
+  g_signal_handler_block (pool->vallocator, pool->group_released_handler);
+
   params.flags =
       (GstBufferPoolAcquireFlags) GST_V4L2_BUFFER_POOL_ACQUIRE_FLAG_RESURRECT |
       GST_BUFFER_POOL_ACQUIRE_FLAG_DONTWAIT;
@@ -689,6 +692,8 @@ gst_v4l2_buffer_pool_resurect_buffer (GstV4l2BufferPool * pool)
   if (ret == GST_FLOW_OK)
     gst_buffer_unref (buffer);
 
+  g_signal_handler_unblock (pool->vallocator, pool->group_released_handler);
+
   return ret;
 }