Skip to content

Commit

Permalink
src: fix inspector nullptr deref on abrupt exit
Browse files Browse the repository at this point in the history
Fix a nullptr dereference on abrupt termination when async call stack
recording is enabled.

Bug discovered while trying to write a regression test for the bug fix
in commit df79b7d ("src: fix missing handlescope bug in inspector".)

PR-URL: #17577
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: Timothy Gu <[email protected]>
Reviewed-By: Colin Ihrig <[email protected]>
Reviewed-By: Refael Ackermann <[email protected]>
Reviewed-By: Eugene Ostroukhov <[email protected]>
  • Loading branch information
bnoordhuis authored and MylesBorins committed Jan 22, 2018
1 parent aada57b commit 0e20443
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 4 deletions.
10 changes: 6 additions & 4 deletions src/inspector_agent.cc
Original file line number Diff line number Diff line change
Expand Up @@ -325,10 +325,12 @@ class NodeInspectorClient : public V8InspectorClient {
}

void maxAsyncCallStackDepthChanged(int depth) override {
if (depth == 0) {
env_->inspector_agent()->DisableAsyncHook();
} else {
env_->inspector_agent()->EnableAsyncHook();
if (auto agent = env_->inspector_agent()) {
if (depth == 0) {
agent->DisableAsyncHook();
} else {
agent->EnableAsyncHook();
}
}
}

Expand Down
34 changes: 34 additions & 0 deletions test/sequential/test-inspector-async-call-stack-abort.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Check that abrupt termination when async call stack recording is enabled
// does not segfault the process.
'use strict';
const common = require('../common');
common.skipIfInspectorDisabled();
common.skipIf32Bits();

const { strictEqual } = require('assert');
const eyecatcher = 'nou, houdoe he?';

if (process.argv[2] === 'child') {
const { Session } = require('inspector');
const { promisify } = require('util');
const { registerAsyncHook } = process.binding('inspector');
(async () => {
let enabled = 0;
registerAsyncHook(() => ++enabled, () => {});
const session = new Session();
session.connect();
session.post = promisify(session.post);
await session.post('Debugger.enable');
strictEqual(enabled, 0);
await session.post('Debugger.setAsyncCallStackDepth', { maxDepth: 42 });
strictEqual(enabled, 1);
throw new Error(eyecatcher);
})();
} else {
const { spawnSync } = require('child_process');
const options = { encoding: 'utf8' };
const proc = spawnSync(process.execPath, [__filename, 'child'], options);
strictEqual(proc.status, 0);
strictEqual(proc.signal, null);
strictEqual(proc.stderr.includes(eyecatcher), true);
}

0 comments on commit 0e20443

Please sign in to comment.