aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>2012-01-12 21:52:22 +0100
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>2012-01-13 19:51:19 +0100
commit4cef928ef71339840222b75b04fca11676b13fe5 (patch)
tree1e6bcc690535c02c4bddaa80b0cd737cd01b365c
parentad12d60d731d7ed23192eff6113db015434c1e24 (diff)
downloadffmpeg-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.c20
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)