Do not include ftyp in num_parsed_boxes Change-Id: If6be78ee6514cc12a9517304cdf55f87af57d472
diff --git a/avifinfo.c b/avifinfo.c index a8a0272..91e690c 100644 --- a/avifinfo.c +++ b/avifinfo.c
@@ -316,9 +316,17 @@ if (has_fullbox_header) box_header_size += 4; AVIFINFO_CHECK(box->size >= box_header_size, kInvalid); box->content_size = box->size - box_header_size; - // Avoid timeouts. The maximum number of parsed boxes is arbitrary. - ++*num_parsed_boxes; - AVIFINFO_CHECK(*num_parsed_boxes < AVIFINFO_MAX_NUM_BOXES, kAborted); + // AvifInfoGetFeaturesStream() can be called on a full stream or on a stream + // where the 'ftyp' box was already read. Do not count 'ftyp' boxes towards + // AVIFINFO_MAX_NUM_BOXES, so that this function returns the same status in + // both situations (because of the AVIFINFO_MAX_NUM_BOXES check that would + // compare a different box count otherwise). This is fine because top-level + // 'ftyp' boxes are just skipped anyway. + if (nesting_level != 0 || memcmp(box->type, "ftyp", 4)) { + // Avoid timeouts. The maximum number of parsed boxes is arbitrary. + ++*num_parsed_boxes; + AVIFINFO_CHECK(*num_parsed_boxes < AVIFINFO_MAX_NUM_BOXES, kAborted); + } box->version = 0; box->flags = 0; @@ -718,14 +726,6 @@ AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox( /*nesting_level=*/0, stream, AVIFINFO_MAX_SIZE, num_parsed_boxes, &box)); - if (*num_parsed_boxes == 1 && memcmp(box.type, "ftyp", 4)) { - // AvifInfoGetFeaturesStream() can be called on a full stream or on a - // stream where the 'ftyp' box was already read. If it is not the first - // parsed box here, consider it was, so that this function returns the - // same status in both situations (because of the AVIFINFO_MAX_NUM_BOXES - // check that would compare a different box count otherwise). - ++*num_parsed_boxes; - } if (!memcmp(box.type, "meta", 4)) { return ParseMeta(/*nesting_level=*/1, stream, box.content_size, num_parsed_boxes, features);