X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fvqavideo.c;h=ae99c6d9c1178ab47f78f1aef85f3062eb8a2d23;hb=a129622390fca8a298c3b121f42b2d15910b9b22;hp=917e04be47d1b2b43802794da0ca69f9ff816d1c;hpb=1a6a088f7c7b164042ad16d43d05543ce1bacfa4;p=ffmpeg diff --git a/libavcodec/vqavideo.c b/libavcodec/vqavideo.c index 917e04be47d..ae99c6d9c11 100644 --- a/libavcodec/vqavideo.c +++ b/libavcodec/vqavideo.c @@ -322,10 +322,17 @@ static void vqa_decode_chunk(VqaContext *s) int hibytes = s->decode_buffer_size / 2; /* first, traverse through the frame and find the subchunks */ - while (index < s->size) { + while (index + CHUNK_PREAMBLE_SIZE <= s->size) { + unsigned next_index; chunk_type = AV_RB32(&s->buf[index]); chunk_size = AV_RB32(&s->buf[index + 4]); + byte_skip = chunk_size & 0x01; + next_index = index + CHUNK_PREAMBLE_SIZE + chunk_size + byte_skip; + if (next_index > s->size) { + av_log(s->avctx, AV_LOG_ERROR, "Dropping incomplete chunk\n"); + break; + } switch (chunk_type) { @@ -366,9 +373,7 @@ static void vqa_decode_chunk(VqaContext *s) chunk_type); break; } - - byte_skip = chunk_size & 0x01; - index += (CHUNK_PREAMBLE_SIZE + chunk_size + byte_skip); + index = next_index; } /* next, deal with the palette */