2010-07-03 Zhenyao Mo <zmo@google.com>
authorzmo@google.com <zmo@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 4 Jul 2010 01:33:31 +0000 (01:33 +0000)
committerzmo@google.com <zmo@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 4 Jul 2010 01:33:31 +0000 (01:33 +0000)
        Reviewed by Dimitri Glazkov.

        WebGLRenderingContext::vertexAttrib* leads to possible out-of-range vector member visit
        https://bugs.webkit.org/show_bug.cgi?id=41572

        * platform/mac-leopard/Skipped: Adding back the program-test.html test since the failure cause is fixed in this patch.
2010-07-03  Zhenyao Mo  <zmo@google.com>

        Reviewed by Dimitri Glazkov.

        WebGLRenderingContext::vertexAttrib* leads to possible out-of-range vector member visit
        https://bugs.webkit.org/show_bug.cgi?id=41572

        * html/canvas/WebGLRenderingContext.cpp: Fix the out-of-range vector member visit, also refactor the code.
        (WebCore::WebGLRenderingContext::vertexAttrib1f):
        (WebCore::WebGLRenderingContext::vertexAttrib1fv):
        (WebCore::WebGLRenderingContext::vertexAttrib2f):
        (WebCore::WebGLRenderingContext::vertexAttrib2fv):
        (WebCore::WebGLRenderingContext::vertexAttrib3f):
        (WebCore::WebGLRenderingContext::vertexAttrib3fv):
        (WebCore::WebGLRenderingContext::vertexAttrib4f):
        (WebCore::WebGLRenderingContext::vertexAttrib4fv):
        (WebCore::WebGLRenderingContext::vertexAttribfImpl):
        (WebCore::WebGLRenderingContext::vertexAttribfvImpl):
        * html/canvas/WebGLRenderingContext.h: Helper function declaration.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@62458 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/platform/mac-leopard/Skipped
WebCore/ChangeLog
WebCore/html/canvas/WebGLRenderingContext.cpp
WebCore/html/canvas/WebGLRenderingContext.h

index 5f66d30b4e1974101ea3c7658a5046531d201136..d132c7703ad2c4c35411698dbd18eebf207e83e5 100644 (file)
@@ -1,3 +1,12 @@
+2010-07-03  Zhenyao Mo  <zmo@google.com>
+
+        Reviewed by Dimitri Glazkov.
+
+        WebGLRenderingContext::vertexAttrib* leads to possible out-of-range vector member visit
+        https://bugs.webkit.org/show_bug.cgi?id=41572
+
+        * platform/mac-leopard/Skipped: Adding back the program-test.html test since the failure cause is fixed in this patch.
+
 2010-07-03  Darin Adler  <darin@apple.com>
 
         Added test cases for edge cases in apply function on arrays.
index 732d1d1d4ac0c08344d2a2fde1c153253175ab1f..1684b8c29dfcf09e15e2df7f2e68612cc61d4507 100644 (file)
@@ -76,4 +76,3 @@ storage/indexeddb
 # Disable the tests until the mesa renderer is integrated.
 # https://bugs.webkit.org/show_bug.cgi?id=41545
 fast/canvas/webgl/texture-npot.html
-fast/canvas/webgl/program-test.html
index 5f434ee534423ae92208e94ff6023bba96b0b8ab..544e4fc4e1cda62ce3a1a51e9af621e764303e30 100644 (file)
@@ -1,3 +1,23 @@
+2010-07-03  Zhenyao Mo  <zmo@google.com>
+
+        Reviewed by Dimitri Glazkov.
+
+        WebGLRenderingContext::vertexAttrib* leads to possible out-of-range vector member visit
+        https://bugs.webkit.org/show_bug.cgi?id=41572
+
+        * html/canvas/WebGLRenderingContext.cpp: Fix the out-of-range vector member visit, also refactor the code.
+        (WebCore::WebGLRenderingContext::vertexAttrib1f):
+        (WebCore::WebGLRenderingContext::vertexAttrib1fv):
+        (WebCore::WebGLRenderingContext::vertexAttrib2f):
+        (WebCore::WebGLRenderingContext::vertexAttrib2fv):
+        (WebCore::WebGLRenderingContext::vertexAttrib3f):
+        (WebCore::WebGLRenderingContext::vertexAttrib3fv):
+        (WebCore::WebGLRenderingContext::vertexAttrib4f):
+        (WebCore::WebGLRenderingContext::vertexAttrib4fv):
+        (WebCore::WebGLRenderingContext::vertexAttribfImpl):
+        (WebCore::WebGLRenderingContext::vertexAttribfvImpl):
+        * html/canvas/WebGLRenderingContext.h: Helper function declaration.
+
 2010-07-03  Jeremy Orlow  <jorlow@chromium.org>
 
         Ugh.  Have to put the destructor in the .h file since the .ccp isn't compiled yet.
