diff options
author | Paul B Mahol <onemda@gmail.com> | 2012-10-25 13:46:19 +0000 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2012-10-25 13:46:19 +0000 |
commit | d8245c3bcdd162891825a52cf55e4e8173d85a18 (patch) | |
tree | 040291c911962c980e3089038981c290f00c7b0f /libavcodec/dsicinav.c | |
parent | 296f9c2b3bc2e38b45afc107e750a79203d2236f (diff) | |
download | ffmpeg-d8245c3bcdd162891825a52cf55e4e8173d85a18.tar.gz |
dsicinav: return proper error code in case of malloc failure
Fixes null pointer dereference.
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Diffstat (limited to 'libavcodec/dsicinav.c')
-rw-r--r-- | libavcodec/dsicinav.c | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/libavcodec/dsicinav.c b/libavcodec/dsicinav.c index fd2f6820f4..ddec868baa 100644 --- a/libavcodec/dsicinav.c +++ b/libavcodec/dsicinav.c @@ -86,24 +86,42 @@ static const int16_t cinaudio_delta16_table[256] = { 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) { CinVideoContext *cin = avctx->priv_data; - unsigned int i; cin->avctx = avctx; avctx->pix_fmt = AV_PIX_FMT_PAL8; avcodec_get_frame_defaults(&cin->frame); - cin->frame.data[0] = NULL; cin->bitmap_size = avctx->width * avctx->height; - for (i = 0; i < 3; ++i) { - cin->bitmap_table[i] = av_mallocz(cin->bitmap_size); - if (!cin->bitmap_table[i]) - av_log(avctx, AV_LOG_ERROR, "Can't allocate bitmap buffers.\n"); - } + if (allocate_buffers(cin)) + return AVERROR(ENOMEM); return 0; } @@ -310,13 +328,11 @@ static int cinvideo_decode_frame(AVCodecContext *avctx, static av_cold int cinvideo_decode_end(AVCodecContext *avctx) { CinVideoContext *cin = avctx->priv_data; - int i; if (cin->frame.data[0]) avctx->release_buffer(avctx, &cin->frame); - for (i = 0; i < 3; ++i) - av_free(cin->bitmap_table[i]); + destroy_buffers(cin); return 0; } |