From e72d2d12216844a692d7211f97abfbc1867fb01d Mon Sep 17 00:00:00 2001 From: David Conrad Date: Tue, 9 Mar 2010 00:29:16 +0000 Subject: [PATCH] vp3: Don't leak buffers on errors Originally committed as revision 22358 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/vp3.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c index 4e81246bf4..2963686ea3 100644 --- a/libavcodec/vp3.c +++ b/libavcodec/vp3.c @@ -1812,7 +1812,7 @@ static int vp3_decode_frame(AVCodecContext *avctx, s->current_frame.reference = 3; if (avctx->get_buffer(avctx, &s->current_frame) < 0) { av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n"); - return -1; + goto error; } if (s->keyframe) { @@ -1836,8 +1836,7 @@ static int vp3_decode_frame(AVCodecContext *avctx, } else { if (!s->golden_frame.data[0]) { av_log(s->avctx, AV_LOG_ERROR, "vp3: first frame not a keyframe\n"); - avctx->release_buffer(avctx, &s->current_frame); - return -1; + goto error; } } @@ -1848,23 +1847,23 @@ static int vp3_decode_frame(AVCodecContext *avctx, if (unpack_superblocks(s, &gb)){ av_log(s->avctx, AV_LOG_ERROR, "error in unpack_superblocks\n"); - return -1; + goto error; } if (unpack_modes(s, &gb)){ av_log(s->avctx, AV_LOG_ERROR, "error in unpack_modes\n"); - return -1; + goto error; } if (unpack_vectors(s, &gb)){ av_log(s->avctx, AV_LOG_ERROR, "error in unpack_vectors\n"); - return -1; + goto error; } if (unpack_block_qpis(s, &gb)){ av_log(s->avctx, AV_LOG_ERROR, "error in unpack_block_qpis\n"); - return -1; + goto error; } if (unpack_dct_coeffs(s, &gb)){ av_log(s->avctx, AV_LOG_ERROR, "error in unpack_dct_coeffs\n"); - return -1; + goto error; } for (i = 0; i < 3; i++) { @@ -1906,6 +1905,11 @@ static int vp3_decode_frame(AVCodecContext *avctx, s->current_frame.data[0]= NULL; /* ensure that we catch any access to this released frame */ return buf_size; + +error: + if (s->current_frame.data[0]) + avctx->release_buffer(avctx, &s->current_frame); + return -1; } /*