[Chromium] WebGL typed array constructor crashes on exception
authorkbr@google.com <kbr@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 11 Jan 2013 18:39:10 +0000 (18:39 +0000)
committerkbr@google.com <kbr@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 11 Jan 2013 18:39:10 +0000 (18:39 +0000)
https://bugs.webkit.org/show_bug.cgi?id=106308

Reviewed by Kentaro Hara.

Source/WebCore:

Check for empty handles (indicating exception thrown) after calls
into V8 VM.

Added new case from Khronos typed array conformance tests to
fast/canvas/webgl/array-unit-tests.html.

* bindings/v8/custom/V8ArrayBufferViewCustom.h:
(WebCore::constructWebGLArray):
    Check for empty handles after calls into V8 VM.

LayoutTests:

Updated typed array tests to latest version from Khronos repository.

* fast/canvas/webgl/array-unit-tests-expected.txt:
* fast/canvas/webgl/array-unit-tests.html:

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

LayoutTests/ChangeLog
LayoutTests/fast/canvas/webgl/array-unit-tests-expected.txt
LayoutTests/fast/canvas/webgl/array-unit-tests.html
Source/WebCore/ChangeLog
Source/WebCore/bindings/v8/custom/V8ArrayBufferViewCustom.h

index 5d97dc433f56e363b5b05c90399e8ea7d1301043..246b0601626657a2a752f13d8d2cb4bbfeef8683 100644 (file)
@@ -1,3 +1,15 @@
+2013-01-11  Kenneth Russell  <kbr@google.com>
+
+        [Chromium] WebGL typed array constructor crashes on exception
+        https://bugs.webkit.org/show_bug.cgi?id=106308
+
+        Reviewed by Kentaro Hara.
+
+        Updated typed array tests to latest version from Khronos repository.
+
+        * fast/canvas/webgl/array-unit-tests-expected.txt:
+        * fast/canvas/webgl/array-unit-tests.html:
+
 2013-01-11  Florin Malita  <fmalita@chromium.org>
 
         [SVG] Suppress resource rebuilding for unattached and shadow elements
index 304176f231a868ed3c6d84617d1eb8df9176e234..7ff651cfc90fcc86966b437385109811667ddba7 100644 (file)
@@ -37,6 +37,7 @@ PASS test Float32Array ConstructionBoundaryConditions
 PASS Construction of Float32Array with null buffer threw exception
 PASS Construction of Float32Array with (null buffer, 0) threw exception
 PASS Construction of Float32Array with (null buffer, 0, 0) threw exception
+PASS Construction of Float32Array with exception-throwing array-like object didn't crash unexpectedly
 PASS Construction of Float32Array with out-of-range number of elements threw an exception
 PASS Construction of Float32Array with out-of-range offset threw an exception
 PASS Construction of ArrayBuffer with negative size threw exception
@@ -92,6 +93,7 @@ PASS test Float64Array ConstructionBoundaryConditions
 PASS Construction of Float64Array with null buffer threw exception
 PASS Construction of Float64Array with (null buffer, 0) threw exception
 PASS Construction of Float64Array with (null buffer, 0, 0) threw exception
+PASS Construction of Float64Array with exception-throwing array-like object didn't crash unexpectedly
 PASS Construction of Float64Array with out-of-range number of elements threw an exception
 PASS Construction of Float64Array with out-of-range offset threw an exception
 PASS Construction of ArrayBuffer with negative size threw exception
@@ -148,6 +150,7 @@ PASS test Int8Array ConstructionBoundaryConditions
 PASS Construction of Int8Array with null buffer threw exception
 PASS Construction of Int8Array with (null buffer, 0) threw exception
 PASS Construction of Int8Array with (null buffer, 0, 0) threw exception
+PASS Construction of Int8Array with exception-throwing array-like object didn't crash unexpectedly
 PASS Construction of Int8Array with out-of-range number of elements threw an exception
 PASS Construction of Int8Array with out-of-range offset threw an exception
 PASS Construction of ArrayBuffer with negative size threw exception
@@ -199,6 +202,7 @@ PASS test Int16Array ConstructionBoundaryConditions
 PASS Construction of Int16Array with null buffer threw exception
 PASS Construction of Int16Array with (null buffer, 0) threw exception
 PASS Construction of Int16Array with (null buffer, 0, 0) threw exception
+PASS Construction of Int16Array with exception-throwing array-like object didn't crash unexpectedly
 PASS Construction of Int16Array with out-of-range number of elements threw an exception
 PASS Construction of Int16Array with out-of-range offset threw an exception
 PASS Construction of ArrayBuffer with negative size threw exception
@@ -255,6 +259,7 @@ PASS test Int32Array ConstructionBoundaryConditions
 PASS Construction of Int32Array with null buffer threw exception
 PASS Construction of Int32Array with (null buffer, 0) threw exception
 PASS Construction of Int32Array with (null buffer, 0, 0) threw exception
+PASS Construction of Int32Array with exception-throwing array-like object didn't crash unexpectedly
 PASS Construction of Int32Array with out-of-range number of elements threw an exception
 PASS Construction of Int32Array with out-of-range offset threw an exception
 PASS Construction of ArrayBuffer with negative size threw exception
@@ -311,6 +316,7 @@ PASS test Uint8Array ConstructionBoundaryConditions
 PASS Construction of Uint8Array with null buffer threw exception
 PASS Construction of Uint8Array with (null buffer, 0) threw exception
 PASS Construction of Uint8Array with (null buffer, 0, 0) threw exception
+PASS Construction of Uint8Array with exception-throwing array-like object didn't crash unexpectedly
 PASS Construction of Uint8Array with out-of-range number of elements threw an exception
 PASS Construction of Uint8Array with out-of-range offset threw an exception
 PASS Construction of ArrayBuffer with negative size threw exception
