summaryrefslogtreecommitdiff
path: root/libavcodec/zerocodec.c
diff options
context:
space:
mode:
authorDerek Buitenhuis <derek.buitenhuis@gmail.com>2012-08-03 22:13:43 -0400
committerDerek Buitenhuis <derek.buitenhuis@gmail.com>2012-08-04 15:11:06 -0400
commit616fd4fe5e2985f31e2ae1aee0558e73390437a0 (patch)
treef745134b3798c17890e59379b24a8045b653c692 /libavcodec/zerocodec.c
parent29facc1e916c4be0324b41634c1d0b8c5fd31fa8 (diff)
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@gmail.com>
Diffstat (limited to 'libavcodec/zerocodec.c')
-rw-r--r--libavcodec/zerocodec.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/libavcodec/zerocodec.c b/libavcodec/zerocodec.c
index 8d46bfdcf8..cfbd16f147 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;