src: fix inspector nullptr deref on abrupt exit
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 df79b7d821 ("src: fix missing handlescope bug in inspector".) PR-URL: https://github.com/nodejs/node/pull/17577 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Timothy Gu <timothygu99@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Refael Ackermann <refack@gmail.com> Reviewed-By: Eugene Ostroukhov <eostroukhov@google.com>
This commit is contained in:
parent
93656f4366
commit
88a9e2df85
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
34
test/sequential/test-inspector-async-call-stack-abort.js
Normal file
34
test/sequential/test-inspector-async-call-stack-abort.js
Normal file
@ -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);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user