worker: serialize errors if stack getter throws
Current code that is intended to handle the stack getter throwing is untested. Add a test and adjust code to function as expected. Co-authored-by: Anna Henningsen <anna@addaleax.net> PR-URL: https://github.com/nodejs/node/pull/26145 Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
This commit is contained in:
parent
47c784203c
commit
79a3348d14
@ -36,7 +36,10 @@ function TryGetAllProperties(object, target = object) {
|
|||||||
Assign(all, TryGetAllProperties(GetPrototypeOf(object), target));
|
Assign(all, TryGetAllProperties(GetPrototypeOf(object), target));
|
||||||
const keys = GetOwnPropertyNames(object);
|
const keys = GetOwnPropertyNames(object);
|
||||||
ForEach(keys, (key) => {
|
ForEach(keys, (key) => {
|
||||||
const descriptor = GetOwnPropertyDescriptor(object, key);
|
let descriptor;
|
||||||
|
try {
|
||||||
|
descriptor = GetOwnPropertyDescriptor(object, key);
|
||||||
|
} catch { return; }
|
||||||
const getter = descriptor.get;
|
const getter = descriptor.get;
|
||||||
if (getter && key !== '__proto__') {
|
if (getter && key !== '__proto__') {
|
||||||
try {
|
try {
|
||||||
@ -89,7 +92,6 @@ function serializeError(error) {
|
|||||||
for (var i = 0; i < constructors.length; i++) {
|
for (var i = 0; i < constructors.length; i++) {
|
||||||
const name = GetName(constructors[i]);
|
const name = GetName(constructors[i]);
|
||||||
if (errorConstructorNames.has(name)) {
|
if (errorConstructorNames.has(name)) {
|
||||||
try { error.stack; } catch {}
|
|
||||||
const serialized = serialize({
|
const serialized = serialize({
|
||||||
constructor: name,
|
constructor: name,
|
||||||
properties: TryGetAllProperties(error)
|
properties: TryGetAllProperties(error)
|
||||||
|
22
test/parallel/test-worker-error-stack-getter-throws.js
Normal file
22
test/parallel/test-worker-error-stack-getter-throws.js
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
'use strict';
|
||||||
|
const common = require('../common');
|
||||||
|
const assert = require('assert');
|
||||||
|
const { Worker } = require('worker_threads');
|
||||||
|
|
||||||
|
const w = new Worker(
|
||||||
|
`const fn = (err) => {
|
||||||
|
if (err.message === 'fhqwhgads')
|
||||||
|
throw new Error('come on');
|
||||||
|
return 'This is my custom stack trace!';
|
||||||
|
};
|
||||||
|
Error.prepareStackTrace = fn;
|
||||||
|
throw new Error('fhqwhgads');
|
||||||
|
`,
|
||||||
|
{ eval: true }
|
||||||
|
);
|
||||||
|
w.on('message', common.mustNotCall());
|
||||||
|
w.on('error', common.mustCall((err) => {
|
||||||
|
assert.strictEqual(err.stack, undefined);
|
||||||
|
assert.strictEqual(err.message, 'fhqwhgads');
|
||||||
|
assert.strictEqual(err.name, 'Error');
|
||||||
|
}));
|
Loading…
x
Reference in New Issue
Block a user