Skip to content

Commit 6c536ed

Browse files
bnoordhuisMyles Borins
authored and
Myles Borins
committed
debugger: guard against call from non-node context
Fix a segmentation fault when the debug message handler was called from a context without an associated `node::Environment`. Fixes: #4261 Fixes: #4322 PR-URL: #4328 Reviewed-By: Evan Lucas <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent d96e385 commit 6c536ed

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

src/debug-agent.cc

+2
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,8 @@ void Agent::EnqueueMessage(AgentMessage* message) {
321321
void Agent::MessageHandler(const v8::Debug::Message& message) {
322322
Isolate* isolate = message.GetIsolate();
323323
Environment* env = Environment::GetCurrent(isolate);
324+
if (env == nullptr)
325+
return; // Called from a non-node context.
324326
Agent* a = env->debugger_agent();
325327
CHECK_NE(a, nullptr);
326328
CHECK_EQ(isolate, a->parent_env()->isolate());
+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const assert = require('assert');
5+
const spawn = require('child_process').spawn;
6+
7+
const args = [`--debug`, `--debug-port=${common.PORT}`, `--interactive`];
8+
const proc = spawn(process.execPath, args, { stdio: 'pipe' });
9+
proc.stdin.write(`
10+
util.inspect(Promise.resolve(42));
11+
util.inspect(Promise.resolve(1337));
12+
.exit
13+
`);
14+
proc.on('exit', common.mustCall((exitCode, signalCode) => {
15+
assert.strictEqual(exitCode, 0);
16+
assert.strictEqual(signalCode, null);
17+
}));
18+
let stdout = '';
19+
proc.stdout.setEncoding('utf8');
20+
proc.stdout.on('data', data => stdout += data);
21+
process.on('exit', () => {
22+
assert(stdout.includes('Promise { 42 }'));
23+
assert(stdout.includes('Promise { 1337 }'));
24+
});

0 commit comments

Comments
 (0)