Skip to content

Commit

Permalink
util: escape symbol and non-enumerable keys
Browse files Browse the repository at this point in the history
These keys require escaping as they might also contain line breaks
and other special characters.

PR-URL: #22300
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
  • Loading branch information
BridgeAR authored and targos committed Aug 19, 2018
1 parent 9bfe4c7 commit d2630bd
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 7 deletions.
5 changes: 3 additions & 2 deletions lib/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -1208,9 +1208,10 @@ function formatProperty(ctx, value, recurseTimes, key, array) {
return str;
}
if (typeof key === 'symbol') {
name = `[${ctx.stylize(key.toString(), 'symbol')}]`;
const tmp = key.toString().replace(strEscapeSequencesReplacer, escapeFn);
name = `[${ctx.stylize(tmp, 'symbol')}]`;
} else if (desc.enumerable === false) {
name = `[${key}]`;
name = `[${key.replace(strEscapeSequencesReplacer, escapeFn)}]`;
} else if (keyStrRegExp.test(key)) {
name = ctx.stylize(key, 'name');
} else {
Expand Down
20 changes: 15 additions & 5 deletions test/parallel/test-util-inspect.js
Original file line number Diff line number Diff line change
Expand Up @@ -890,22 +890,22 @@ if (typeof Symbol !== 'undefined') {
const options = { showHidden: true };
let subject = {};

subject[Symbol('symbol')] = 42;
subject[Symbol('sym\nbol')] = 42;

assert.strictEqual(util.inspect(subject), '{ [Symbol(symbol)]: 42 }');
assert.strictEqual(util.inspect(subject), '{ [Symbol(sym\\nbol)]: 42 }');
assert.strictEqual(
util.inspect(subject, options),
'{ [Symbol(symbol)]: 42 }'
'{ [Symbol(sym\\nbol)]: 42 }'
);

Object.defineProperty(
subject,
Symbol(),
{ enumerable: false, value: 'non-enum' });
assert.strictEqual(util.inspect(subject), '{ [Symbol(symbol)]: 42 }');
assert.strictEqual(util.inspect(subject), '{ [Symbol(sym\\nbol)]: 42 }');
assert.strictEqual(
util.inspect(subject, options),
"{ [Symbol(symbol)]: 42, [Symbol()]: 'non-enum' }"
"{ [Symbol(sym\\nbol)]: 42, [Symbol()]: 'non-enum' }"
);

subject = [1, 2, 3];
Expand Down Expand Up @@ -1678,3 +1678,13 @@ util.inspect(process);
assert.strictEqual(inspect(1n), '1n');
assert.strictEqual(inspect(Object(-1n)), '[BigInt: -1n]');
assert.strictEqual(inspect(Object(13n)), '[BigInt: 13n]');

// Verify non-enumerable keys get escaped.
{
const obj = {};
Object.defineProperty(obj, 'Non\nenumerable\tkey', { value: true });
assert.strictEqual(
util.inspect(obj, { showHidden: true }),
'{ [Non\\nenumerable\\tkey]: true }'
);
}

0 comments on commit d2630bd

Please sign in to comment.