X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fmvi.c;h=cfdbe5d273b8a1a5351e58356b2c71e55c8ad0af;hb=5e518c741661f8663e89048d25edce288219f980;hp=9f90faf56b8463d202de802fb6723127c4131bdc;hpb=e4e04dce1fab81bcdef82e60184d50c73d212c6a;p=ffmpeg diff --git a/libavformat/mvi.c b/libavformat/mvi.c index 9f90faf56b8..cfdbe5d273b 100644 --- a/libavformat/mvi.c +++ b/libavformat/mvi.c @@ -45,6 +45,7 @@ static int read_header(AVFormatContext *s) AVIOContext *pb = s->pb; AVStream *ast, *vst; unsigned int version, frames_count, msecs_per_frame, player_version; + int ret; ast = avformat_new_stream(s, NULL); if (!ast) @@ -54,8 +55,8 @@ static int read_header(AVFormatContext *s) if (!vst) return AVERROR(ENOMEM); - if (ff_alloc_extradata(vst->codecpar, 2)) - return AVERROR(ENOMEM); + if ((ret = ff_alloc_extradata(vst->codecpar, 2)) < 0) + return ret; version = avio_r8(pb); vst->codecpar->extradata[0] = avio_r8(pb); @@ -93,7 +94,7 @@ static int read_header(AVFormatContext *s) vst->codecpar->codec_type = AVMEDIA_TYPE_VIDEO; vst->codecpar->codec_id = AV_CODEC_ID_MOTIONPIXELS; - mvi->get_int = (vst->codecpar->width * vst->codecpar->height < (1 << 16)) ? avio_rl16 : avio_rl24; + mvi->get_int = (vst->codecpar->width * (int64_t)vst->codecpar->height < (1 << 16)) ? avio_rl16 : avio_rl24; mvi->audio_frame_size = ((uint64_t)mvi->audio_data_size << MVI_FRAC_BITS) / frames_count; if (mvi->audio_frame_size <= 1 << MVI_FRAC_BITS - 1) { @@ -119,9 +120,15 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) mvi->video_frame_size = (mvi->get_int)(pb); if (mvi->audio_size_left == 0) return AVERROR(EIO); + if (mvi->audio_size_counter + 512 > UINT64_MAX - mvi->audio_frame_size || + mvi->audio_size_counter + 512 + mvi->audio_frame_size >= ((uint64_t)INT32_MAX) << MVI_FRAC_BITS) + return AVERROR_INVALIDDATA; + count = (mvi->audio_size_counter + mvi->audio_frame_size + 512) >> MVI_FRAC_BITS; if (count > mvi->audio_size_left) count = mvi->audio_size_left; + if ((int64_t)count << MVI_FRAC_BITS > INT_MAX) + return AVERROR_INVALIDDATA; if ((ret = av_get_packet(pb, pkt, count)) < 0) return ret; pkt->stream_index = MVI_AUDIO_STREAM_INDEX;