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:
parent
296f9c2b3b
commit
d8245c3bcd
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user