Skip to content

Commit a8b031d

Browse files
committed
gainmap: guard pixel-count arithmetic overflow
1 parent 7d63408 commit a8b031d

1 file changed

Lines changed: 6 additions & 5 deletions

File tree

src/gainmap.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "avif/internal.h"
55
#include <assert.h>
66
#include <float.h>
7+
#include <limits.h>
78
#include <math.h>
89
#include <string.h>
910

@@ -559,11 +560,11 @@ avifResult avifRGBImageComputeGainMap(const avifRGBImage * baseRgbImage,
559560
avifResult res = AVIF_RESULT_OK;
560561
// --- After this point, the function should exit with 'goto cleanup' to free allocated resources.
561562

563+
AVIF_CHECKERR(width == 0 || height <= (SIZE_MAX / width), AVIF_RESULT_INVALID_ARGUMENT);
562564
const size_t numPixels = (size_t)width * height;
563-
if (numPixels > SIZE_MAX / sizeof(float)) {
564-
res = AVIF_RESULT_INVALID_ARGUMENT;
565-
goto cleanup;
566-
}
565+
AVIF_CHECKERR(numPixels <= (SIZE_MAX / sizeof(float)), AVIF_RESULT_INVALID_ARGUMENT);
566+
// avifFindMinMaxWithoutOutliers() takes numPixels as int.
567+
AVIF_CHECKERR(numPixels <= INT_MAX, AVIF_RESULT_INVALID_ARGUMENT);
567568
const size_t gainMapChannelSize = numPixels * sizeof(float);
568569
const avifBool singleChannel = (gainMap->image->yuvFormat == AVIF_PIXEL_FORMAT_YUV400);
569570
const int numGainMapChannels = singleChannel ? 1 : 3;
@@ -725,7 +726,7 @@ avifResult avifRGBImageComputeGainMap(const avifRGBImage * baseRgbImage,
725726
float gainMapMinLog2[3] = { 0.0f, 0.0f, 0.0f };
726727
float gainMapMaxLog2[3] = { 0.0f, 0.0f, 0.0f };
727728
for (int c = 0; c < numGainMapChannels; ++c) {
728-
res = avifFindMinMaxWithoutOutliers(gainMapF[c], numPixels, &gainMapMinLog2[c], &gainMapMaxLog2[c]);
729+
res = avifFindMinMaxWithoutOutliers(gainMapF[c], (int)numPixels, &gainMapMinLog2[c], &gainMapMaxLog2[c]);
729730
if (res != AVIF_RESULT_OK) {
730731
goto cleanup;
731732
}

0 commit comments

Comments
 (0)