v4l2object: Don't leak downstream pool in propose_allocation
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Wed, 16 Apr 2014 21:04:42 +0000 (17:04 -0400)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 8 May 2014 19:56:36 +0000 (15:56 -0400)
parse_nth_allocation_pool() give a ref on the pool, we need to unref it
when done.

sys/v4l2/gstv4l2object.c

index f70e666..37fe033 100644 (file)
@@ -3120,7 +3120,7 @@ gst_v4l2_object_decide_allocation (GstV4l2Object * obj, GstQuery * query)
         /* no downstream pool, use our own then */
         GST_DEBUG_OBJECT (obj->element,
             "read/write mode: no downstream pool, using our own");
-        pool = obj->pool;
+        pool = gst_object_ref (obj->pool);
         size = obj->sizeimage;
       }
       break;
@@ -3134,7 +3134,7 @@ gst_v4l2_object_decide_allocation (GstV4l2Object * obj, GstQuery * query)
       if (can_use_own_pool) {
         if (pool)
           gst_object_unref (pool);
-        pool = obj->pool;
+        pool = gst_object_ref (obj->pool);
         size = obj->sizeimage;
         GST_DEBUG_OBJECT (obj->element,
             "streaming mode: using our own pool %" GST_PTR_FORMAT, pool);
@@ -3224,23 +3224,32 @@ done:
   else
     gst_query_add_allocation_pool (query, pool, size, min, max);
 
+  if (pool)
+    gst_object_unref (pool);
+
   return TRUE;
 
 pool_failed:
   {
     /* setup_pool already send the error */
-    return FALSE;
+    goto cleanup;
   }
 config_failed:
   {
     GST_ELEMENT_ERROR (obj->element, RESOURCE, SETTINGS,
         (_("Failed to configure internal buffer pool.")), (NULL));
-    return FALSE;
+    goto cleanup;
   }
 no_size:
   {
     GST_ELEMENT_ERROR (obj->element, RESOURCE, SETTINGS,
         (_("Video device did not suggest any buffer size.")), (NULL));
+    goto cleanup;
+  }
+cleanup:
+  {
+    if (pool)
+      gst_object_unref (pool);
     return FALSE;
   }
 }