diff --git a/lib/internal/util/inspect.js b/lib/internal/util/inspect.js index d8e68cf806bf64..d16ecf7412f2e7 100644 --- a/lib/internal/util/inspect.js +++ b/lib/internal/util/inspect.js @@ -904,12 +904,12 @@ function getFunctionBase(value, constructor, tag) { } function formatError(err, constructor, tag, ctx) { - let stack = err.stack || ErrorPrototype.toString(err); + const name = err.name != null ? String(err.name) : 'Error'; + let len = name.length; + let stack = err.stack ? String(err.stack) : ErrorPrototype.toString(err); // A stack trace may contain arbitrary data. Only manipulate the output // for "regular errors" (errors that "look normal") for now. - const name = err.name || 'Error'; - let len = name.length; if (constructor === null || (name.endsWith('Error') && stack.startsWith(name) && diff --git a/test/parallel/test-util-inspect.js b/test/parallel/test-util-inspect.js index 81360854b9cb10..fac05f72e2eecc 100644 --- a/test/parallel/test-util-inspect.js +++ b/test/parallel/test-util-inspect.js @@ -690,6 +690,35 @@ assert.strictEqual(util.inspect(-5e-324), '-5e-324'); ); } +// Tampered error stack or name property (different type than string). +// Note: Symbols are not supported by `Error#toString()` which is called by +// accessing the `stack` property. +[ + [404, '404: foo', '[404]'], + [0, '0: foo', '[RangeError: foo]'], + [0n, '0: foo', '[RangeError: foo]'], + [null, 'null: foo', '[RangeError: foo]'], + [undefined, 'RangeError: foo', '[RangeError: foo]'], + [false, 'false: foo', '[RangeError: foo]'], + ['', 'foo', '[RangeError: foo]'], + [[1, 2, 3], '1,2,3: foo', '[1,2,3]'], +].forEach(([value, outputStart, stack]) => { + let err = new RangeError('foo'); + err.name = value; + assert( + util.inspect(err).startsWith(outputStart), + util.format( + 'The name set to %o did not result in the expected output "%s"', + value, + outputStart + ) + ); + + err = new RangeError('foo'); + err.stack = value; + assert.strictEqual(util.inspect(err), stack); +}); + // https://github.com/nodejs/node-v0.x-archive/issues/1941 assert.strictEqual(util.inspect(Object.create(Date.prototype)), 'Date {}');