From 8b27f76bf8790536afccb96780b5feb9c65636be Mon Sep 17 00:00:00 2001 From: Benoit Fouet Date: Tue, 30 Sep 2008 09:54:13 +0000 Subject: Check allocations on init. Originally committed as revision 15476 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/indeo3.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) (limited to 'libavcodec/indeo3.c') diff --git a/libavcodec/indeo3.c b/libavcodec/indeo3.c index a0e946ffef..3d5a568c9e 100644 --- a/libavcodec/indeo3.c +++ b/libavcodec/indeo3.c @@ -62,11 +62,12 @@ static const uint8_t corrector_type_0[24] = { static const uint8_t corrector_type_2[8] = { 9, 7, 6, 8, 5, 4, 3, 2 }; -static av_cold void build_modpred(Indeo3DecodeContext *s) +static av_cold int build_modpred(Indeo3DecodeContext *s) { int i, j; - s->ModPred = av_malloc(8 * 128); + if (!(s->ModPred = av_malloc(8 * 128))) + return AVERROR(ENOMEM); for (i=0; i < 128; ++i) { s->ModPred[i+0*128] = i > 126 ? 254 : 2*(i + 1 - ((i + 1) % 2)); @@ -81,7 +82,8 @@ static av_cold void build_modpred(Indeo3DecodeContext *s) s->ModPred[i+7*128] = 2*(i + 5 - ((i + 4) % 9)); } - s->corrector_type = av_malloc(24 * 256); + if (!(s->corrector_type = av_malloc(24 * 256))) + return AVERROR(ENOMEM); for (i=0; i < 24; ++i) { for (j=0; j < 256; ++j) { @@ -90,6 +92,8 @@ static av_cold void build_modpred(Indeo3DecodeContext *s) corrector_type_2[j - 248]; } } + + return 0; } static void iv_Decode_Chunk(Indeo3DecodeContext *s, uint8_t *cur, @@ -98,7 +102,7 @@ static void iv_Decode_Chunk(Indeo3DecodeContext *s, uint8_t *cur, const uint8_t *buf2, int min_width_160); /* ---------------------------------------------------------------------- */ -static av_cold void iv_alloc_frames(Indeo3DecodeContext *s) +static av_cold int iv_alloc_frames(Indeo3DecodeContext *s) { int luma_width, luma_height, luma_pixels, chroma_width, chroma_height, chroma_pixels, i; @@ -122,7 +126,7 @@ static av_cold void iv_alloc_frames(Indeo3DecodeContext *s) (chroma_pixels + chroma_width) * 4; if(!(s->iv_frame[0].the_buf = av_malloc(bufsize))) - return; + return AVERROR(ENOMEM); s->iv_frame[0].y_w = s->iv_frame[1].y_w = luma_width; s->iv_frame[0].y_h = s->iv_frame[1].y_h = luma_height; s->iv_frame[0].uv_w = s->iv_frame[1].uv_w = chroma_width; @@ -151,6 +155,8 @@ static av_cold void iv_alloc_frames(Indeo3DecodeContext *s) s->iv_frame[1].Vbuf[-i] = 0x80; s->iv_frame[1].Vbuf[chroma_pixels+i-1] = 0x80; } + + return 0; } /* ---------------------------------------------------------------------- */ @@ -1050,16 +1056,19 @@ static void iv_Decode_Chunk(Indeo3DecodeContext *s, static av_cold int indeo3_decode_init(AVCodecContext *avctx) { Indeo3DecodeContext *s = avctx->priv_data; + int ret = 0; s->avctx = avctx; s->width = avctx->width; s->height = avctx->height; avctx->pix_fmt = PIX_FMT_YUV410P; - build_modpred(s); - iv_alloc_frames(s); + if (!(ret = build_modpred(s))) + ret = iv_alloc_frames(s); + if (ret) + iv_free_func(s); - return 0; + return ret; } static int indeo3_decode_frame(AVCodecContext *avctx, -- cgit v1.2.3