Check allocations on init.
authorBenoit Fouet <benoit.fouet@free.fr>
Tue, 30 Sep 2008 09:54:13 +0000 (09:54 +0000)
committerBenoit Fouet <benoit.fouet@free.fr>
Tue, 30 Sep 2008 09:54:13 +0000 (09:54 +0000)
Originally committed as revision 15476 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/indeo3.c

index a0e946f..3d5a568 100644 (file)
@@ -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,