Skip to content

Commit 5685636

Browse files
committed
worker: protect against user mutating well-known prototypes
PR-URL: nodejs/node#49270 Fixes: nodejs/node#49259 Reviewed-By: Ben Noordhuis <[email protected]> Reviewed-By: Benjamin Gruenbaum <[email protected]> Reviewed-By: Matthew Aitken <[email protected]> Reviewed-By: Yagiz Nizipli <[email protected]>
1 parent 4fdb81b commit 5685636

File tree

2 files changed

+8
-4
lines changed

2 files changed

+8
-4
lines changed

graal-nodejs/lib/internal/worker/io.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const {
2222
const {
2323
kEmptyObject,
2424
kEnumerableProperty,
25+
setOwnProperty,
2526
} = require('internal/util');
2627

2728
const {
@@ -312,15 +313,15 @@ function setupPortReferencing(port, eventEmitter, eventName) {
312313
if (name === eventName) removeListener(eventEmitter.listenerCount(name));
313314
});
314315
const origNewListener = eventEmitter[kNewListener];
315-
eventEmitter[kNewListener] = function(size, type, ...args) {
316+
setOwnProperty(eventEmitter, kNewListener, function(size, type, ...args) {
316317
if (type === eventName) newListener(size - 1);
317318
return ReflectApply(origNewListener, this, arguments);
318-
};
319+
});
319320
const origRemoveListener = eventEmitter[kRemoveListener];
320-
eventEmitter[kRemoveListener] = function(size, type, ...args) {
321+
setOwnProperty(eventEmitter, kRemoveListener, function(size, type, ...args) {
321322
if (type === eventName) removeListener(size);
322323
return ReflectApply(origRemoveListener, this, arguments);
323-
};
324+
});
324325

325326
function newListener(size) {
326327
if (size === 0) {

graal-nodejs/test/parallel/test-worker-message-channel.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ const common = require('../common');
33
const assert = require('assert');
44
const { MessageChannel, MessagePort, Worker } = require('worker_threads');
55

6+
// Asserts that freezing the EventTarget prototype does not make the internal throw.
7+
Object.freeze(EventTarget.prototype);
8+
69
{
710
const channel = new MessageChannel();
811

0 commit comments

Comments
 (0)