Insufficient validation when uploading depth textures to WebGL
authorkbr@google.com <kbr@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 27 Feb 2013 22:44:29 +0000 (22:44 +0000)
committerkbr@google.com <kbr@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 27 Feb 2013 22:44:29 +0000 (22:44 +0000)
https://bugs.webkit.org/show_bug.cgi?id=110931

Reviewed by Abhishek Arya.

Source/WebCore:

Updated webgl/conformance/extensions/webgl-depth-texture.html
layout test with additional test cases.

* html/canvas/WebGLRenderingContext.cpp:
(WebCore):
(WebCore::WebGLRenderingContext::texImage2D):
(WebCore::WebGLRenderingContext::texSubImage2DImpl):
(WebCore::WebGLRenderingContext::texSubImage2D):
    Check for valid format/type combinations, depth, and
    depth+stencil formats when uploading HTML elements and
    ImageData as textures.

LayoutTests:

Updated webgl/conformance/extensions/webgl-depth-texture.html
layout test with additional test cases. These changes will be
added to the Khronos repository.

* webgl/resources/webgl_test_files/conformance/extensions/webgl-depth-texture.html:
    Added more test cases.

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

LayoutTests/ChangeLog
LayoutTests/webgl/resources/webgl_test_files/conformance/extensions/webgl-depth-texture.html
Source/WebCore/ChangeLog
Source/WebCore/html/canvas/WebGLRenderingContext.cpp

index e849fab..f1473cb 100644 (file)
@@ -1,3 +1,17 @@
+2013-02-27  Kenneth Russell  <kbr@google.com>
+
+        Insufficient validation when uploading depth textures to WebGL
+        https://bugs.webkit.org/show_bug.cgi?id=110931
+
+        Reviewed by Abhishek Arya.
+
+        Updated webgl/conformance/extensions/webgl-depth-texture.html
+        layout test with additional test cases. These changes will be
+        added to the Khronos repository.
+
+        * webgl/resources/webgl_test_files/conformance/extensions/webgl-depth-texture.html:
+            Added more test cases.
+
 2013-02-27  Chris Fleizach  <cfleizach@apple.com>
  
         AX: Mac platform should support ability to scroll an element into visible
index c792f08..5246384 100644 (file)
@@ -71,13 +71,24 @@ var vao = null;
 var tex;
 var name;
 var supportedFormats;
+var res = 8;
 var canvas2;
