Chromium Code Reviews| Index: third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp |
| diff --git a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp |
| index 9a902001dac684e122478db4de383c8623ee1e3c..eb30a5b07daec212a51e1d529140db084b3ae25a 100644 |
| --- a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp |
| +++ b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp |
| @@ -67,7 +67,7 @@ bool ValidateSubSourceAndGetData(DOMArrayBufferView* view, |
| } |
| CheckedNumeric<long long> total = byte_offset; |
| total += byte_length; |
| - if (!total.IsValid() || total.ValueOrDie() > view->byteLength()) { |
| + if (!total.IsValid() || total.ValueOrDefault(0) > view->byteLength()) { |
|
Ken Russell (switch to Gerrit)
2017/04/12 18:56:49
Here and throughout, I think we should continue to
Zhenyao Mo
2017/04/12 20:14:53
Done.
|
| return false; |
| } |
| if (!byte_length) { |
| @@ -3463,20 +3463,28 @@ void WebGL2RenderingContextBase::drawBuffers(const Vector<GLenum>& buffers) { |
| bool WebGL2RenderingContextBase::ValidateClearBuffer(const char* function_name, |
| GLenum buffer, |
| - GLsizei size) { |
| + GLsizei size, |
| + GLuint src_offset) { |
| + CheckedNumeric<GLsizei> checked_size(size); |
| + checked_size -= src_offset; |
| + if (!checked_size.IsValid()) { |
| + SynthesizeGLError(GL_INVALID_VALUE, function_name, |
| + "invalid array size / srcOffset"); |
| + return false; |
| + } |
| switch (buffer) { |
| case GL_COLOR: |
| - if (size < 4) { |
| + if (checked_size.ValueOrDefault(0) < 4) { |
| SynthesizeGLError(GL_INVALID_VALUE, function_name, |
| - "invalid array size"); |
| + "invalid array size / srcOffset"); |
| return false; |
| } |
| break; |
| case GL_DEPTH: |
| case GL_STENCIL: |
| - if (size < 1) { |
| + if (checked_size.ValueOrDefault(0) < 1) { |
| SynthesizeGLError(GL_INVALID_VALUE, function_name, |
| - "invalid array size"); |
| + "invalid array size / srcOffset"); |
| return false; |
| } |
| break; |
| @@ -3498,64 +3506,74 @@ WebGLTexture* WebGL2RenderingContextBase::ValidateTexImageBinding( |
| void WebGL2RenderingContextBase::clearBufferiv(GLenum buffer, |
| GLint drawbuffer, |
| - NotShared<DOMInt32Array> value) { |
| + NotShared<DOMInt32Array> value, |
| + GLuint src_offset) { |
| if (isContextLost() || |
| - !ValidateClearBuffer("clearBufferiv", buffer, value.View()->length())) |
| + !ValidateClearBuffer("clearBufferiv", buffer, value.View()->length(), |
| + src_offset)) |
| return; |
| - ContextGL()->ClearBufferiv(buffer, drawbuffer, value.View()->Data()); |
| + ContextGL()->ClearBufferiv(buffer, drawbuffer, |
| + value.View()->Data() + src_offset); |
| } |
| void WebGL2RenderingContextBase::clearBufferiv(GLenum buffer, |
| GLint drawbuffer, |
| - const Vector<GLint>& value) { |
| + const Vector<GLint>& value, |
| + GLuint src_offset) { |
| if (isContextLost() || |
| - !ValidateClearBuffer("clearBufferiv", buffer, value.size())) |
| + !ValidateClearBuffer("clearBufferiv", buffer, value.size(), src_offset)) |
| return; |
| - ContextGL()->ClearBufferiv(buffer, drawbuffer, value.Data()); |
| + ContextGL()->ClearBufferiv(buffer, drawbuffer, value.Data() + src_offset); |
| } |
| -void WebGL2RenderingContextBase::clearBufferuiv( |
| - GLenum buffer, |
| - GLint drawbuffer, |
| - NotShared<DOMUint32Array> value) { |
| +void WebGL2RenderingContextBase::clearBufferuiv(GLenum buffer, |
| + GLint drawbuffer, |
| + NotShared<DOMUint32Array> value, |
| + GLuint src_offset) { |
| if (isContextLost() || |
| - !ValidateClearBuffer("clearBufferuiv", buffer, value.View()->length())) |
| + !ValidateClearBuffer("clearBufferuiv", buffer, value.View()->length(), |
| + src_offset)) |
| return; |
| - ContextGL()->ClearBufferuiv(buffer, drawbuffer, value.View()->Data()); |
| + ContextGL()->ClearBufferuiv(buffer, drawbuffer, |
| + value.View()->Data() + src_offset); |
| } |
| void WebGL2RenderingContextBase::clearBufferuiv(GLenum buffer, |
| GLint drawbuffer, |
| - const Vector<GLuint>& value) { |
| + const Vector<GLuint>& value, |
| + GLuint src_offset) { |
| if (isContextLost() || |
| - !ValidateClearBuffer("clearBufferuiv", buffer, value.size())) |
| + !ValidateClearBuffer("clearBufferuiv", buffer, value.size(), src_offset)) |
| return; |
| - ContextGL()->ClearBufferuiv(buffer, drawbuffer, value.Data()); |
| + ContextGL()->ClearBufferuiv(buffer, drawbuffer, value.Data() + src_offset); |
| } |
| -void WebGL2RenderingContextBase::clearBufferfv( |
| - GLenum buffer, |
| - GLint drawbuffer, |
| - NotShared<DOMFloat32Array> value) { |
| +void WebGL2RenderingContextBase::clearBufferfv(GLenum buffer, |
| + GLint drawbuffer, |
| + NotShared<DOMFloat32Array> value, |
| + GLuint src_offset) { |
| if (isContextLost() || |
| - !ValidateClearBuffer("clearBufferfv", buffer, value.View()->length())) |
| + !ValidateClearBuffer("clearBufferfv", buffer, value.View()->length(), |
| + src_offset)) |
| return; |
| - ContextGL()->ClearBufferfv(buffer, drawbuffer, value.View()->Data()); |
| + ContextGL()->ClearBufferfv(buffer, drawbuffer, |
| + value.View()->Data() + src_offset); |
| } |
| void WebGL2RenderingContextBase::clearBufferfv(GLenum buffer, |
| GLint drawbuffer, |
| - const Vector<GLfloat>& value) { |
| + const Vector<GLfloat>& value, |
| + GLuint src_offset) { |
| if (isContextLost() || |
| - !ValidateClearBuffer("clearBufferfv", buffer, value.size())) |
| + !ValidateClearBuffer("clearBufferfv", buffer, value.size(), src_offset)) |
| return; |
| - ContextGL()->ClearBufferfv(buffer, drawbuffer, value.Data()); |
| + ContextGL()->ClearBufferfv(buffer, drawbuffer, value.Data() + src_offset); |
| } |
| void WebGL2RenderingContextBase::clearBufferfi(GLenum buffer, |
| @@ -5632,7 +5650,8 @@ const char* WebGL2RenderingContextBase::ValidateGetBufferSubDataBounds( |
| long long destination_byte_length) { |
| CheckedNumeric<long long> src_end = source_byte_offset; |
| src_end += destination_byte_length; |
| - if (!src_end.IsValid() || src_end.ValueOrDie() > source_buffer->GetSize()) { |
| + if (!src_end.IsValid() || |
| + src_end.ValueOrDefault(0) > source_buffer->GetSize()) { |
| SynthesizeGLError(GL_INVALID_VALUE, function_name, |
| "overflow of bound buffer"); |
| return "Invalid value: overflow of bound buffer"; |