From 0ff0af534ef150820ac218b6ef3614dc199de823 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Wed, 30 Jan 2019 14:57:24 +0100 Subject: worker: throw for duplicates in transfer list Throw a `DataCloneError` exception when encountering duplicate `ArrayBuffer`s or `MessagePort`s in the transfer list. Fixes: https://github.com/nodejs/node/issues/25786 PR-URL: https://github.com/nodejs/node/pull/25815 Reviewed-By: James M Snell Reviewed-By: Joyee Cheung Reviewed-By: Richard Lau Reviewed-By: Colin Ihrig --- .../test-worker-message-port-transfer-duplicate.js | 29 ++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 test/parallel/test-worker-message-port-transfer-duplicate.js (limited to 'test') diff --git a/test/parallel/test-worker-message-port-transfer-duplicate.js b/test/parallel/test-worker-message-port-transfer-duplicate.js new file mode 100644 index 0000000000..c893556d8d --- /dev/null +++ b/test/parallel/test-worker-message-port-transfer-duplicate.js @@ -0,0 +1,29 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const { MessageChannel } = require('worker_threads'); + +// Test that passing duplicate transferrables in the transfer list throws +// DataCloneError exceptions. + +{ + const { port1, port2 } = new MessageChannel(); + port2.once('message', common.mustNotCall()); + + const port3 = new MessageChannel().port1; + assert.throws(() => { + port1.postMessage(port3, [port3, port3]); + }, /^DataCloneError: Transfer list contains duplicate MessagePort$/); + port1.close(); +} + +{ + const { port1, port2 } = new MessageChannel(); + port2.once('message', common.mustNotCall()); + + const buf = new Uint8Array(10); + assert.throws(() => { + port1.postMessage(buf, [buf.buffer, buf.buffer]); + }, /^DataCloneError: Transfer list contains duplicate ArrayBuffer$/); + port1.close(); +} -- cgit v1.2.3