X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fdsicinvideo.c;h=7f74808e6dbcdfb547d142492a2cb21d8b30134e;hb=6c777a6688715b21a15cab2cd87c8379225e53ec;hp=aa080417d25f118e4bedd25504680b4f683d583d;hpb=73d193d1d0ff62a029a905d1404c0fd357f4c880;p=ffmpeg diff --git a/libavcodec/dsicinvideo.c b/libavcodec/dsicinvideo.c index aa080417d25..7f74808e6db 100644 --- a/libavcodec/dsicinvideo.c +++ b/libavcodec/dsicinvideo.c @@ -266,8 +266,11 @@ static int cinvideo_decode_frame(AVCodecContext *avctx, cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size); break; case 37: - cin_decode_huffman(buf, bitmap_frame_size, + res = cin_decode_huffman(buf, bitmap_frame_size, cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size); + + if (cin->bitmap_size - avctx->discard_damaged_percentage*cin->bitmap_size/100 > res) + return AVERROR_INVALIDDATA; break; case 38: res = cin_decode_lzss(buf, bitmap_frame_size, @@ -287,7 +290,7 @@ static int cinvideo_decode_frame(AVCodecContext *avctx, break; } - if ((res = ff_reget_buffer(avctx, cin->frame)) < 0) + if ((res = ff_reget_buffer(avctx, cin->frame, 0)) < 0) return res; memcpy(cin->frame->data[1], cin->palette, sizeof(cin->palette)); @@ -328,5 +331,6 @@ AVCodec ff_dsicinvideo_decoder = { .init = cinvideo_decode_init, .close = cinvideo_decode_end, .decode = cinvideo_decode_frame, + .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, .capabilities = AV_CODEC_CAP_DR1, };