diff options
author | Derek Buitenhuis <derek.buitenhuis@gmail.com> | 2012-08-04 06:13:43 +0400 |
---|---|---|
committer | Derek Buitenhuis <derek.buitenhuis@gmail.com> | 2012-08-04 23:08:52 +0400 |
commit | fcf550c2cbc35c1c4d90f8d23bb3340ebc31ce46 (patch) | |
tree | 737c28af7a481808b0e84bb78d7d2c868ba7bc28 /libavcodec/zerocodec.c | |
parent | d6124d0d142a9246b3580a3eccb671d727b7e504 (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.c | 11 |
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; |