Skip to content

Commit

Permalink
async_hooks: check for empty contexts before removing
Browse files Browse the repository at this point in the history
This way we don't end up attempting to SetPromiseHooks on contexts that
have already been collected.

Fixes: #39019
  • Loading branch information
bengl committed Jun 19, 2021
1 parent 98139df commit ba8af23
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 1 deletion.
7 changes: 6 additions & 1 deletion src/env-inl.h
Original file line number Diff line number Diff line change
Expand Up @@ -256,8 +256,13 @@ inline void AsyncHooks::RemoveContext(v8::Local<v8::Context> ctx) {
v8::Isolate* isolate = env()->isolate();
v8::HandleScope handle_scope(isolate);
for (auto it = contexts_.begin(); it != contexts_.end(); it++) {
if (it->IsEmpty()) {
contexts_.erase(it);
it--;
continue;
}
v8::Local<v8::Context> saved_context =
PersistentToLocal::Weak(env()->isolate(), *it);
PersistentToLocal::Weak(isolate, *it);
if (saved_context == ctx) {
it->Reset();
contexts_.erase(it);
Expand Down
15 changes: 15 additions & 0 deletions test/parallel/test-async-hooks-vm-gc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// Flags: --expose-gc
'use strict';

require('../common');
const asyncHooks = require('async_hooks');
const vm = require('vm');

// This is a regression test for https://github.com/nodejs/node/issues/39019
//
// It should not segfault.

const hook = asyncHooks.createHook({ init() {} }).enable();
vm.createContext();
gc();
hook.disable();

0 comments on commit ba8af23

Please sign in to comment.