]> git.sesse.net Git - vlc/commitdiff
mmal/codec: Fix buffer leak
authorJulian Scheel <julian@jusst.de>
Mon, 19 Jan 2015 10:30:22 +0000 (11:30 +0100)
committerRémi Denis-Courmont <remi@remlab.net>
Tue, 20 Jan 2015 06:06:32 +0000 (08:06 +0200)
If buffers were discarded because of wrong size or type a mmal buffer header
would be leaked each time.

Signed-off-by: Julian Scheel <julian@jusst.de>
Signed-off-by: Rémi Denis-Courmont <remi@remlab.net>
modules/hw/mmal/codec.c

index b98b6fa81353eba78d6bf52bc7edfd735634ddab..a8e4c312d05601abe3e099d1defec77c9d74c63e 100644 (file)
@@ -408,9 +408,8 @@ static int send_output_buffer(decoder_t *dec)
     picture = decoder_NewPicture(dec);
     if (!picture) {
         msg_Warn(dec, "Failed to get new picture");
-        mmal_buffer_header_release(buffer);
         ret = -1;
-        goto out;
+        goto err;
     }
 
     p_sys = picture->p_sys;
@@ -426,7 +425,7 @@ static int send_output_buffer(decoder_t *dec)
         if (p_sys->buffer == NULL) {
             msg_Err(dec, "Retrieved picture without opaque handle");
             ret = VLC_EGENERIC;
-            goto out;
+            goto err;
         }
         buffer->data = p_sys->buffer->data;
     } else {
@@ -434,7 +433,7 @@ static int send_output_buffer(decoder_t *dec)
             msg_Err(dec, "Retrieved picture with too small data block (%d < %d)",
                     buffer_size, sys->output->buffer_size);
             ret = VLC_EGENERIC;
-            goto out;
+            goto err;
         }
         buffer->data = picture->p[0].p_pixels;
     }
@@ -443,14 +442,18 @@ static int send_output_buffer(decoder_t *dec)
     if (status != MMAL_SUCCESS) {
         msg_Err(dec, "Failed to send buffer to output port (status=%"PRIx32" %s)",
                 status, mmal_status_to_string(status));
-        mmal_buffer_header_release(buffer);
-        picture_Release(picture);
         ret = -1;
-        goto out;
+        goto err;
     }
 
 out:
     return ret;
+
+err:
+    if (picture)
+        picture_Release(picture);
+    mmal_buffer_header_release(buffer);
+    return ret;
 }
 
 static void fill_output_port(decoder_t *dec)