| Index: Source/modules/webgl/WebGLRenderingContextBase.cpp
|
| diff --git a/Source/modules/webgl/WebGLRenderingContextBase.cpp b/Source/modules/webgl/WebGLRenderingContextBase.cpp
|
| index 5537d3c461d564e6be604000577721674abe0cb2..6e2e716e43a1eb68dddf9295ec1247d6d12bc217 100644
|
| --- a/Source/modules/webgl/WebGLRenderingContextBase.cpp
|
| +++ b/Source/modules/webgl/WebGLRenderingContextBase.cpp
|
| @@ -1625,6 +1625,10 @@ void WebGLRenderingContextBase::bufferSubDataImpl(GLenum target, long long offse
|
| return;
|
| if (!data)
|
| return;
|
| + if (offset + static_cast<long long>(size) > buffer->getSize()) {
|
| + synthesizeGLError(GL_INVALID_VALUE, "bufferSubData", "buffer overflow");
|
| + return;
|
| + }
|
|
|
| webContext()->bufferSubData(target, static_cast<GLintptr>(offset), size, data);
|
| }
|
| @@ -5897,9 +5901,13 @@ bool WebGLRenderingContextBase::validateCompressedTexSubDimensions(const char* f
|
| synthesizeGLError(GL_INVALID_OPERATION, functionName, "xoffset or yoffset not multiple of 4");
|
| return false;
|
| }
|
| - if (width - xoffset > tex->getWidth(target, level)
|
| - || height - yoffset > tex->getHeight(target, level)) {
|
| - synthesizeGLError(GL_INVALID_OPERATION, functionName, "dimensions out of range");
|
| + // Before checking if it is in the range, check if overflow happens first.
|
| + Checked<GLint, RecordOverflow> maxX = xoffset, maxY = yoffset;
|
| + maxX += width;
|
| + maxY += height;
|
| + if (maxX.hasOverflowed() || maxY.hasOverflowed() || maxX.unsafeGet() > tex->getWidth(target, level)
|
| + || maxY.unsafeGet() > tex->getHeight(target, level)) {
|
| + synthesizeGLError(GL_INVALID_VALUE, functionName, "dimensions out of range");
|
| return false;
|
| }
|
| return validateCompressedTexDimensions(functionName, TexSubImage2D, target, level, width, height, format);
|
|
|