aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2019-05-17 23:28:49 +0200
committerMichael Niedermayer <michael@niedermayer.cc>2019-06-27 17:50:47 +0200
commiteed8561f7cb845aa6df8daf4abf1945be18a4930 (patch)
treedf713e98f19754b189eae707a64c35d06ff3bc2d
parent5fbc6dcdccf16996ce79f17f8c0ae37069447aed (diff)
downloadffmpeg-eed8561f7cb845aa6df8daf4abf1945be18a4930.tar.gz
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/ffmpeg Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> (cherry picked from commit 279d9a84af37cc1a7cf79c1cd667105eeb948611) Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r--libavcodec/vmnc.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/libavcodec/vmnc.c b/libavcodec/vmnc.c
index 30b1414e49..e273043311 100644
--- a/libavcodec/vmnc.c
+++ b/libavcodec/vmnc.c
@@ -333,11 +333,15 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
uint8_t *outptr;
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)
return ret;
- bytestream2_init(gb, buf, buf_size);
-
c->pic->key_frame = 0;
c->pic->pict_type = AV_PICTURE_TYPE_P;
@@ -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--) {
if (bytestream2_get_bytes_left(gb) < 12) {
av_log(avctx, AV_LOG_ERROR, "Premature end of data!\n");