[FFmpeg-devel] [PATCH] j2kdec: Fix memleak, ensure cleanup is called also on error.

Reimar Döffinger Reimar.Doeffinger at gmx.de
Thu Jan 12 21:52:22 CET 2012


Fixes valgrind fate with fate-suite/r3d/4MB-sample.r3d.

Signed-off-by: Reimar Döffinger <Reimar.Doeffinger at gmx.de>
---
 libavcodec/j2kdec.c |   20 ++++++++++++++------
 1 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/libavcodec/j2kdec.c b/libavcodec/j2kdec.c
index 1f4cdeb..78a2469 100644
--- a/libavcodec/j2kdec.c
+++ b/libavcodec/j2kdec.c
@@ -1015,8 +1015,10 @@ static int decode_frame(AVCodecContext *avctx,
 
     ff_j2k_init_tier1_luts();
 
-    if (s->buf_end - s->buf < 2)
-        return AVERROR(EINVAL);
+    if (s->buf_end - s->buf < 2) {
+        ret = AVERROR(EINVAL);
+        goto err_out;
+    }
 
     // check if the image is in jp2 format
     if(s->buf_end - s->buf >= 12 &&
@@ -1024,20 +1026,22 @@ static int decode_frame(AVCodecContext *avctx,
        (AV_RB32(s->buf + 8) == JP2_SIG_VALUE)) {
         if(!jp2_find_codestream(s)) {
             av_log(avctx, AV_LOG_ERROR, "couldn't find jpeg2k codestream atom\n");
-            return -1;
+            ret = -1;
+            goto err_out;
         }
     }
 
     if (bytestream_get_be16(&s->buf) != J2K_SOC){
         av_log(avctx, AV_LOG_ERROR, "SOC marker not present\n");
-        return -1;
+        ret = -1;
+        goto err_out;
     }
     if (ret = decode_codestream(s))
-        return ret;
+        goto err_out;
 
     for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++)
         if (ret = decode_tile(s, s->tile + tileno))
-            return ret;
+            goto err_out;
 
     cleanup(s);
     av_log(s->avctx, AV_LOG_DEBUG, "end\n");
@@ -1046,6 +1050,10 @@ static int decode_frame(AVCodecContext *avctx,
     *picture = s->picture;
 
     return s->buf - s->buf_start;
+
+err_out:
+    cleanup(s);
+    return ret;
 }
 
 static av_cold int j2kdec_init(AVCodecContext *avctx)
-- 
1.7.8.3



More information about the ffmpeg-devel mailing list