Reviewers: Jarin (OOO - vacation),

Description:
[d8 worker] Fix regression when serializing very large arraybuffer

BUG=chromium:514081
[email protected]

Please review this at https://codereview.chromium.org/1264723002/

Base URL: https://chromium.googlesource.com/v8/v8.git@master

Affected files (+19, -5 lines):
  M src/d8.cc
  A test/mjsunit/regress/regress-crbug-514081.js


Index: src/d8.cc
diff --git a/src/d8.cc b/src/d8.cc
index 9aeac11bb0a439b59a8933a6b15cdc8f0ac1116f..f53451e2e067d2d5fc704893b19106d740a0b006 100644
--- a/src/d8.cc
+++ b/src/d8.cc
@@ -2070,16 +2070,15 @@ bool Shell::SerializeValue(Isolate* isolate, Local<Value> value,
     } else {
       ArrayBuffer::Contents contents = array_buffer->GetContents();
       // Clone ArrayBuffer
-      if (contents.ByteLength() > i::kMaxUInt32) {
+      if (contents.ByteLength() > i::kMaxInt) {
         Throw(isolate, "ArrayBuffer is too big to clone");
         return false;
       }

-      int byte_length = static_cast<int>(contents.ByteLength());
+      int32_t byte_length = static_cast<int32_t>(contents.ByteLength());
       out_data->WriteTag(kSerializationTagArrayBuffer);
       out_data->Write(byte_length);
-      out_data->WriteMemory(contents.Data(),
-                            static_cast<int>(contents.ByteLength()));
+      out_data->WriteMemory(contents.Data(), byte_length);
     }
   } else if (value->IsSharedArrayBuffer()) {
     Local<SharedArrayBuffer> sab = Local<SharedArrayBuffer>::Cast(value);
@@ -2204,7 +2203,7 @@ MaybeLocal<Value> Shell::DeserializeValue(Isolate* isolate,
       break;
     }
     case kSerializationTagArrayBuffer: {
-      int byte_length = data.Read<int>(offset);
+      int32_t byte_length = data.Read<int32_t>(offset);
Local<ArrayBuffer> array_buffer = ArrayBuffer::New(isolate, byte_length);
       ArrayBuffer::Contents contents = array_buffer->GetContents();
       DCHECK(static_cast<size_t>(byte_length) == contents.ByteLength());
Index: test/mjsunit/regress/regress-crbug-514081.js
diff --git a/test/mjsunit/regress/regress-crbug-514081.js b/test/mjsunit/regress/regress-crbug-514081.js
new file mode 100644
index 0000000000000000000000000000000000000000..1acd8315cd4e7faf9188697140f0d3ce49574ec7
--- /dev/null
+++ b/test/mjsunit/regress/regress-crbug-514081.js
@@ -0,0 +1,15 @@
+// Copyright 2015 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+if (this.Worker) {
+  var __v_7 = new Worker('onmessage = function() {};');
+  try {
+    var ab = new ArrayBuffer(2147483648);
+    // If creating the ArrayBuffer succeeded, then postMessage should fail.
+    assertThrows(function() { __v_7.postMessage(ab); });
+  } catch (e) {
+    // Creating the ArrayBuffer failed.
+    assertInstanceof(e, RangeError);
+  }
+}


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to