Skip to content

Commit 7c81f42

Browse files
committed
stream: reject duplicate nested transferables
Signed-off-by: Daeyeon Jeong <daeyeon.dev@gmail.com>
1 parent 320b450 commit 7c81f42

File tree

3 files changed

+26
-10
lines changed

3 files changed

+26
-10
lines changed

src/node_messaging.cc

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -415,10 +415,15 @@ class SerializerDelegate : public ValueSerializer::Delegate {
415415
if (!host_objects_[i]->NestedTransferables().To(&nested_transferables))
416416
return Nothing<bool>();
417417
for (auto& nested_transferable : nested_transferables) {
418-
if (std::ranges::find(host_objects_, nested_transferable) ==
418+
if (std::ranges::find(host_objects_, nested_transferable) !=
419419
host_objects_.end()) {
420-
AddHostObject(nested_transferable);
420+
ThrowDataCloneException(
421+
context_,
422+
FIXED_ONE_BYTE_STRING(env_->isolate(),
423+
"The transfer list is invalid."));
424+
return Nothing<bool>();
421425
}
426+
AddHostObject(nested_transferable);
422427
}
423428
}
424429
return Just(true);
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const assert = require('node:assert');
5+
6+
const combinations = [
7+
(t => [t, t.readable])(new TransformStream()),
8+
(t => [t.readable, t])(new TransformStream()),
9+
(t => [t, t.writable])(new TransformStream()),
10+
(t => [t.writable, t])(new TransformStream()),
11+
];
12+
13+
for (const combination of combinations) {
14+
assert.throws(() => structuredClone(combination, { transfer: combination }), {
15+
constructor: DOMException,
16+
name: 'DataCloneError',
17+
code: 25,
18+
});
19+
}

test/wpt/status/streams.json

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,6 @@
4141
"transferable/transfer-with-messageport.window.js": {
4242
"skip": "Browser-specific test"
4343
},
44-
"transferable/transform-stream-members.any.js": {
45-
"fail": {
46-
"expected": [
47-
"Transferring [object TransformStream],[object ReadableStream] should fail",
48-
"Transferring [object TransformStream],[object WritableStream] should fail"
49-
]
50-
}
51-
},
5244
"transform-streams/invalid-realm.tentative.window.js": {
5345
"skip": "Browser-specific test"
5446
}

0 commit comments

Comments
 (0)