From 01b9afbc41e76969fd2e9f0560cfedbcbc96a207 Mon Sep 17 00:00:00 2001 From: Mike Kaufman Date: Fri, 30 Mar 2018 10:07:49 -0700 Subject: [PATCH 1/3] lib: fixing isStackOverflowError to account for different JS engines Assumption that stack overflow exception has name == "RangeError" is v8-specific. Updated logic to dynamically capture error name when capturing error message. --- lib/internal/errors.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/internal/errors.js b/lib/internal/errors.js index e79041d91d5d8d..f2e7e622c92d97 100644 --- a/lib/internal/errors.js +++ b/lib/internal/errors.js @@ -572,7 +572,8 @@ function dnsException(err, syscall, hostname) { return ex; } -let MAX_STACK_MESSAGE; +let MAX_STACK_ERROR_NAME; +let MAX_STACK_ERROR_MESSAGE; /** * Returns true if `err` is a `RangeError` with an engine-specific message. * "Maximum call stack size exceeded" in V8. @@ -581,16 +582,18 @@ let MAX_STACK_MESSAGE; * @returns {boolean} */ function isStackOverflowError(err) { - if (MAX_STACK_MESSAGE === undefined) { + if (MAX_STACK_ERROR_MESSAGE === undefined) { try { function overflowStack() { overflowStack(); } overflowStack(); } catch (err) { - MAX_STACK_MESSAGE = err.message; + MAX_STACK_ERROR_MESSAGE = err.message; + MAX_STACK_ERROR_NAME = err.name; } } - return err.name === 'RangeError' && err.message === MAX_STACK_MESSAGE; + return err.name === MAX_STACK_ERROR_NAME && + err.message === MAX_STACK_ERROR_MESSAGE; } module.exports = exports = { From 2b4118c6bf4e755bc7804d112373f9959e4ebc41 Mon Sep 17 00:00:00 2001 From: Timothy Gu Date: Fri, 30 Mar 2018 12:59:20 -0700 Subject: [PATCH 2/3] fixup! lib: fixing isStackOverflowError to account for different JS engines Remove extraneous space. --- lib/internal/errors.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/internal/errors.js b/lib/internal/errors.js index f2e7e622c92d97..dbc9380bdd55f8 100644 --- a/lib/internal/errors.js +++ b/lib/internal/errors.js @@ -593,7 +593,7 @@ function isStackOverflowError(err) { } return err.name === MAX_STACK_ERROR_NAME && - err.message === MAX_STACK_ERROR_MESSAGE; + err.message === MAX_STACK_ERROR_MESSAGE; } module.exports = exports = { From d6267a811026de4fd4f639624250996bca2534aa Mon Sep 17 00:00:00 2001 From: Mike Kaufman Date: Fri, 30 Mar 2018 13:09:51 -0700 Subject: [PATCH 3/3] responding to PR feedback --- lib/internal/errors.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/internal/errors.js b/lib/internal/errors.js index dbc9380bdd55f8..f8073d15fe8d49 100644 --- a/lib/internal/errors.js +++ b/lib/internal/errors.js @@ -572,28 +572,29 @@ function dnsException(err, syscall, hostname) { return ex; } -let MAX_STACK_ERROR_NAME; -let MAX_STACK_ERROR_MESSAGE; +let maxStack_ErrorName; +let maxStack_ErrorMessage; /** - * Returns true if `err` is a `RangeError` with an engine-specific message. + * Returns true if `err.name` and `err.message` are equal to engine-specific + * values indicating max call stack size has been exceeded. * "Maximum call stack size exceeded" in V8. * * @param {Error} err * @returns {boolean} */ function isStackOverflowError(err) { - if (MAX_STACK_ERROR_MESSAGE === undefined) { + if (maxStack_ErrorMessage === undefined) { try { function overflowStack() { overflowStack(); } overflowStack(); } catch (err) { - MAX_STACK_ERROR_MESSAGE = err.message; - MAX_STACK_ERROR_NAME = err.name; + maxStack_ErrorMessage = err.message; + maxStack_ErrorName = err.name; } } - return err.name === MAX_STACK_ERROR_NAME && - err.message === MAX_STACK_ERROR_MESSAGE; + return err.name === maxStack_ErrorName && + err.message === maxStack_ErrorMessage; } module.exports = exports = {