Skip to content

Commit 3b1ce93

Browse files
jasnelltargos
authored andcommitted
worker: add brand checks for detached MessageEvent accessors
Signed-off-by: James M Snell <jasnell@gmail.com> PR-URL: #39773 Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
1 parent 71659fd commit 3b1ce93

File tree

2 files changed

+60
-5
lines changed

2 files changed

+60
-5
lines changed

lib/internal/worker/io.js

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ function validateMessagePort(port, name) {
107107
throw new ERR_INVALID_ARG_TYPE(name, 'MessagePort', port);
108108
}
109109

110+
function isMessageEvent(value) {
111+
return value != null && kData in value;
112+
}
113+
110114
class MessageEvent extends Event {
111115
constructor(type, {
112116
data = null,
@@ -131,19 +135,49 @@ class MessageEvent extends Event {
131135

132136
ObjectDefineProperties(MessageEvent.prototype, {
133137
data: {
134-
get() { return this[kData]; }, enumerable: true, configurable: true
138+
get() {
139+
if (!isMessageEvent(this))
140+
throw new ERR_INVALID_THIS('MessageEvent');
141+
return this[kData];
142+
},
143+
enumerable: true,
144+
configurable: true,
135145
},
136146
origin: {
137-
get() { return this[kOrigin]; }, enumerable: true, configurable: true
147+
get() {
148+
if (!isMessageEvent(this))
149+
throw new ERR_INVALID_THIS('MessageEvent');
150+
return this[kOrigin];
151+
},
152+
enumerable: true,
153+
configurable: true,
138154
},
139155
lastEventId: {
140-
get() { return this[kLastEventId]; }, enumerable: true, configurable: true
156+
get() {
157+
if (!isMessageEvent(this))
158+
throw new ERR_INVALID_THIS('MessageEvent');
159+
return this[kLastEventId];
160+
},
161+
enumerable: true,
162+
configurable: true,
141163
},
142164
source: {
143-
get() { return this[kSource]; }, enumerable: true, configurable: true
165+
get() {
166+
if (!isMessageEvent(this))
167+
throw new ERR_INVALID_THIS('MessageEvent');
168+
return this[kSource];
169+
},
170+
enumerable: true,
171+
configurable: true,
144172
},
145173
ports: {
146-
get() { return this[kPorts]; }, enumerable: true, configurable: true
174+
get() {
175+
if (!isMessageEvent(this))
176+
throw new ERR_INVALID_THIS('MessageEvent');
177+
return this[kPorts];
178+
},
179+
enumerable: true,
180+
configurable: true,
147181
},
148182
});
149183

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Flags: --expose-internals
2+
'use strict';
3+
4+
require('../common');
5+
const assert = require('assert');
6+
7+
const {
8+
MessageEvent,
9+
} = require('internal/worker/io');
10+
11+
[
12+
'data',
13+
'origin',
14+
'lastEventId',
15+
'source',
16+
'ports',
17+
].forEach((i) => {
18+
assert.throws(() => Reflect.get(MessageEvent.prototype, i, {}), {
19+
code: 'ERR_INVALID_THIS',
20+
});
21+
});

0 commit comments

Comments
 (0)