Skip to content

Commit 4f28da8

Browse files
addaleaxMylesBorins
authored andcommitted
worker: fix nullptr deref after MessagePort deser failure
This would previously always have crashed when deserializing a `MessagePort` fails, because there was always at least one `nullptr` entry in the vector. PR-URL: #25076 Reviewed-By: Richard Lau <riclau@uk.ibm.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Gireesh Punathil <gpunathi@in.ibm.com>
1 parent 1f45b23 commit 4f28da8

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

src/node_messaging.cc

+2-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ MaybeLocal<Value> Message::Deserialize(Environment* env,
9090
if (ports[i] == nullptr) {
9191
for (MessagePort* port : ports) {
9292
// This will eventually release the MessagePort object itself.
93-
port->Close();
93+
if (port != nullptr)
94+
port->Close();
9495
}
9596
return MaybeLocal<Value>();
9697
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Flags: --experimental-worker
2+
'use strict';
3+
require('../common');
4+
const { Worker, MessageChannel } = require('worker_threads');
5+
6+
// Check the interaction of calling .terminate() while transferring
7+
// MessagePort objects; in particular, that it does not crash the process.
8+
9+
for (let i = 0; i < 10; ++i) {
10+
const w = new Worker(
11+
"require('worker_threads').parentPort.on('message', () => {})",
12+
{ eval: true });
13+
setImmediate(() => {
14+
const port = new MessageChannel().port1;
15+
w.postMessage({ port }, [ port ]);
16+
w.terminate();
17+
});
18+
}

0 commit comments

Comments
 (0)