[FFmpeg-cvslog] zerocodec: Fix memleak in decode_frame

Derek Buitenhuis git at videolan.org
Sun Aug 5 23:06:30 CEST 2012


ffmpeg | branch: master | Derek Buitenhuis <derek.buitenhuis at gmail.com> | Fri Aug  3 22:13:43 2012 -0400| [616fd4fe5e2985f31e2ae1aee0558e73390437a0] | committer: Derek Buitenhuis

zerocodec: Fix memleak in decode_frame

If there was a failure inflating, or reinitializing
the zstream, the current frame's buffer would be lost.

Signed-off-by: Derek Buitenhuis <derek.buitenhuis at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=616fd4fe5e2985f31e2ae1aee0558e73390437a0
---

 libavcodec/zerocodec.c |   11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/libavcodec/zerocodec.c b/libavcodec/zerocodec.c
index 8d46bfd..cfbd16f 100644
--- a/libavcodec/zerocodec.c
+++ b/libavcodec/zerocodec.c
@@ -51,17 +51,17 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, void *data,
         pic->pict_type = AV_PICTURE_TYPE_P;
     }
 
-    if (avctx->get_buffer(avctx, pic) < 0) {
-        av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer.\n");
-        return AVERROR(ENOMEM);
-    }
-
     zret = inflateReset(zstream);
     if (zret != Z_OK) {
         av_log(avctx, AV_LOG_ERROR, "Could not reset inflate: %d.\n", zret);
         return AVERROR_INVALIDDATA;
     }
 
+    if (avctx->get_buffer(avctx, pic) < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer.\n");
+        return AVERROR(ENOMEM);
+    }
+
     zstream->next_in  = avpkt->data;
     zstream->avail_in = avpkt->size;
 
@@ -78,6 +78,7 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, void *data,
 
         zret = inflate(zstream, Z_SYNC_FLUSH);
         if (zret != Z_OK && zret != Z_STREAM_END) {
+            avctx->release_buffer(avctx, pic);
             av_log(avctx, AV_LOG_ERROR,
                    "Inflate failed with return code: %d.\n", zret);
             return AVERROR_INVALIDDATA;



More information about the ffmpeg-cvslog mailing list