Skip to content

Commit 77a0a0f

Browse files
authored
inspector: fix crash when receiving non json message
PR-URL: nodejs/node#60388 Reviewed-By: Chengzhong Wu <[email protected]> Reviewed-By: Kohei Ueno <[email protected]>
1 parent 63f8340 commit 77a0a0f

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

src/inspector_io.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,9 @@ std::optional<std::string> InspectorIoDelegate::GetTargetSessionId(
353353
std::string_view view(message.data(), message.size());
354354
std::unique_ptr<protocol::DictionaryValue> value =
355355
protocol::DictionaryValue::cast(JsonUtil::parseJSON(view));
356+
if (!value) {
357+
return std::nullopt;
358+
}
356359
protocol::String target_session_id;
357360
protocol::Value* target_session_id_value = value->get("sessionId");
358361
if (target_session_id_value) {
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
'use strict';
2+
const common = require('../common');
3+
common.skipIfInspectorDisabled();
4+
const { spawn } = require('node:child_process');
5+
const assert = require('node:assert');
6+
7+
(async () => {
8+
const child = spawn(
9+
process.execPath,
10+
['--inspect-wait=0', '-e', "console.log('test');"],
11+
{}
12+
);
13+
14+
const url = await new Promise((resolve) => {
15+
child.stderr.on('data', (data) => {
16+
const msg = data.toString();
17+
const match = msg.match(/ws:\/\/127\.0\.0\.1:(\d+)\/([a-f0-9-]+)/);
18+
if (match) {
19+
child.stderr.removeAllListeners('data');
20+
return resolve(match[0]);
21+
}
22+
});
23+
});
24+
25+
child.once('exit', (_, signal) => {
26+
assert.strictEqual(signal, 'SIGTERM');
27+
});
28+
29+
const socket = new WebSocket(url);
30+
31+
socket.addEventListener('open', common.mustCall(() => {
32+
socket.send('This is not a valid protocol message');
33+
}));
34+
35+
socket.addEventListener('message', common.mustCall((event) => {
36+
assert.ok(Object.keys(JSON.parse(event.data)).includes('error'));
37+
socket.close();
38+
child.kill();
39+
}));
40+
})().then(common.mustCall());

0 commit comments

Comments
 (0)