Check for int32_t cast and unsigned add overflows
Also remove extraneous parentheses.
diff --git a/src/avif.c b/src/avif.c
index bd785ab..e054330 100644
--- a/src/avif.c
+++ b/src/avif.c
@@ -440,7 +440,7 @@
{
clapFractionSimplify(a);
clapFractionSimplify(b);
- if ((a->d != b->d)) {
+ if (a->d != b->d) {
const int32_t ad = a->d;
const int32_t bd = b->d;
a->n *= bd;
@@ -492,7 +492,8 @@
avifDiagnosticsPrintf(diag, "[Strict] crop rect width and height must be nonzero");
return AVIF_FALSE;
}
- if (((cropRect->x + cropRect->width) > imageW) || ((cropRect->y + cropRect->height) > imageH)) {
+ if ((cropRect->x > (UINT32_MAX - cropRect->width)) || ((cropRect->x + cropRect->width) > imageW) ||
+ (cropRect->y > (UINT32_MAX - cropRect->height)) || ((cropRect->y + cropRect->height) > imageH)) {
avifDiagnosticsPrintf(diag, "[Strict] crop rect is out of the image's bounds");
return AVIF_FALSE;
}
@@ -550,6 +551,10 @@
return AVIF_FALSE;
}
+ if ((imageW > INT32_MAX) || (imageH > INT32_MAX)) {
+ avifDiagnosticsPrintf(diag, "[Strict] image width %u or height %u is greater than INT32_MAX", imageW, imageH);
+ return AVIF_FALSE;
+ }
clapFraction uncroppedCenterX = calcCenter((int32_t)imageW);
clapFraction uncroppedCenterY = calcCenter((int32_t)imageH);