debugger: guard against call from non-node context
authorBen Noordhuis <info@bnoordhuis.nl>
Thu, 17 Dec 2015 11:13:11 +0000 (12:13 +0100)
committerMyles Borins <mborins@us.ibm.com>
Mon, 15 Feb 2016 19:30:23 +0000 (11:30 -0800)
Fix a segmentation fault when the debug message handler was called from
a context without an associated `node::Environment`.

Fixes: https://github.com/nodejs/node/issues/4261
Fixes: https://github.com/nodejs/node/issues/4322
PR-URL: https://github.com/nodejs/node/pull/4328
Reviewed-By: Evan Lucas <evanlucas@me.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
src/debug-agent.cc
test/parallel/test-debug-no-context.js [new file with mode: 0644]

index 3409fb2..06ede7f 100644 (file)
@@ -321,6 +321,8 @@ void Agent::EnqueueMessage(AgentMessage* message) {
 void Agent::MessageHandler(const v8::Debug::Message& message) {
   Isolate* isolate = message.GetIsolate();
   Environment* env = Environment::GetCurrent(isolate);
+  if (env == nullptr)
+    return;  // Called from a non-node context.
   Agent* a = env->debugger_agent();
   CHECK_NE(a, nullptr);
   CHECK_EQ(isolate, a->parent_env()->isolate());
diff --git a/test/parallel/test-debug-no-context.js b/test/parallel/test-debug-no-context.js
new file mode 100644 (file)
index 0000000..a143e67
--- /dev/null
@@ -0,0 +1,24 @@
+'use strict';
+
+const common = require('../common');
+const assert = require('assert');
+const spawn = require('child_process').spawn;
+
+const args = [`--debug`, `--debug-port=${common.PORT}`, `--interactive`];
+const proc = spawn(process.execPath, args, { stdio: 'pipe' });
+proc.stdin.write(`
+    util.inspect(Promise.resolve(42));
+    util.inspect(Promise.resolve(1337));
+    .exit
+`);
+proc.on('exit', common.mustCall((exitCode, signalCode) => {
+  assert.strictEqual(exitCode, 0);
+  assert.strictEqual(signalCode, null);
+}));
+let stdout = '';
+proc.stdout.setEncoding('utf8');
+proc.stdout.on('data', data => stdout += data);
+process.on('exit', () => {
+  assert(stdout.includes('Promise { 42 }'));
+  assert(stdout.includes('Promise { 1337 }'));
+});