changeset 33135:36fdc061b4a8

Prevent segmentation faults. Check alloc pointers. Besides, issue debug messages.
author ib
date Tue, 05 Apr 2011 13:12:36 +0000
parents ffe524b8b8f3
children 07be88814256
files gui/util/bitmap.c
diffstat 1 files changed, 15 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/gui/util/bitmap.c	Tue Apr 05 12:50:56 2011 +0000
+++ b/gui/util/bitmap.c	Tue Apr 05 13:12:36 2011 +0000
@@ -34,7 +34,7 @@
     FILE *file;
     long len;
     void *data;
-    int decode_ok;
+    int decode_ok, bpl;
     AVCodecContext *avctx;
     AVFrame *frame;
     AVPacket pkt;
@@ -57,6 +57,12 @@
 
     data = av_malloc(len + FF_INPUT_BUFFER_PADDING_SIZE);
 
+    if (!data) {
+        fclose(file);
+        mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[bitmap] not enough memory: %lu\n", len + FF_INPUT_BUFFER_PADDING_SIZE);
+        return 3;
+    }
+
     fseek(file, 0, SEEK_SET);
     fread(data, len, 1, file);
     fclose(file);
@@ -98,14 +104,14 @@
     }
 
     if (decode_ok && bf->BPP) {
-        int bpl;
-
         bf->Width  = avctx->width;
         bf->Height = avctx->height;
         bpl = bf->Width * (bf->BPP / 8);
         bf->ImageSize = bpl * bf->Height;
         bf->Image     = malloc(bf->ImageSize);
-        memcpy_pic(bf->Image, frame->data[0], bpl, bf->Height, bpl, frame->linesize[0]);
+
+        if (bf->Image)
+            memcpy_pic(bf->Image, frame->data[0], bpl, bf->Height, bpl, frame->linesize[0]);
     }
 
     avcodec_close(avctx);
@@ -113,6 +119,11 @@
     av_freep(&avctx);
     av_freep(&data);
 
+    if (decode_ok && bf->BPP && !bf->Image) {
+        mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[bitmap] not enough memory: %lu\n", bf->ImageSize);
+        return 4;
+    }
+
     mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[bitmap] file: %s\n", fname);
     mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[bitmap]  size: %lux%lu, color depth: %u\n", bf->Width, bf->Height, bf->BPP);
     mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[bitmap]  image size: %lu\n", bf->ImageSize);