Abort after reading 32 sub-items
To avoid timeouts, more than 32 brands, entries etc. is
deemed unreasonable and kAvifInfoTooComplex is returned
instead. 32 is arbitrary.
Change-Id: I9c9b6961237c6d123a2bd1068e0c7d7a4093d6f0
diff --git a/avifinfo.c b/avifinfo.c
index a66a825..65f0b68 100644
--- a/avifinfo.c
+++ b/avifinfo.c
@@ -198,6 +198,7 @@
!memcmp(box.content + i, "avis", 4)) {
return kFound;
}
+ AVIFINFO_CHECK(i <= 32 * 4, kAborted); // Be reasonable.
}
AVIFINFO_RETURN(kInvalid); // Only one "ftyp" allowed per file.
}
@@ -293,6 +294,7 @@
AvifInfoInternalReadBigEndian(box.content + 1 + i, 1);
// Bit depth should be the same for all channels.
AVIFINFO_CHECK(bit_depth == features->bit_depth, kInvalid);
+ AVIFINFO_CHECK(i <= 32, kAborted); // Be reasonable.
}
return kFound;
} else if (features->num_channels == 0 && !memcmp(box.type, "av1C", 4)) {
@@ -396,7 +398,9 @@
return kFound; // Found everything. Otherwise carry on.
}
}
+ AVIFINFO_CHECK(property <= 32, kAborted); // Be reasonable.
}
+ AVIFINFO_CHECK(entry <= 32, kAborted); // Be reasonable.
}
// According to ISO/IEC 14496-12:2012(E) 8.11.1.1, there is at most one
@@ -499,6 +503,7 @@
meta_bytes, meta_num_bytes, meta_max_num_bytes, to_item_id,
num_parsed_boxes, features));
// Trying the first tile should be enough. Check others just in case.
+ AVIFINFO_CHECK(i <= 32, kAborted); // Be reasonable.
}
}
}