| @@ -1272,14 +1272,12 @@ static int mov_read_stco(MOVContext *c, AVIOContext *pb, MOVAtom atom) | |||
| if (!entries) | |||
| return 0; | |||
| if (entries >= UINT_MAX/sizeof(int64_t)) | |||
| return AVERROR_INVALIDDATA; | |||
| if (sc->chunk_offsets) | |||
| av_log(c->fc, AV_LOG_WARNING, "Duplicate STCO atom\n"); | |||
| av_free(sc->chunk_offsets); | |||
| sc->chunk_count = 0; | |||
| sc->chunk_offsets = av_malloc(entries * sizeof(int64_t)); | |||
| sc->chunk_offsets = av_malloc_array(entries, sizeof(*sc->chunk_offsets)); | |||
| if (!sc->chunk_offsets) | |||
| return AVERROR(ENOMEM); | |||
| sc->chunk_count = entries; | |||
| @@ -1873,13 +1871,11 @@ static int mov_read_stsc(MOVContext *c, AVIOContext *pb, MOVAtom atom) | |||
| if (!entries) | |||
| return 0; | |||
| if (entries >= UINT_MAX / sizeof(*sc->stsc_data)) | |||
| return AVERROR_INVALIDDATA; | |||
| if (sc->stsc_data) | |||
| av_log(c->fc, AV_LOG_WARNING, "Duplicate STSC atom\n"); | |||
| av_free(sc->stsc_data); | |||
| sc->stsc_count = 0; | |||
| sc->stsc_data = av_malloc(entries * sizeof(*sc->stsc_data)); | |||
| sc->stsc_data = av_malloc_array(entries, sizeof(*sc->stsc_data)); | |||
| if (!sc->stsc_data) | |||
| return AVERROR(ENOMEM); | |||
| @@ -1911,9 +1907,11 @@ static int mov_read_stps(MOVContext *c, AVIOContext *pb, MOVAtom atom) | |||
| avio_rb32(pb); // version + flags | |||
| entries = avio_rb32(pb); | |||
| if (entries >= UINT_MAX / sizeof(*sc->stps_data)) | |||
| return AVERROR_INVALIDDATA; | |||
| sc->stps_data = av_malloc(entries * sizeof(*sc->stps_data)); | |||
| if (sc->stps_data) | |||
| av_log(c->fc, AV_LOG_WARNING, "Duplicate STPS atom\n"); | |||
| av_free(sc->stps_data); | |||
| sc->stps_count = 0; | |||
| sc->stps_data = av_malloc_array(entries, sizeof(*sc->stps_data)); | |||
| if (!sc->stps_data) | |||
| return AVERROR(ENOMEM); | |||
| @@ -1955,9 +1953,11 @@ static int mov_read_stss(MOVContext *c, AVIOContext *pb, MOVAtom atom) | |||
| st->need_parsing = AVSTREAM_PARSE_HEADERS; | |||
| return 0; | |||
| } | |||
| if (entries >= UINT_MAX / sizeof(int)) | |||
| return AVERROR_INVALIDDATA; | |||
| sc->keyframes = av_malloc(entries * sizeof(int)); | |||
| if (sc->keyframes) | |||
| av_log(c->fc, AV_LOG_WARNING, "Duplicate STSS atom\n"); | |||
| av_free(sc->keyframes); | |||
| sc->keyframe_count = 0; | |||
| sc->keyframes = av_malloc_array(entries, sizeof(*sc->keyframes)); | |||
| if (!sc->keyframes) | |||
| return AVERROR(ENOMEM); | |||
| @@ -2016,9 +2016,13 @@ static int mov_read_stsz(MOVContext *c, AVIOContext *pb, MOVAtom atom) | |||
| if (!entries) | |||
| return 0; | |||
| if (entries >= UINT_MAX / sizeof(int) || entries >= (UINT_MAX - 4) / field_size) | |||
| if (entries >= (UINT_MAX - 4) / field_size) | |||
| return AVERROR_INVALIDDATA; | |||
| sc->sample_sizes = av_malloc(entries * sizeof(int)); | |||
| if (sc->sample_sizes) | |||
| av_log(c->fc, AV_LOG_WARNING, "Duplicate STSZ atom\n"); | |||
| av_free(sc->sample_sizes); | |||
| sc->sample_count = 0; | |||
| sc->sample_sizes = av_malloc_array(entries, sizeof(*sc->sample_sizes)); | |||
| if (!sc->sample_sizes) | |||
| return AVERROR(ENOMEM); | |||
| @@ -2072,11 +2076,11 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom) | |||
| av_dlog(c->fc, "track[%i].stts.entries = %i\n", | |||
| c->fc->nb_streams-1, entries); | |||
| if (entries >= UINT_MAX / sizeof(*sc->stts_data)) | |||
| return -1; | |||
| if (sc->stts_data) | |||
| av_log(c->fc, AV_LOG_WARNING, "Duplicate STTS atom\n"); | |||
| av_free(sc->stts_data); | |||
| sc->stts_data = av_malloc(entries * sizeof(*sc->stts_data)); | |||
| sc->stts_count = 0; | |||
| sc->stts_data = av_malloc_array(entries, sizeof(*sc->stts_data)); | |||
| if (!sc->stts_data) | |||
| return AVERROR(ENOMEM); | |||
| @@ -2215,9 +2219,11 @@ static int mov_read_sbgp(MOVContext *c, AVIOContext *pb, MOVAtom atom) | |||
| entries = avio_rb32(pb); | |||
| if (!entries) | |||
| return 0; | |||
| if (entries >= UINT_MAX / sizeof(*sc->rap_group)) | |||
| return AVERROR_INVALIDDATA; | |||
| sc->rap_group = av_malloc(entries * sizeof(*sc->rap_group)); | |||
| if (sc->rap_group) | |||
| av_log(c->fc, AV_LOG_WARNING, "Duplicate SBGP atom\n"); | |||
| av_free(sc->rap_group); | |||
| sc->rap_group_count = 0; | |||
| sc->rap_group = av_malloc_array(entries, sizeof(*sc->rap_group)); | |||
| if (!sc->rap_group) | |||
| return AVERROR(ENOMEM); | |||