Commit 9e1db721 authored by Alex Converse's avatar Alex Converse

svq3: Prevent illegal reads while parsing extradata.

Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind
parent b24aaabd
...@@ -811,7 +811,9 @@ static av_cold int svq3_decode_init(AVCodecContext *avctx) ...@@ -811,7 +811,9 @@ static av_cold int svq3_decode_init(AVCodecContext *avctx)
MpegEncContext *s = &h->s; MpegEncContext *s = &h->s;
int m; int m;
unsigned char *extradata; unsigned char *extradata;
unsigned char *extradata_end;
unsigned int size; unsigned int size;
int marker_found = 0;
if (ff_h264_decode_init(avctx) < 0) if (ff_h264_decode_init(avctx) < 0)
return -1; return -1;
...@@ -831,19 +833,26 @@ static av_cold int svq3_decode_init(AVCodecContext *avctx) ...@@ -831,19 +833,26 @@ static av_cold int svq3_decode_init(AVCodecContext *avctx)
/* prowl for the "SEQH" marker in the extradata */ /* prowl for the "SEQH" marker in the extradata */
extradata = (unsigned char *)avctx->extradata; extradata = (unsigned char *)avctx->extradata;
for (m = 0; m < avctx->extradata_size; m++) { extradata_end = avctx->extradata + avctx->extradata_size;
if (!memcmp(extradata, "SEQH", 4)) if (extradata) {
break; for (m = 0; m + 8 < avctx->extradata_size; m++) {
extradata++; if (!memcmp(extradata, "SEQH", 4)) {
marker_found = 1;
break;
}
extradata++;
}
} }
/* if a match was found, parse the extra data */ /* if a match was found, parse the extra data */
if (extradata && !memcmp(extradata, "SEQH", 4)) { if (marker_found) {
GetBitContext gb; GetBitContext gb;
int frame_size_code; int frame_size_code;
size = AV_RB32(&extradata[4]); size = AV_RB32(&extradata[4]);
if (size > extradata_end - extradata - 8)
return AVERROR_INVALIDDATA;
init_get_bits(&gb, extradata + 8, size*8); init_get_bits(&gb, extradata + 8, size*8);
/* 'frame size code' and optional 'width, height' */ /* 'frame size code' and optional 'width, height' */
......
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