@@ -362,6 +368,7 @@ PASS test Uint8ClampedArray ConstructionBoundaryConditions
 PASS Construction of Uint8ClampedArray with null buffer threw exception
 PASS Construction of Uint8ClampedArray with (null buffer, 0) threw exception
 PASS Construction of Uint8ClampedArray with (null buffer, 0, 0) threw exception
+PASS Construction of Uint8ClampedArray with exception-throwing array-like object didn't crash unexpectedly
 PASS Construction of Uint8ClampedArray with out-of-range number of elements threw an exception
 PASS Construction of Uint8ClampedArray with out-of-range offset threw an exception
 PASS Construction of ArrayBuffer with negative size threw exception
@@ -413,6 +420,7 @@ PASS test Uint16Array ConstructionBoundaryConditions
 PASS Construction of Uint16Array with null buffer threw exception
 PASS Construction of Uint16Array with (null buffer, 0) threw exception
 PASS Construction of Uint16Array with (null buffer, 0, 0) threw exception
+PASS Construction of Uint16Array with exception-throwing array-like object didn't crash unexpectedly
 PASS Construction of Uint16Array with out-of-range number of elements threw an exception
 PASS Construction of Uint16Array with out-of-range offset threw an exception
 PASS Construction of ArrayBuffer with negative size threw exception
@@ -469,6 +477,7 @@ PASS test Uint32Array ConstructionBoundaryConditions
 PASS Construction of Uint32Array with null buffer threw exception
 PASS Construction of Uint32Array with (null buffer, 0) threw exception
 PASS Construction of Uint32Array with (null buffer, 0, 0) threw exception
+PASS Construction of Uint32Array with exception-throwing array-like object didn't crash unexpectedly
 PASS Construction of Uint32Array with out-of-range number of elements threw an exception
 PASS Construction of Uint32Array with out-of-range offset threw an exception
 PASS Construction of ArrayBuffer with negative size threw exception
index 86d76d0604f26882426e967222a82480cff632d7..e9b301780b04fb542636eed4c701190317da0747 100644 (file)
@@ -544,6 +544,16 @@ function testConstructionWithNullBuffer(type, name) {
     }
 }
 
+function testConstructionWithExceptionThrowingObject(type, name) {
+    var o = {};
+    Object.defineProperty(o, "length", { get: function() { throw "bail;" }});
+    try {
+        var array = new type(o);
+    } catch (e) {
+    }
+    testPassed("Construction of " + name + " with exception-throwing array-like object didn't crash unexpectedly");
+}
+
 function shouldThrowIndexSizeErr(func, text) {
     var errorText = text + " should throw an exception";
     try {
@@ -1063,6 +1073,7 @@ function runTests() {
                                        testCase.testValues,
                                        testCase.expectedValues);
     testConstructionWithNullBuffer(type, name);
+    testConstructionWithExceptionThrowingObject(type, name);
     testConstructionWithOutOfRangeValues(type, name);
     testConstructionWithNegativeOutOfRangeValues(type, name);
     testConstructionWithUnalignedOffset(type, name, testCase.elementSizeInBytes);
index 76c806ed75916bbd8f1edd1da6e0aaa19324c224..5a339afd263203434089226e45285ae8c9861afc 100644 (file)
@@ -1,3 +1,20 @@
+2013-01-11  Kenneth Russell  <kbr@google.com>
+
+        [Chromium] WebGL typed array constructor crashes on exception
+        https://bugs.webkit.org/show_bug.cgi?id=106308
+
+        Reviewed by Kentaro Hara.
+
+        Check for empty handles (indicating exception thrown) after calls
+        into V8 VM.
+
+        Added new case from Khronos typed array conformance tests to
+        fast/canvas/webgl/array-unit-tests.html.
+
+        * bindings/v8/custom/V8ArrayBufferViewCustom.h:
+        (WebCore::constructWebGLArray):
+            Check for empty handles after calls into V8 VM.
+
 2013-01-11  Kentaro Hara  <haraken@chromium.org>
 
         [V8] Slightly optimize getWrapperFast()
index 7b4662d07148b241dc0191215684e318afd76056..78d10bb0e7867fc0c541d1bff1c6d5e82faf7c31 100644 (file)
@@ -171,7 +171,12 @@ v8::Handle<v8::Value> constructWebGLArray(const v8::Arguments& args, WrapperType
         srcArray = args[0]->ToObject();
         if (srcArray.IsEmpty())
             return throwTypeError("Could not convert argument 0 to an array", args.GetIsolate());
-        len = toUInt32(srcArray->Get(v8::String::NewSymbol("length")));
+        v8::Local<v8::Value> val = srcArray->Get(v8::String::NewSymbol("length"));
+        if (val.IsEmpty()) {
+            // Exception thrown during fetch of length property.
+            return v8Undefined();
+        }
+        len = toUInt32(val);
         doInstantiation = true;
     } else {
         bool ok = false;
@@ -208,8 +213,14 @@ v8::Handle<v8::Value> constructWebGLArray(const v8::Arguments& args, WrapperType
     if (!srcArray.IsEmpty()) {
         bool copied = copyElements(args.Holder(), srcArray, len, 0, args.GetIsolate());
         if (!copied) {
-            for (unsigned i = 0; i < len; i++)
-                array->set(i, srcArray->Get(i)->NumberValue());
+            for (unsigned i = 0; i < len; i++) {
+                v8::Local<v8::Value> val = srcArray->Get(i);
+                if (val.IsEmpty()) {
+                    // Exception thrown during fetch.
+                    return v8Undefined();
+                }
+                array->set(i, val->NumberValue());
+            }
         }
     }