1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

dsicinav: return proper error code in case of malloc failure

Fixes null pointer dereference.

Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
Paul B Mahol 2012-10-25 13:46:19 +00:00
parent 296f9c2b3b
commit d8245c3bcd

View File

@ -86,24 +86,42 @@ static const int16_t cinaudio_delta16_table[256] = {
0, 0, 0, 0, 0, 0, 0, 0 0, 0, 0, 0, 0, 0, 0, 0
}; };
static av_cold void destroy_buffers(CinVideoContext *cin)
{
int i;
for (i = 0; i < 3; ++i)
av_freep(&cin->bitmap_table[i]);
}
static av_cold int allocate_buffers(CinVideoContext *cin)
{
int i;
for (i = 0; i < 3; ++i) {
cin->bitmap_table[i] = av_mallocz(cin->bitmap_size);
if (!cin->bitmap_table[i]) {
av_log(cin->avctx, AV_LOG_ERROR, "Can't allocate bitmap buffers.\n");
destroy_buffers(cin);
return AVERROR(ENOMEM);
}
}
return 0;
}
static av_cold int cinvideo_decode_init(AVCodecContext *avctx) static av_cold int cinvideo_decode_init(AVCodecContext *avctx)
{ {
CinVideoContext *cin = avctx->priv_data; CinVideoContext *cin = avctx->priv_data;
unsigned int i;
cin->avctx = avctx; cin->avctx = avctx;
avctx->pix_fmt = AV_PIX_FMT_PAL8; avctx->pix_fmt = AV_PIX_FMT_PAL8;
avcodec_get_frame_defaults(&cin->frame); avcodec_get_frame_defaults(&cin->frame);
cin->frame.data[0] = NULL;
cin->bitmap_size = avctx->width * avctx->height; cin->bitmap_size = avctx->width * avctx->height;
for (i = 0; i < 3; ++i) { if (allocate_buffers(cin))
cin->bitmap_table[i] = av_mallocz(cin->bitmap_size); return AVERROR(ENOMEM);
if (!cin->bitmap_table[i])
av_log(avctx, AV_LOG_ERROR, "Can't allocate bitmap buffers.\n");
}
return 0; return 0;
} }
@ -310,13 +328,11 @@ static int cinvideo_decode_frame(AVCodecContext *avctx,
static av_cold int cinvideo_decode_end(AVCodecContext *avctx) static av_cold int cinvideo_decode_end(AVCodecContext *avctx)
{ {
CinVideoContext *cin = avctx->priv_data; CinVideoContext *cin = avctx->priv_data;
int i;
if (cin->frame.data[0]) if (cin->frame.data[0])
avctx->release_buffer(avctx, &cin->frame); avctx->release_buffer(avctx, &cin->frame);
for (i = 0; i < 3; ++i) destroy_buffers(cin);
av_free(cin->bitmap_table[i]);
return 0; return 0;
} }