changeset 11420:57e3c39078bf libavcodec

vp3: Don't leak buffers on errors
author conrad
date Tue, 09 Mar 2010 00:29:16 +0000
parents 4d701a8bbb5e
children 438b6d4096a8
files vp3.c
diffstat 1 files changed, 12 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/vp3.c	Tue Mar 09 00:29:12 2010 +0000
+++ b/vp3.c	Tue Mar 09 00:29:16 2010 +0000
@@ -1812,7 +1812,7 @@
     s->current_frame.reference = 3;
     if (avctx->get_buffer(avctx, &s->current_frame) < 0) {
         av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
-        return -1;
+        goto error;
     }
 
     if (s->keyframe) {
@@ -1836,8 +1836,7 @@
     } else {
         if (!s->golden_frame.data[0]) {
             av_log(s->avctx, AV_LOG_ERROR, "vp3: first frame not a keyframe\n");
-            avctx->release_buffer(avctx, &s->current_frame);
-            return -1;
+            goto error;
         }
     }
 
@@ -1848,23 +1847,23 @@
 
     if (unpack_superblocks(s, &gb)){
         av_log(s->avctx, AV_LOG_ERROR, "error in unpack_superblocks\n");
-        return -1;
+        goto error;
     }
     if (unpack_modes(s, &gb)){
         av_log(s->avctx, AV_LOG_ERROR, "error in unpack_modes\n");
-        return -1;
+        goto error;
     }
     if (unpack_vectors(s, &gb)){
         av_log(s->avctx, AV_LOG_ERROR, "error in unpack_vectors\n");
-        return -1;
+        goto error;
     }
     if (unpack_block_qpis(s, &gb)){
         av_log(s->avctx, AV_LOG_ERROR, "error in unpack_block_qpis\n");
-        return -1;
+        goto error;
     }
     if (unpack_dct_coeffs(s, &gb)){
         av_log(s->avctx, AV_LOG_ERROR, "error in unpack_dct_coeffs\n");
-        return -1;
+        goto error;
     }
 
     for (i = 0; i < 3; i++) {
@@ -1906,6 +1905,11 @@
     s->current_frame.data[0]= NULL; /* ensure that we catch any access to this released frame */
 
     return buf_size;
+
+error:
+    if (s->current_frame.data[0])
+        avctx->release_buffer(avctx, &s->current_frame);
+    return -1;
 }
 
 /*