Commit 279d9a84 authored by Michael Niedermayer's avatar Michael Niedermayer

avcodec/vmnc: Check available space against chunks before reget_buffer()

Fixes: Timeout (16sec -> 60ms)
Fixes: 14673/clusterfuzz-testcase-minimized-ffmpeg_AV_CODEC_ID_VMNC_fuzzer-5640217517621248

Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpegSigned-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent 89836ad5
...@@ -333,11 +333,15 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, ...@@ -333,11 +333,15 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
uint8_t *outptr; uint8_t *outptr;
int dx, dy, w, h, depth, enc, chunks, res, size_left, ret; int dx, dy, w, h, depth, enc, chunks, res, size_left, ret;
bytestream2_init(gb, buf, buf_size);
bytestream2_skip(gb, 2);
chunks = bytestream2_get_be16(gb);
if (12LL * chunks > bytestream2_get_bytes_left(gb))
return AVERROR_INVALIDDATA;
if ((ret = ff_reget_buffer(avctx, c->pic)) < 0) if ((ret = ff_reget_buffer(avctx, c->pic)) < 0)
return ret; return ret;
bytestream2_init(gb, buf, buf_size);
c->pic->key_frame = 0; c->pic->key_frame = 0;
c->pic->pict_type = AV_PICTURE_TYPE_P; c->pic->pict_type = AV_PICTURE_TYPE_P;
...@@ -369,8 +373,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, ...@@ -369,8 +373,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
} }
} }
} }
bytestream2_skip(gb, 2);
chunks = bytestream2_get_be16(gb);
while (chunks--) { while (chunks--) {
if (bytestream2_get_bytes_left(gb) < 12) { if (bytestream2_get_bytes_left(gb) < 12) {
av_log(avctx, AV_LOG_ERROR, "Premature end of data!\n"); av_log(avctx, AV_LOG_ERROR, "Premature end of data!\n");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment