Use CheckedNumeric for size calculation in TextureGL. Wrap the multiplication of width, height, and pixelBytes with angle::CheckedNumeric to prevent potential integer overflow when calculating the size for the zero-filled buffer. This is speculative fix for the potential bug linked below. See (sorry internal only): go/code-terracotta-reviewer-explainer for details. Bug:b/495363705 Change-Id: I3651b86f06d6acf9cf048c06c4acaeb6ba8ce2ac Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/7696452 Commit-Queue: Geoff Lang <geofflang@chromium.org> Auto-Submit: Stephen Nusko <nuskos@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
diff --git a/src/libANGLE/renderer/gl/TextureGL.cpp b/src/libANGLE/renderer/gl/TextureGL.cpp index 05299c9..c91c6ac 100644 --- a/src/libANGLE/renderer/gl/TextureGL.cpp +++ b/src/libANGLE/renderer/gl/TextureGL.cpp
@@ -744,10 +744,14 @@ const gl::InternalFormat &initFormatInfo = gl::GetInternalFormatInfo(initTexImageFormat.format, initTexImageFormat.type); GLuint pixelBytes = initFormatInfo.pixelBytes; + // TODO(b/495363705): Validate if this CheckedNumeric is required, remove either this TODO + // or the CheckedNumeric based on the result. + angle::CheckedNumeric<size_t> checkedBufferSize = angle::base::CheckMul( + angle::base::CheckMul(sourceArea.width, sourceArea.height), pixelBytes); + ANGLE_CHECK_GL_MATH(contextGL, checkedBufferSize.IsValid()); angle::MemoryBuffer *zero; - ANGLE_CHECK_GL_ALLOC( - contextGL, - context->getZeroFilledBuffer(sourceArea.width * sourceArea.height * pixelBytes, &zero)); + ANGLE_CHECK_GL_ALLOC(contextGL, + context->getZeroFilledBuffer(checkedBufferSize.ValueOrDie(), &zero)); gl::PixelUnpackState unpack; unpack.alignment = 1;