Add base::numerics for safe math and conversions.
This replaces are "IsUnsignedXXXSafe" family of methods.
Also add overflow checks to unpack block sizes.
BUG=angleproject:1397
Change-Id: Ib47be149b0486c70f795b0d0f8899441faac9340
Reviewed-on: https://chromium-review.googlesource.com/348062
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/validationES2.cpp b/src/libANGLE/validationES2.cpp
index 309f223..f30dd10 100644
--- a/src/libANGLE/validationES2.cpp
+++ b/src/libANGLE/validationES2.cpp
@@ -1830,9 +1830,14 @@
}
const InternalFormat &formatInfo = GetInternalFormatInfo(internalformat);
- if (imageSize < 0 ||
- static_cast<GLuint>(imageSize) !=
- formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height))
+ auto blockSizeOrErr = formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height);
+ if (blockSizeOrErr.isError())
+ {
+ context->handleError(blockSizeOrErr.getError());
+ return false;
+ }
+
+ if (imageSize < 0 || static_cast<GLuint>(imageSize) != blockSizeOrErr.getResult())
{
context->handleError(Error(GL_INVALID_VALUE));
return false;
@@ -1872,9 +1877,14 @@
}
const InternalFormat &formatInfo = GetInternalFormatInfo(format);
- if (imageSize < 0 ||
- static_cast<GLuint>(imageSize) !=
- formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height))
+ auto blockSizeOrErr = formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height);
+ if (blockSizeOrErr.isError())
+ {
+ context->handleError(blockSizeOrErr.getError());
+ return false;
+ }
+
+ if (imageSize < 0 || static_cast<GLuint>(imageSize) != blockSizeOrErr.getResult())
{
context->handleError(Error(GL_INVALID_VALUE));
return false;
@@ -2057,7 +2067,7 @@
return true;
}
-bool ValidateCoverageModulationCHROMIUM(Context* context, GLenum components)
+bool ValidateCoverageModulationCHROMIUM(Context *context, GLenum components)
{
if (!context->getExtensions().framebufferMixedSamples)
{
@@ -2074,7 +2084,8 @@
break;
default:
context->handleError(
- Error(GL_INVALID_ENUM, "GLenum components is not one of GL_RGB, GL_RGBA, GL_ALPHA or GL_NONE."));
+ Error(GL_INVALID_ENUM,
+ "GLenum components is not one of GL_RGB, GL_RGBA, GL_ALPHA or GL_NONE."));
return false;
}