index 1a750dfeec2fda9386b83c93d46e08b49fbe13a9..c3dea58676777fbcf355d651adc8ea3950237b1b 100644 (file)
@@ -2912,94 +2912,62 @@ void WebGLRenderingContext::validateProgram(WebGLProgram* program, ExceptionCode
 
 void WebGLRenderingContext::vertexAttrib1f(unsigned long index, float v0)
 {
-    // In GL, we skip setting vertexAttrib0 values.
-    if (index || isGLES2Compliant()) {
-        m_context->vertexAttrib1f(index, v0);
-        cleanupAfterGraphicsCall(false);
-    }
-    m_vertexAttribState[index].value[0] = v0;
-    m_vertexAttribState[index].value[1] = 0.0f;
-    m_vertexAttribState[index].value[2] = 0.0f;
-    m_vertexAttribState[index].value[3] = 1.0f;
+    vertexAttribfImpl(index, 1, v0, 0.0f, 0.0f, 1.0f);
 }
 
 void WebGLRenderingContext::vertexAttrib1fv(unsigned long index, Float32Array* v)
 {
-    vertexAttribImpl(index, v, 1);
+    vertexAttribfvImpl(index, v, 1);
 }
 
 void WebGLRenderingContext::vertexAttrib1fv(unsigned long index, float* v, int size)
 {
-    vertexAttribImpl(index, v, size, 1);
+    vertexAttribfvImpl(index, v, size, 1);
 }
 
 void WebGLRenderingContext::vertexAttrib2f(unsigned long index, float v0, float v1)
 {
-    // In GL, we skip setting vertexAttrib0 values.
-    if (index || isGLES2Compliant()) {
-        m_context->vertexAttrib2f(index, v0, v1);
-        cleanupAfterGraphicsCall(false);
-    }
-    m_vertexAttribState[index].value[0] = v0;
-    m_vertexAttribState[index].value[1] = v1;
-    m_vertexAttribState[index].value[2] = 0.0f;
-    m_vertexAttribState[index].value[3] = 1.0f;
+    vertexAttribfImpl(index, 2, v0, v1, 0.0f, 1.0f);
 }
 
 void WebGLRenderingContext::vertexAttrib2fv(unsigned long index, Float32Array* v)
 {
-    vertexAttribImpl(index, v, 2);
+    vertexAttribfvImpl(index, v, 2);
 }
 
 void WebGLRenderingContext::vertexAttrib2fv(unsigned long index, float* v, int size)
 {
-    vertexAttribImpl(index, v, size, 2);
+    vertexAttribfvImpl(index, v, size, 2);
 }
 
 void WebGLRenderingContext::vertexAttrib3f(unsigned long index, float v0, float v1, float v2)
 {
-    // In GL, we skip setting vertexAttrib0 values.
-    if (index || isGLES2Compliant()) {
-        m_context->vertexAttrib3f(index, v0, v1, v2);
-        cleanupAfterGraphicsCall(false);
-    }
-    m_vertexAttribState[index].value[0] = v0;
-    m_vertexAttribState[index].value[1] = v1;
-    m_vertexAttribState[index].value[2] = v2;
-    m_vertexAttribState[index].value[3] = 1.0f;
+    vertexAttribfImpl(index, 3, v0, v1, v2, 1.0f);
 }
 
 void WebGLRenderingContext::vertexAttrib3fv(unsigned long index, Float32Array* v)
 {
-    vertexAttribImpl(index, v, 3);
+    vertexAttribfvImpl(index, v, 3);
 }
 
 void WebGLRenderingContext::vertexAttrib3fv(unsigned long index, float* v, int size)
 {
-    vertexAttribImpl(index, v, size, 3);
+    vertexAttribfvImpl(index, v, size, 3);
 }
 
 void WebGLRenderingContext::vertexAttrib4f(unsigned long index, float v0, float v1, float v2, float v3)
 {
-    // In GL, we skip setting vertexAttrib0 values.
-    if (index || isGLES2Compliant()) {
-        m_context->vertexAttrib4f(index, v0, v1, v2, v3);
-        cleanupAfterGraphicsCall(false);
-    }
-    m_vertexAttribState[index].value[0] = v0;
-    m_vertexAttribState[index].value[1] = v1;
-    m_vertexAttribState[index].value[2] = v2;
-    m_vertexAttribState[index].value[3] = v3;
+    vertexAttribfImpl(index, 4, v0, v1, v2, v3);
 }
 
 void WebGLRenderingContext::vertexAttrib4fv(unsigned long index, Float32Array* v)
 {
-    vertexAttribImpl(index, v, 4);
+    vertexAttribfvImpl(index, v, 4);
 }
 
 void WebGLRenderingContext::vertexAttrib4fv(unsigned long index, float* v, int size)
 {
-    vertexAttribImpl(index, v, size, 4);
+    vertexAttribfvImpl(index, v, size, 4);
 }
 
 void WebGLRenderingContext::vertexAttribPointer(unsigned long index, long size, unsigned long type, bool normalized, long stride, long offset, ExceptionCode& ec)
@@ -3606,16 +3574,48 @@ bool WebGLRenderingContext::validateUniformMatrixParameters(const WebGLUniformLo
     return true;
 }
 
-void WebGLRenderingContext::vertexAttribImpl(unsigned long index, Float32Array* v, int expectedSize)
+void WebGLRenderingContext::vertexAttribfImpl(unsigned long index, int expectedSize, float v0, float v1, float v2, float v3)
+{
+    if (index >= m_maxVertexAttribs) {
+        m_context->synthesizeGLError(GraphicsContext3D::INVALID_VALUE);
+        return;
+    }
+    // In GL, we skip setting vertexAttrib0 values.
+    if (index || isGLES2Compliant()) {
+        switch (expectedSize) {
+        case 1:
+            m_context->vertexAttrib1f(index, v0);
+            break;
+        case 2:
+            m_context->vertexAttrib2f(index, v0, v1);
+            break;
+        case 3:
+            m_context->vertexAttrib3f(index, v0, v1, v2);
+            break;
+        case 4:
+            m_context->vertexAttrib4f(index, v0, v1, v2, v3);
+            break;
+        }
+        cleanupAfterGraphicsCall(false);
+    }
+    if (index >= m_vertexAttribState.size())
+        m_vertexAttribState.resize(index + 1);
+    m_vertexAttribState[index].value[0] = v0;
+    m_vertexAttribState[index].value[1] = v1;
+    m_vertexAttribState[index].value[2] = v2;
+    m_vertexAttribState[index].value[3] = v3;
+}
+
+void WebGLRenderingContext::vertexAttribfvImpl(unsigned long index, Float32Array* v, int expectedSize)
 {
     if (!v) {
         m_context->synthesizeGLError(GraphicsContext3D::INVALID_VALUE);
         return;
     }
-    vertexAttribImpl(index, v->data(), v->length(), expectedSize);
+    vertexAttribfvImpl(index, v->data(), v->length(), expectedSize);
 }
 
-void WebGLRenderingContext::vertexAttribImpl(unsigned long index, float* v, int size, int expectedSize)
+void WebGLRenderingContext::vertexAttribfvImpl(unsigned long index, float* v, int size, int expectedSize)
 {
     if (!v) {
         m_context->synthesizeGLError(GraphicsContext3D::INVALID_VALUE);
@@ -3625,6 +3625,10 @@ void WebGLRenderingContext::vertexAttribImpl(unsigned long index, float* v, int
         m_context->synthesizeGLError(GraphicsContext3D::INVALID_VALUE);
         return;
     }
+    if (index >= m_maxVertexAttribs) {
+        m_context->synthesizeGLError(GraphicsContext3D::INVALID_VALUE);
+        return;
+    }
     // In GL, we skip setting vertexAttrib0 values.
     if (index || isGLES2Compliant()) {
         switch (expectedSize) {
@@ -3643,6 +3647,8 @@ void WebGLRenderingContext::vertexAttribImpl(unsigned long index, float* v, int
         }
         cleanupAfterGraphicsCall(false);
     }
+    if (index >= m_vertexAttribState.size())
+        m_vertexAttribState.resize(index + 1);
     m_vertexAttribState[index].initValue();
     for (int ii = 0; ii < expectedSize; ++ii)
         m_vertexAttribState[index].value[ii] = v[ii];
index b3da05c93bd22d8d4dade89edc81a5f74b3b3367..be74001e9c64fddd26e0a30c4593ea51adba565e 100644 (file)
@@ -501,9 +501,10 @@ class WebKitCSSMatrix;
         bool validateUniformMatrixParameters(const WebGLUniformLocation* location, bool transpose, Float32Array* v, int mod);
         bool validateUniformMatrixParameters(const WebGLUniformLocation* location, bool transpose, void* v, int size, int mod);
 
-        // Helper functions for vertexAttribNfv.
-        void vertexAttribImpl(unsigned long index, Float32Array* v, int expectedSize);
-        void vertexAttribImpl(unsigned long index, float* v, int size, int expectedSize);
+        // Helper functions for vertexAttribNf{v}.
+        void vertexAttribfImpl(unsigned long index, int expectedSize, float v0, float v1, float v2, float v3);
+        void vertexAttribfvImpl(unsigned long index, Float32Array* v, int expectedSize);
+        void vertexAttribfvImpl(unsigned long index, float* v, int size, int expectedSize);
 
         // Helpers for simulating vertexAttrib0
         void initVertexAttrib0();