TypedArray.prototype.slice should use the byteLength of passed array for memmove
authorkeith_miller@apple.com <keith_miller@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 11 May 2016 02:04:19 +0000 (02:04 +0000)
committerkeith_miller@apple.com <keith_miller@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 11 May 2016 02:04:19 +0000 (02:04 +0000)
https://bugs.webkit.org/show_bug.cgi?id=157551
<rdar://problem/26179914>

Reviewed by Michael Saboff.

The TypedArray.prototype.slice function would use the byteLength of the passed array
to determine the amount of data to copy. It should have been using the passed length
times the size of each element. This fixes a crash on JavaPoly.com

* runtime/JSGenericTypedArrayViewInlines.h:
(JSC::JSGenericTypedArrayView<Adaptor>::set):
* tests/stress/typedarray-slice.js:

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/JSGenericTypedArrayViewInlines.h
Source/JavaScriptCore/tests/stress/typedarray-slice.js

index 79a248a..4f430e4 100644 (file)
@@ -1,3 +1,19 @@
+2016-05-10  Keith Miller  <keith_miller@apple.com>
+
+        TypedArray.prototype.slice should use the byteLength of passed array for memmove
+        https://bugs.webkit.org/show_bug.cgi?id=157551
+        <rdar://problem/26179914>
+
+        Reviewed by Michael Saboff.
+
+        The TypedArray.prototype.slice function would use the byteLength of the passed array
+        to determine the amount of data to copy. It should have been using the passed length
+        times the size of each element. This fixes a crash on JavaPoly.com
+
+        * runtime/JSGenericTypedArrayViewInlines.h:
+        (JSC::JSGenericTypedArrayView<Adaptor>::set):
+        * tests/stress/typedarray-slice.js:
+
 2016-05-10  Michael Saboff  <msaboff@apple.com>
 
         REGRESSION(r200447): Unable to build C_LOOP with clang version 800.0.12 or higher
index 131ba5f..0be2d8a 100644 (file)
@@ -231,7 +231,7 @@ bool JSGenericTypedArrayView<Adaptor>::set(
         if (!validateRange(exec, offset, length))
             return false;
 
-        memmove(typedVector() + offset, other->typedVector() + objectOffset, other->byteLength());
+        memmove(typedVector() + offset, other->typedVector() + objectOffset, length * elementSize);
         return true;
     }
     
index c485155..6c50979 100644 (file)
@@ -20,6 +20,7 @@ shouldBeTrue("testPrototypeFunction('slice', '(0, -5)', [12, 5, 8, 13, 44], [])"
 shouldBeTrue("testPrototypeFunction('slice', '(-3, -2)', [12, 5, 8, 13, 44], [8])");
 shouldBeTrue("testPrototypeFunction('slice', '(4, 2)', [12, 5, 8, 13, 44], [])");
 shouldBeTrue("testPrototypeFunction('slice', '(-50, 50)', [12, 5, 8, 13, 44], [12, 5, 8, 13, 44])");
+shouldBeTrue("testPrototypeFunction('slice', '(0, 10)', 100000, [0,0,0,0,0,0,0,0,0,0])");
 debug("");
 
 debug("2.0 Preserve Underlying bits");