Skip to content

Commit

Permalink
[wasm] PostMessage of Memory.buffer should throw
Browse files Browse the repository at this point in the history
PostMessage of an ArrayBuffer that is not detachable should result
in a DataCloneError.

Bug: chromium:1170176, chromium:961059
Change-Id: Ib89bbc10d2b58918067fd1a90365cad10a0db9ec
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2653810
Reviewed-by: Adam Klein <[email protected]>
Reviewed-by: Andreas Haas <[email protected]>
Commit-Queue: Deepti Gandluri <[email protected]>
Cr-Commit-Position: refs/heads/master@{#72415}
  • Loading branch information
dtig authored and Commit Bot committed Jan 28, 2021
1 parent fe95e24 commit dfcf1e8
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/common/message-template.h
Original file line number Diff line number Diff line change
Expand Up @@ -583,6 +583,8 @@ namespace internal {
T(DataCloneErrorOutOfMemory, "Data cannot be cloned, out of memory.") \
T(DataCloneErrorDetachedArrayBuffer, \
"An ArrayBuffer is detached and could not be cloned.") \
T(DataCloneErrorNonDetachableArrayBuffer, \
"ArrayBuffer is not detachable and could not be cloned.") \
T(DataCloneErrorSharedArrayBufferTransferred, \
"A SharedArrayBuffer could not be cloned. SharedArrayBuffer must not be " \
"transferred.") \
Expand Down
5 changes: 5 additions & 0 deletions src/objects/value-serializer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -875,6 +875,11 @@ Maybe<bool> ValueSerializer::WriteJSArrayBuffer(
WriteVarint(index.FromJust());
return ThrowIfOutOfMemory();
}
if (!array_buffer->is_detachable()) {
ThrowDataCloneError(
MessageTemplate::kDataCloneErrorNonDetachableArrayBuffer);
return Nothing<bool>();
}

uint32_t* transfer_entry = array_buffer_transfer_map_.Find(array_buffer);
if (transfer_entry) {
Expand Down
7 changes: 7 additions & 0 deletions test/mjsunit/wasm/worker-memory.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@
assertThrows(() => worker.postMessage(memory), Error);
})();

(function TestPostMessageUnsharedMemoryBuffer() {
let worker = new Worker('', {type: 'string'});
let memory = new WebAssembly.Memory({initial: 1, maximum: 2});

assertThrows(() => worker.postMessage(memory.buffer), Error);
})();

// Can't use assert in a worker.
function workerHelpersHelper() {
assertTrue = function(value, msg) {
Expand Down

0 comments on commit dfcf1e8

Please sign in to comment.