diff --git a/libavformat/mov.c b/libavformat/mov.c index 15468d73c6..dc55ea7255 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -7691,12 +7691,12 @@ static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom) atom.size = INT64_MAX; while (total_size <= atom.size - 8 && !avio_feof(pb)) { int (*parse)(MOVContext*, AVIOContext*, MOVAtom) = NULL; - a.size = avio_rb32(pb); - a.type = avio_rl32(pb); - if (((a.type == MKTAG('f','r','e','e') && c->moov_retry) || - a.type == MKTAG('h','o','o','v')) && - a.size >= 8 && - c->fc->strict_std_compliance < FF_COMPLIANCE_STRICT) { + a.size = avio_rb32(pb); + a.type = avio_rl32(pb); + if (((a.type == MKTAG('f','r','e','e') && c->moov_retry) || + a.type == MKTAG('h','o','o','v')) && + a.size >= 8 && + c->fc->strict_std_compliance < FF_COMPLIANCE_STRICT) { uint32_t type; avio_skip(pb, 4); type = avio_rl32(pb); @@ -7708,22 +7708,22 @@ static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom) av_log(c->fc, AV_LOG_ERROR, "Detected moov in a free or hoov atom.\n"); a.type = MKTAG('m','o','o','v'); } + } + if (atom.type != MKTAG('r','o','o','t') && + atom.type != MKTAG('m','o','o','v')) { + if (a.type == MKTAG('t','r','a','k') || + a.type == MKTAG('m','d','a','t')) { + av_log(c->fc, AV_LOG_ERROR, "Broken file, trak/mdat not at top-level\n"); + avio_skip(pb, -8); + c->atom_depth --; + return 0; } - if (atom.type != MKTAG('r','o','o','t') && - atom.type != MKTAG('m','o','o','v')) { - if (a.type == MKTAG('t','r','a','k') || - a.type == MKTAG('m','d','a','t')) { - av_log(c->fc, AV_LOG_ERROR, "Broken file, trak/mdat not at top-level\n"); - avio_skip(pb, -8); - c->atom_depth --; - return 0; - } - } + } + total_size += 8; + if (a.size == 1 && total_size + 8 <= atom.size) { /* 64 bit extended size */ + a.size = avio_rb64(pb) - 8; total_size += 8; - if (a.size == 1 && total_size + 8 <= atom.size) { /* 64 bit extended size */ - a.size = avio_rb64(pb) - 8; - total_size += 8; - } + } av_log(c->fc, AV_LOG_TRACE, "type:'%s' parent:'%s' sz: %"PRId64" %"PRId64" %"PRId64"\n", av_fourcc2str(a.type), av_fourcc2str(atom.type), a.size, total_size, atom.size); if (a.size == 0) {