Commit 42780232 authored by Reimar Döffinger's avatar Reimar Döffinger

Check for overread in vqa video decoder.

This issue was discovered while decoding the FATE sample vqa/ws_snd.vqa.
For some unknown reason only audio decoding is tested by FATE for that file,
but not video.
Signed-off-by: 's avatarReimar Döffinger <Reimar.Doeffinger@gmx.de>
parent 1d0d6305
...@@ -322,10 +322,17 @@ static void vqa_decode_chunk(VqaContext *s) ...@@ -322,10 +322,17 @@ static void vqa_decode_chunk(VqaContext *s)
int hibytes = s->decode_buffer_size / 2; int hibytes = s->decode_buffer_size / 2;
/* first, traverse through the frame and find the subchunks */ /* 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_type = AV_RB32(&s->buf[index]);
chunk_size = AV_RB32(&s->buf[index + 4]); 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) { switch (chunk_type) {
...@@ -366,9 +373,7 @@ static void vqa_decode_chunk(VqaContext *s) ...@@ -366,9 +373,7 @@ static void vqa_decode_chunk(VqaContext *s)
chunk_type); chunk_type);
break; break;
} }
index = next_index;
byte_skip = chunk_size & 0x01;
index += (CHUNK_PREAMBLE_SIZE + chunk_size + byte_skip);
} }
/* next, deal with the palette */ /* next, deal with the palette */
......
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