Browse Source

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>
tags/n1.0
Derek Buitenhuis 13 years ago
parent
commit
fcf550c2cb
1 changed files with 6 additions and 5 deletions
  1. +6
    -5
      libavcodec/zerocodec.c

+ 6
- 5
libavcodec/zerocodec.c View File

@@ -51,17 +51,17 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, void *data,
pic->pict_type = AV_PICTURE_TYPE_P; 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); zret = inflateReset(zstream);
if (zret != Z_OK) { if (zret != Z_OK) {
av_log(avctx, AV_LOG_ERROR, "Could not reset inflate: %d.\n", zret); av_log(avctx, AV_LOG_ERROR, "Could not reset inflate: %d.\n", zret);
return AVERROR_INVALIDDATA; 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->next_in = avpkt->data;
zstream->avail_in = avpkt->size; zstream->avail_in = avpkt->size;


@@ -78,6 +78,7 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, void *data,


zret = inflate(zstream, Z_SYNC_FLUSH); zret = inflate(zstream, Z_SYNC_FLUSH);
if (zret != Z_OK && zret != Z_STREAM_END) { if (zret != Z_OK && zret != Z_STREAM_END) {
avctx->release_buffer(avctx, pic);
av_log(avctx, AV_LOG_ERROR, av_log(avctx, AV_LOG_ERROR,
"Inflate failed with return code: %d.\n", zret); "Inflate failed with return code: %d.\n", zret);
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;


Loading…
Cancel
Save