Skip to content

Commit d236952

Browse files
committed
Validate grid cell dimensions are <= AV1 maximum
1 parent d01ba22 commit d236952

2 files changed

Lines changed: 16 additions & 8 deletions

File tree

src/write.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1620,8 +1620,14 @@ static avifResult avifValidateGrid(uint32_t gridCols,
16201620
}
16211621
const uint32_t tileWidth = firstCell->width;
16221622
const uint32_t tileHeight = firstCell->height;
1623-
const uint32_t gridWidth = avifGridWidth(gridCols, firstCell, bottomRightCell);
1624-
const uint32_t gridHeight = avifGridHeight(gridRows, firstCell, bottomRightCell);
1623+
if ((tileWidth > 65536) || (tileHeight > 65536)) {
1624+
avifDiagnosticsPrintf(diag,
1625+
"the first %s cell has invalid dimensions for AV1: %ux%u",
1626+
validateGainMap ? "gain map" : "image",
1627+
tileWidth,
1628+
tileHeight);
1629+
return AVIF_RESULT_INVALID_ARGUMENT;
1630+
}
16251631
for (uint32_t cellIndex = 0; cellIndex < cellCount; ++cellIndex) {
16261632
const avifImage * cellImage = cellImages[cellIndex];
16271633
if (validateGainMap) {
@@ -1682,6 +1688,8 @@ static avifResult avifValidateGrid(uint32_t gridCols,
16821688
bottomRightCell->height);
16831689
return AVIF_RESULT_INVALID_IMAGE_GRID;
16841690
}
1691+
const uint32_t gridWidth = avifGridWidth(gridCols, firstCell, bottomRightCell);
1692+
const uint32_t gridHeight = avifGridHeight(gridRows, firstCell, bottomRightCell);
16851693
if ((cellCount > 1) && !avifAreGridDimensionsValid(firstCell->yuvFormat, gridWidth, gridHeight, tileWidth, tileHeight, diag)) {
16861694
return AVIF_RESULT_INVALID_IMAGE_GRID;
16871695
}

tests/gtest/avifallocationtest.cc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -171,19 +171,19 @@ TEST(EncodingTest, MinimumInvalidDimensions) {
171171
TestEncoding(0, 1, 8, AVIF_RESULT_NO_CONTENT);
172172
TestEncoding(1, 0, 8, AVIF_RESULT_NO_CONTENT);
173173
TestEncoding(1, 1, 0, AVIF_RESULT_UNSUPPORTED_DEPTH);
174-
TestEncoding(65536 + 1, 1, 8, AVIF_RESULT_ENCODE_COLOR_FAILED);
175-
TestEncoding(1, 65536 + 1, 8, AVIF_RESULT_ENCODE_COLOR_FAILED);
176-
TestEncoding(65536 + 1, 65536 + 1, 8, AVIF_RESULT_ENCODE_COLOR_FAILED);
174+
TestEncoding(65536 + 1, 1, 8, AVIF_RESULT_INVALID_ARGUMENT);
175+
TestEncoding(1, 65536 + 1, 8, AVIF_RESULT_INVALID_ARGUMENT);
176+
TestEncoding(65536 + 1, 65536 + 1, 8, AVIF_RESULT_INVALID_ARGUMENT);
177177
}
178178

179179
TEST(EncodingTest, MaximumInvalidDimensions) {
180180
TestEncoding(std::numeric_limits<decltype(avifImage::width)>::max(), 1, 8,
181-
AVIF_RESULT_ENCODE_COLOR_FAILED);
181+
AVIF_RESULT_INVALID_ARGUMENT);
182182
TestEncoding(1, std::numeric_limits<decltype(avifImage::height)>::max(), 8,
183-
AVIF_RESULT_ENCODE_COLOR_FAILED);
183+
AVIF_RESULT_INVALID_ARGUMENT);
184184
TestEncoding(std::numeric_limits<decltype(avifImage::width)>::max(),
185185
std::numeric_limits<decltype(avifImage::height)>::max(), 12,
186-
AVIF_RESULT_ENCODE_COLOR_FAILED);
186+
AVIF_RESULT_INVALID_ARGUMENT);
187187
TestEncoding(1, 1, std::numeric_limits<decltype(avifImage::depth)>::max(),
188188
AVIF_RESULT_UNSUPPORTED_DEPTH);
189189
}

0 commit comments

Comments
 (0)