Clean up the code that checks imageCountLimit (#549)
Add the avifGetSampleCountOfChunk() function for the code that was
duplicated.
Declare the imageCountLimit parameter of
avifCodecDecodeInputGetSamples() to have the uint32_t type (because
decoder->imageCountLimit has the uint32_t type) and replace the uint64_t
variable imageCount with the uint32_t variable imageCountLeft. It is not
necessary to use the uint64_t type in this code.
diff --git a/src/read.c b/src/read.c
index bf50d6a..4ee7627 100644
--- a/src/read.c
+++ b/src/read.c
@@ -329,35 +329,42 @@
avifFree(decodeInput);
}
+// Returns how many samples are in the chunk.
+static uint32_t avifGetSampleCountOfChunk(const avifSampleTableSampleToChunkArray * sampleToChunks, uint32_t chunkIndex)
+{
+ uint32_t sampleCount = 0;
+ for (int sampleToChunkIndex = sampleToChunks->count - 1; sampleToChunkIndex >= 0; --sampleToChunkIndex) {
+ const avifSampleTableSampleToChunk * sampleToChunk = &sampleToChunks->sampleToChunk[sampleToChunkIndex];
+ if (sampleToChunk->firstChunk <= (chunkIndex + 1)) {
+ sampleCount = sampleToChunk->samplesPerChunk;
+ break;
+ }
+ }
+ return sampleCount;
+}
+
static avifBool avifCodecDecodeInputGetSamples(avifCodecDecodeInput * decodeInput,
avifSampleTable * sampleTable,
- const uint64_t imageCountLimit,
+ const uint32_t imageCountLimit,
const uint64_t sizeHint)
{
if (imageCountLimit) {
// Verify that the we're not about to exceed the frame count limit.
- uint64_t imageCount = 0;
+ uint32_t imageCountLeft = imageCountLimit;
for (uint32_t chunkIndex = 0; chunkIndex < sampleTable->chunks.count; ++chunkIndex) {
// First, figure out how many samples are in this chunk
- uint32_t sampleCount = 0;
- for (int sampleToChunkIndex = sampleTable->sampleToChunks.count - 1; sampleToChunkIndex >= 0; --sampleToChunkIndex) {
- avifSampleTableSampleToChunk * sampleToChunk = &sampleTable->sampleToChunks.sampleToChunk[sampleToChunkIndex];
- if (sampleToChunk->firstChunk <= (chunkIndex + 1)) {
- sampleCount = sampleToChunk->samplesPerChunk;
- break;
- }
- }
+ uint32_t sampleCount = avifGetSampleCountOfChunk(&sampleTable->sampleToChunks, chunkIndex);
if (sampleCount == 0) {
// chunks with 0 samples are invalid
return AVIF_FALSE;
}
- imageCount += sampleCount;
- if (imageCount > imageCountLimit) {
+ if (sampleCount > imageCountLeft) {
// This file exceeds the imageCountLimit, bail out
return AVIF_FALSE;
}
+ imageCountLeft -= sampleCount;
}
}
@@ -366,14 +373,7 @@
avifSampleTableChunk * chunk = &sampleTable->chunks.chunk[chunkIndex];
// First, figure out how many samples are in this chunk
- uint32_t sampleCount = 0;
- for (int sampleToChunkIndex = sampleTable->sampleToChunks.count - 1; sampleToChunkIndex >= 0; --sampleToChunkIndex) {
- avifSampleTableSampleToChunk * sampleToChunk = &sampleTable->sampleToChunks.sampleToChunk[sampleToChunkIndex];
- if (sampleToChunk->firstChunk <= (chunkIndex + 1)) {
- sampleCount = sampleToChunk->samplesPerChunk;
- break;
- }
- }
+ uint32_t sampleCount = avifGetSampleCountOfChunk(&sampleTable->sampleToChunks, chunkIndex);
if (sampleCount == 0) {
// chunks with 0 samples are invalid
return AVIF_FALSE;