Bug 1313541 - Add WebGLBuffer::ValidateRange. - r=ethlin draft
authorJeff Gilbert (:jgilbert) <jgilbert@mozilla.com>
Tue, 11 Oct 2016 17:37:29 -0700
changeset 430642 20247ddeeaa4946daadeb4f984e05fdec80ccebc
parent 430641 5ff9241fc9a5e3fc34f4c2d8888fb19a0d5d73da
child 430643 0c61ede3e34399e02f10a59b343d99e74315eac8
push id33862
push userbmo:jgilbert@mozilla.com
push dateFri, 28 Oct 2016 02:14:30 +0000
reviewersethlin
bugs1313541
milestone52.0a1
Bug 1313541 - Add WebGLBuffer::ValidateRange. - r=ethlin MozReview-Commit-ID: GtT1YppMzLV
dom/canvas/WebGLBuffer.cpp
dom/canvas/WebGLBuffer.h
--- a/dom/canvas/WebGLBuffer.cpp
+++ b/dom/canvas/WebGLBuffer.cpp
@@ -153,16 +153,35 @@ WebGLBuffer::BufferData(GLenum target, s
 
     // Warning: Possibly shared memory.  See bug 1225033.
     if (!ElementArrayCacheBufferData(data, size)) {
         mByteLength = 0;
         mContext->ErrorOutOfMemory("%s: Failed update index buffer cache.", funcName);
     }
 }
 
+bool
+WebGLBuffer::ValidateRange(const char* funcName, size_t byteOffset, size_t byteLen) const
+{
+    auto availLength = mByteLength;
+    if (byteOffset > availLength) {
+        mContext->ErrorInvalidValue("%s: Offset passes the end of the buffer.", funcName);
+        return false;
+    }
+    availLength -= byteOffset;
+
+    if (byteLen > availLength) {
+        mContext->ErrorInvalidValue("%s: Offset+size passes the end of the buffer.",
+                                    funcName);
+        return false;
+    }
+
+    return true;
+}
+
 ////////////////////////////////////////
 
 bool
 WebGLBuffer::ElementArrayCacheBufferData(const void* ptr,
                                          size_t bufferSizeInBytes)
 {
     if (mContent == Kind::ElementArray)
         return mCache->BufferData(ptr, bufferSizeInBytes);
--- a/dom/canvas/WebGLBuffer.h
+++ b/dom/canvas/WebGLBuffer.h
@@ -49,16 +49,17 @@ public:
     size_t ByteLength() const { return mByteLength; }
 
     bool ElementArrayCacheBufferData(const void* ptr, size_t bufferSizeInBytes);
 
     void ElementArrayCacheBufferSubData(size_t pos, const void* ptr,
                                         size_t updateSizeInBytes);
 
     bool Validate(GLenum type, uint32_t max_allowed, size_t first, size_t count) const;
+    bool ValidateRange(const char* funcName, size_t byteOffset, size_t byteLen) const;
 
     bool IsElementArrayUsedWithMultipleTypes() const;
 
     WebGLContext* GetParentObject() const {
         return mContext;
     }
 
     virtual JSObject* WrapObject(JSContext* cx, JS::Handle<JSObject*> givenProto) override;