Skip to content

Commit dfcf1e8

Browse files
dtigCommit Bot
authored andcommitted
[wasm] PostMessage of Memory.buffer should throw
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 <adamk@chromium.org> Reviewed-by: Andreas Haas <ahaas@chromium.org> Commit-Queue: Deepti Gandluri <gdeepti@chromium.org> Cr-Commit-Position: refs/heads/master@{#72415}
1 parent fe95e24 commit dfcf1e8

3 files changed

Lines changed: 14 additions & 0 deletions

File tree

src/common/message-template.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,8 @@ namespace internal {
583583
T(DataCloneErrorOutOfMemory, "Data cannot be cloned, out of memory.") \
584584
T(DataCloneErrorDetachedArrayBuffer, \
585585
"An ArrayBuffer is detached and could not be cloned.") \
586+
T(DataCloneErrorNonDetachableArrayBuffer, \
587+
"ArrayBuffer is not detachable and could not be cloned.") \
586588
T(DataCloneErrorSharedArrayBufferTransferred, \
587589
"A SharedArrayBuffer could not be cloned. SharedArrayBuffer must not be " \
588590
"transferred.") \

src/objects/value-serializer.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -875,6 +875,11 @@ Maybe<bool> ValueSerializer::WriteJSArrayBuffer(
875875
WriteVarint(index.FromJust());
876876
return ThrowIfOutOfMemory();
877877
}
878+
if (!array_buffer->is_detachable()) {
879+
ThrowDataCloneError(
880+
MessageTemplate::kDataCloneErrorNonDetachableArrayBuffer);
881+
return Nothing<bool>();
882+
}
878883

879884
uint32_t* transfer_entry = array_buffer_transfer_map_.Find(array_buffer);
880885
if (transfer_entry) {

test/mjsunit/wasm/worker-memory.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@
1111
assertThrows(() => worker.postMessage(memory), Error);
1212
})();
1313

14+
(function TestPostMessageUnsharedMemoryBuffer() {
15+
let worker = new Worker('', {type: 'string'});
16+
let memory = new WebAssembly.Memory({initial: 1, maximum: 2});
17+
18+
assertThrows(() => worker.postMessage(memory.buffer), Error);
19+
})();
20+
1421
// Can't use assert in a worker.
1522
function workerHelpersHelper() {
1623
assertTrue = function(value, msg) {

0 commit comments

Comments
 (0)