From 8a830350b226b4e56cdf3cd519e62ff8a071f9c3 Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Mon, 3 Jul 2017 14:16:12 +0200 Subject: [PATCH] async_hooks: move restoreTmpHooks call to init This fixes an error that could occure by nesting async_hooks calls PR-URL: https://github.com/nodejs/node/pull/14054 Ref: https://github.com/nodejs/node/pull/13755#issuecomment-312616004 Reviewed-By: Refael Ackermann Reviewed-By: Trevor Norris Reviewed-By: James M Snell Reviewed-By: Andreas Madsen --- lib/async_hooks.js | 10 +++++----- .../test-async-hooks-enable-recursive.js | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 test/parallel/test-async-hooks-enable-recursive.js diff --git a/lib/async_hooks.js b/lib/async_hooks.js index a730738c0f9144..42d04f063081c2 100644 --- a/lib/async_hooks.js +++ b/lib/async_hooks.js @@ -335,11 +335,6 @@ function emitInitS(asyncId, type, triggerAsyncId, resource) { throw new RangeError('triggerAsyncId must be an unsigned integer'); init(asyncId, type, triggerAsyncId, resource); - - // Isn't null if hooks were added/removed while the hooks were running. - if (tmp_active_hooks_array !== null) { - restoreTmpHooks(); - } } function emitHookFactory(symbol, name) { @@ -442,6 +437,11 @@ function init(asyncId, type, triggerAsyncId, resource) { fatalError(e); } processing_hook = false; + + // Isn't null if hooks were added/removed while the hooks were running. + if (tmp_active_hooks_array !== null) { + restoreTmpHooks(); + } } diff --git a/test/parallel/test-async-hooks-enable-recursive.js b/test/parallel/test-async-hooks-enable-recursive.js new file mode 100644 index 00000000000000..bcb0dcc0ce0a66 --- /dev/null +++ b/test/parallel/test-async-hooks-enable-recursive.js @@ -0,0 +1,19 @@ +'use strict'; + +const common = require('../common'); +const async_hooks = require('async_hooks'); +const fs = require('fs'); + +const nestedHook = async_hooks.createHook({ + init: common.mustCall() +}); + +async_hooks.createHook({ + init: common.mustCall((id, type) => { + nestedHook.enable(); + }, 2) +}).enable(); + +fs.access(__filename, common.mustCall(() => { + fs.access(__filename, common.mustCall()); +}));