diff options
author | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2012-01-12 21:52:22 +0100 |
---|---|---|
committer | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2012-01-13 19:51:19 +0100 |
commit | 4cef928ef71339840222b75b04fca11676b13fe5 (patch) | |
tree | 1e6bcc690535c02c4bddaa80b0cd737cd01b365c | |
parent | ad12d60d731d7ed23192eff6113db015434c1e24 (diff) | |
download | ffmpeg-4cef928ef71339840222b75b04fca11676b13fe5.tar.gz |
j2kdec: Fix memleak, ensure cleanup is called also on error.
Fixes valgrind fate with fate-suite/r3d/4MB-sample.r3d.
Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
-rw-r--r-- | libavcodec/j2kdec.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/libavcodec/j2kdec.c b/libavcodec/j2kdec.c index 1f4cdebdfb..78a24698a2 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) |