+var imageData;
 
 if (!gl) {
     testFailed("WebGL context does not exist");
 } else {
     testPassed("WebGL context exists");
 
+    // make canvas for testing.
+    canvas2 = document.createElement("canvas");
+    canvas2.width = res;
+    canvas2.height = res;
+    var ctx = canvas2.getContext("2d");
+    ctx.fillStyle = "blue";
+    ctx.fillRect(0, 0, canvas2.width, canvas2.height);
+    imageData = ctx.getImageData(0, 0, canvas2.width, canvas2.height);
+
     // Run tests with extension disabled
     runTestDisabled();
 
@@ -119,9 +130,12 @@ function runTestDisabled() {
     gl.bindTexture(gl.TEXTURE_2D, tex);
     shouldGenerateGLError(gl, gl.INVALID_ENUM, 'gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT, 1, 1, 0, gl.DEPTH_COMPONENT, gl.UNSIGNED_SHORT, null)');
     shouldGenerateGLError(gl, gl.INVALID_ENUM, 'gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT, 1, 1, 0, gl.DEPTH_COMPONENT, gl.UNSIGNED_INT, null)');
+    shouldGenerateGLError(gl, gl.INVALID_ENUM, 'gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT, gl.DEPTH_COMPONENT, gl.UNSIGNED_SHORT, imageData)');
+    shouldGenerateGLError(gl, gl.INVALID_ENUM, 'gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT, gl.DEPTH_COMPONENT, gl.UNSIGNED_INT, imageData)');
+    shouldGenerateGLError(gl, gl.INVALID_ENUM, 'gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT, gl.DEPTH_COMPONENT, gl.UNSIGNED_SHORT, canvas2)');
+    shouldGenerateGLError(gl, gl.INVALID_ENUM, 'gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT, gl.DEPTH_COMPONENT, gl.UNSIGNED_INT, canvas2)');
 }
 
-
 function dumpIt(gl, res, msg) {
   return;  // comment out to debug
   debug(msg);
@@ -140,16 +154,6 @@ function dumpIt(gl, res, msg) {
 function runTestExtension() {
     debug("Testing WEBGL_depth_texture");
 
-    var res = 8;
-
-    // make canvas for testing.
-    canvas2 = document.createElement("canvas");
-    canvas2.width = res;
-    canvas2.height = res;
-    var ctx = canvas2.getContext("2d");
-    ctx.fillStyle = "blue";
-    ctx.fillRect(0, 0, canvas2.width, canvas2.height);
-
     var program = wtu.setupProgram(gl, ['vshader', 'fshader'], ['a_position']);
     gl.useProgram(program);
     gl.uniform2f(gl.getUniformLocation(program, "u_resolution"), res, res);
@@ -216,6 +220,15 @@ function runTestExtension() {
         // test with canvas
         shouldGenerateGLError(gl, [gl.INVALID_VALUE, gl.INVALID_ENUM, gl.INVALID_OPERATION], 'gl.texImage2D(gl.TEXTURE_2D, 0, gl.' + typeInfo.format + ', gl.' + typeInfo.format + ', ' + typeStr  + ', canvas2)');
 
+        // test with canvas with illegal internal format
+        shouldGenerateGLError(gl, [gl.INVALID_VALUE, gl.INVALID_ENUM, gl.INVALID_OPERATION], 'gl.texImage2D(gl.TEXTURE_2D, 0, 0, gl.' + typeInfo.format + ', ' + typeStr  + ', canvas2)');
+
+        // test with ImageData
+        shouldGenerateGLError(gl, [gl.INVALID_VALUE, gl.INVALID_ENUM, gl.INVALID_OPERATION], 'gl.texImage2D(gl.TEXTURE_2D, 0, gl.' + typeInfo.format + ', gl.' + typeInfo.format + ', ' + typeStr  + ', imageData)');
+
+        // test with ImageData with illegal internal format
+        shouldGenerateGLError(gl, [gl.INVALID_VALUE, gl.INVALID_ENUM, gl.INVALID_OPERATION], 'gl.texImage2D(gl.TEXTURE_2D, 0, 0, gl.' + typeInfo.format + ', ' + typeStr  + ', imageData)');
+
         // test copyTexImage2D
         shouldGenerateGLError(gl, [gl.INVALID_ENUM, gl.INVALID_OPERATION], 'gl.copyTexImage2D(gl.TEXTURE_2D, 0, gl.' + typeInfo.format + ', 0, 0, 1, 1, 0)');
 
@@ -225,6 +238,12 @@ function runTestExtension() {
         // test texSubImage2D
         shouldGenerateGLError(gl, gl.INVALID_OPERATION, 'gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 1, 1, gl.' + typeInfo.format + ', ' + typeStr  + ', ' + typeInfo.data + ')');
 
+        // test texSubImage2D with canvas
+        shouldGenerateGLError(gl, gl.INVALID_OPERATION, 'gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.' + typeInfo.format + ', ' + typeStr  + ', canvas2)');
+
+        // test texSubImage2D with ImageData
+        shouldGenerateGLError(gl, gl.INVALID_OPERATION, 'gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.' + typeInfo.format + ', ' + typeStr  + ', imageData)');
+
         // test copyTexSubImage2D
         shouldGenerateGLError(gl, gl.INVALID_OPERATION, 'gl.copyTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1)');
 
index 3117442..013d346 100644 (file)
@@ -1,3 +1,22 @@
+2013-02-27  Kenneth Russell  <kbr@google.com>
+
+        Insufficient validation when uploading depth textures to WebGL
+        https://bugs.webkit.org/show_bug.cgi?id=110931
+
+        Reviewed by Abhishek Arya.
+
+        Updated webgl/conformance/extensions/webgl-depth-texture.html
+        layout test with additional test cases.
+
+        * html/canvas/WebGLRenderingContext.cpp:
+        (WebCore):
+        (WebCore::WebGLRenderingContext::texImage2D):
+        (WebCore::WebGLRenderingContext::texSubImage2DImpl):
+        (WebCore::WebGLRenderingContext::texSubImage2D):
+            Check for valid format/type combinations, depth, and
+            depth+stencil formats when uploading HTML elements and
+            ImageData as textures.
+
 2013-02-27  Adam Barth  <abarth@webkit.org>
 
         Threaded HTML Parser fails fast/dom/HTMLAnchorElement/anchor-no-multiple-windows.html in debug
index 3f598c0..c17533c 100644 (file)
@@ -3711,6 +3711,10 @@ void WebGLRenderingContext::texImage2D(GC3Denum target, GC3Dint level, GC3Denum
     Vector<uint8_t> data;
     if (!pixels)
         return;
+    if (!validateTexFuncFormatAndType("texImage2D", format, type, level))
+        return;
+    if (!validateSettableTexFormat("texImage2D", format))
+        return;
     bool needConversion = true;
     // The data from ImageData is always of format RGBA8.
     // No conversion is needed if destination format is RGBA and type is USIGNED_BYTE and no Flip or Premultiply operation is required.
@@ -3759,6 +3763,10 @@ void WebGLRenderingContext::texImage2D(GC3Denum target, GC3Dint level, GC3Denum
         ec = SECURITY_ERR;
         return;
     }
+    if (!validateTexFuncFormatAndType("texImage2D", format, type, level))
+        return;
+    if (!validateSettableTexFormat("texImage2D", format))
+        return;
 
     WebGLTexture* texture = validateTextureBinding("texImage2D", target, true);
     // If possible, copy from the canvas element directly to the texture
@@ -3900,6 +3908,10 @@ void WebGLRenderingContext::texSubImage2DImpl(GC3Denum target, GC3Dint level, GC
     ec = 0;
     if (isContextLost())
         return;
+    if (!validateTexFuncFormatAndType("texSubImage2D", format, type, level))
+        return;
+    if (!validateSettableTexFormat("texSubImage2D", format))
+        return;
     Vector<uint8_t> data;
     GraphicsContext3D::ImageExtractor imageExtractor(image, domSource, premultiplyAlpha, m_unpackColorspaceConversion == GraphicsContext3D::NONE);  
     if (!imageExtractor.extractSucceeded()) {
@@ -3961,6 +3973,10 @@ void WebGLRenderingContext::texSubImage2D(GC3Denum target, GC3Dint level, GC3Din
         return;
     if (!pixels)
         return;
+    if (!validateTexFuncFormatAndType("texSubImage2D", format, type, level))
+        return;
+    if (!validateSettableTexFormat("texSubImage2D", format))
+        return;
     Vector<uint8_t> data;
     bool needConversion = true;
     // The data from ImageData is always of format RGBA8.
@@ -4009,6 +4025,10 @@ void WebGLRenderingContext::texSubImage2D(GC3Denum target, GC3Dint level, GC3Din
         ec = SECURITY_ERR;
         return;
     }
+    if (!validateTexFuncFormatAndType("texSubImage2D", format, type, level))
+        return;
+    if (!validateSettableTexFormat("texSubImage2D", format))
+        return;
     RefPtr<ImageData> imageData = canvas->getImageData();
     if (imageData)
         texSubImage2D(target, level, xoffset, yoffset, format, type, imageData.get(), ec);