ximagesrc: Add missing return value to Buffer dispose function
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 24 Jul 2014 19:28:09 +0000 (15:28 -0400)
committerNicolas Dufresne <nicolas.dufresne@collabora.co.uk>
Thu, 31 Jul 2014 13:14:10 +0000 (09:14 -0400)
Depending ont he build, the method could return FALSE, hence never
free the buffers, or already TRUE and lead to a crash:

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

sys/ximage/gstximagesrc.c
sys/ximage/ximageutil.c
sys/ximage/ximageutil.h

index 17f4a4e..8058a95 100644 (file)
@@ -85,10 +85,12 @@ static GstCaps *gst_ximage_src_fixate (GstBaseSrc * bsrc, GstCaps * caps);
 static void gst_ximage_src_clear_bufpool (GstXImageSrc * ximagesrc);
 
 /* Called when a buffer is returned from the pipeline */
-static void
+static gboolean
 gst_ximage_src_return_buf (GstXImageSrc * ximagesrc, GstBuffer * ximage)
 {
   GstMetaXImage *meta = GST_META_XIMAGE_GET (ximage);
+  /* True will make dispose free the buffer, while false will keep it */
+  gboolean ret = TRUE;
 
   /* If our geometry changed we can't reuse that image. */
   if ((meta->width != ximagesrc->width) || (meta->height != ximagesrc->height)) {
@@ -107,7 +109,10 @@ gst_ximage_src_return_buf (GstXImageSrc * ximagesrc, GstBuffer * ximage)
     GST_BUFFER_FLAGS (GST_BUFFER (ximage)) = 0; /* clear out any flags from the previous use */
     ximagesrc->buffer_pool = g_slist_prepend (ximagesrc->buffer_pool, ximage);
     g_mutex_unlock (&ximagesrc->pool_lock);
+    ret = FALSE;
   }
+
+  return ret;
 }
 
 static Window
index 76d2866..a96a515 100644 (file)
@@ -314,11 +314,12 @@ ximageutil_calculate_pixel_aspect_ratio (GstXContext * xcontext)
   GST_DEBUG ("set xcontext PAR to %d/%d\n", xcontext->par_n, xcontext->par_d);
 }
 
-static void
+static gboolean
 gst_ximagesrc_buffer_dispose (GstBuffer * ximage)
 {
   GstElement *parent;
   GstMetaXImage *meta;
+  gboolean ret = TRUE;
 
   g_return_if_fail (ximage != NULL);
 
@@ -331,10 +332,10 @@ gst_ximagesrc_buffer_dispose (GstBuffer * ximage)
   }
 
   if (meta->return_func)
-    meta->return_func (parent, ximage);
+    ret = meta->return_func (parent, ximage);
 
 beach:
-  return;
+  return ret;
 }
 
 void
index d5e88fa..cd2e889 100644 (file)
@@ -134,7 +134,7 @@ void ximageutil_calculate_pixel_aspect_ratio (GstXContext * xcontext);
 /* custom ximagesrc buffer, copied from ximagesink */
 
 /* BufferReturnFunc is called when a buffer is finalised */
-typedef void (*BufferReturnFunc) (GstElement *parent, GstBuffer *buf);
+typedef gboolean (*BufferReturnFunc) (GstElement *parent, GstBuffer *buf);
 
 /**
  * GstMetaXImage: