ducatividdec: fix buffer leaks on error paths
authorVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Wed, 27 Jun 2012 11:23:53 +0000 (11:23 +0000)
committerVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Wed, 27 Jun 2012 11:23:53 +0000 (11:23 +0000)
src/gstducatividdec.c

index bebba5a17654d79904fde223214dc89a07b4f56d..198b69ecb31382915f9fc9fdf106db8fe38ed46f 100644 (file)
@@ -928,6 +928,7 @@ gst_ducati_viddec_chain (GstPad * pad, GstBuffer * buf)
 
   if (G_UNLIKELY (!self->engine)) {
     GST_ERROR_OBJECT (self, "no engine");
 
   if (G_UNLIKELY (!self->engine)) {
     GST_ERROR_OBJECT (self, "no engine");
+    gst_buffer_unref (buf);
     return GST_FLOW_ERROR;
   }
 
     return GST_FLOW_ERROR;
   }
 
@@ -952,6 +953,7 @@ allocate_buffer:
   if (ret != GST_FLOW_OK) {
     GST_WARNING_OBJECT (self, "alloc_buffer failed %s",
         gst_flow_get_name (ret));
   if (ret != GST_FLOW_OK) {
     GST_WARNING_OBJECT (self, "alloc_buffer failed %s",
         gst_flow_get_name (ret));
+    gst_buffer_unref (buf);
     return ret;
   }
 
     return ret;
   }
 
@@ -983,6 +985,8 @@ allocate_buffer:
   if (G_UNLIKELY (!self->codec)) {
     if (!codec_create (self)) {
       GST_ERROR_OBJECT (self, "could not create codec");
   if (G_UNLIKELY (!self->codec)) {
     if (!codec_create (self)) {
       GST_ERROR_OBJECT (self, "could not create codec");
+      gst_buffer_unref (buf);
+      gst_buffer_unref (outbuf);
       return GST_FLOW_ERROR;
     }
   }
       return GST_FLOW_ERROR;
     }
   }
@@ -997,6 +1001,7 @@ allocate_buffer:
       codec_prepare_outbuf (self, &outbuf, self->first_out_buffer);
   if (!self->inArgs->inputID) {
     GST_ERROR_OBJECT (self, "could not prepare output buffer");
       codec_prepare_outbuf (self, &outbuf, self->first_out_buffer);
   if (!self->inArgs->inputID) {
     GST_ERROR_OBJECT (self, "could not prepare output buffer");
+    gst_buffer_unref (buf);
     return GST_FLOW_ERROR;
   }
 
     return GST_FLOW_ERROR;
   }