diff --git a/index.js b/index.js index f33f482..6574753 100644 --- a/index.js +++ b/index.js @@ -257,7 +257,7 @@ function makeSafe (method, name) { if (name !== undefined) { return getErrorMessage(error, name) } - return `"${getErrorMessage(error, name)}"` + return strEscape(getErrorMessage(error, name)) } } Object.defineProperty(safeMethod, 'name', { value: `safe_${method.name}` }) diff --git a/test.js b/test.js index 8242f5e..c7e88c1 100644 --- a/test.js +++ b/test.js @@ -1972,3 +1972,23 @@ test('safe mode safeguards against failing toJSON and a difficult to stringify e assert.end() }) + +test('safe mode escapes error messages from throwing getters', (assert) => { + const serializer = stringify.configure({ safe: true }) + for (const message of ['Missing "token"', 'line\nbreak', 'path\\file', '\u0000', '\ud800']) { + const input = { get token () { throw new Error(message) } } + const expected = `Error: Stringification failed (${message})` + const results = [ + serializer(input), + serializer(input, null, 2), + serializer(input, ['token']) + ] + for (const result of results) { + assert.equal(result, JSON.stringify(expected)) + assert.equal(JSON.parse(/** @type {string} */ (result)), expected) + } + const replaced = serializer(input, (key, value) => value) + assert.same(JSON.parse(/** @type {string} */ (replaced)), { token: expected }) + } + assert.end() +})