瀏覽代碼

Array.prototype.unshift does not marshal parameters correctly

Fixes OS 9357224.

Array.prototype.unshift does not take the slow path if 'this' is a cross-site object.
Tom Care 9 年之前
父節點
當前提交
e1938977b3
共有 3 個文件被更改,包括 10 次插入2 次删除
  1. 1 1
      lib/Runtime/Library/JavascriptArray.cpp
  2. 1 0
      test/Array/shift_unshift.baseline
  3. 8 1
      test/Array/shift_unshift.js

+ 1 - 1
lib/Runtime/Library/JavascriptArray.cpp

@@ -7563,7 +7563,7 @@ Case0:
         {
            return res;
         }
-        if (JavascriptArray::Is(args[0]))
+        if (JavascriptArray::Is(args[0]) && !JavascriptArray::FromVar(args[0])->IsCrossSiteObject())
         {
 #if ENABLE_COPYONACCESS_ARRAY
             JavascriptLibrary::CheckAndConvertCopyOnAccessNativeIntArray<Var>(args[0]);

+ 1 - 0
test/Array/shift_unshift.baseline

@@ -48,6 +48,7 @@ e instanceOf TypeError = true
 a.length = 1
 ary.length = 18
 arr.length = 6
+Crosssite new length: 2
 Overridden unshift
 Overridden unshift
 Overridden unshift

+ 8 - 1
test/Array/shift_unshift.js

@@ -140,6 +140,14 @@ function test1(arr)
 
 WScript.Echo("arr.length = " + test1(new Array(10)));
 
+// OS 9357224: Array.prototype.unshift does not marshal parameters correctly
+function crossSiteUnshift() {
+    var sc0 = WScript.LoadScript('', 'samethread');
+    sc0.ary = [1];
+    return sc0.eval('Array.prototype.unshift.call(ary, null)');
+}
+WScript.Echo("Crosssite new length: " + crossSiteUnshift()); // 2
+
 //
 // To check bailouts for inlined unshift
 //
@@ -164,4 +172,3 @@ function foo()
 Array.prototype.unshift = function(){WScript.Echo ("Overridden unshift")};
 foo();
 WScript.Echo (a);
-