From 3295a7febad0502dd79ad9fdae4c0975d1fb271c Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Wed, 16 Nov 2016 02:27:14 +0100 Subject: [PATCH] src: allow getting Symbols on process.env MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1aa595e5bd6 introduced a `throw` for accessing `Symbol` properties of `process.env`. However, this breaks `util.inspect(process)` and things like `Object.prototype.toString.call(process.env)`, so this patch changes the behaviour for the getter to just always return `undefined`. Ref: https://github.com/nodejs/node/pull/9446 Fixes: https://github.com/nodejs/node/issues/9641 PR-URL: https://github.com/nodejs/node/pull/9631 Reviewed-By: Ben Noordhuis Reviewed-By: Colin Ihrig Reviewed-By: Michaël Zasso Reviewed-By: Michael Dawson Reviewed-By: James M Snell --- src/node.cc | 3 +++ test/parallel/test-process-env-symbols.js | 9 +++++---- test/parallel/test-util-inspect.js | 2 ++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/node.cc b/src/node.cc index e4c17af3ec23ed..476c147c0bba23 100644 --- a/src/node.cc +++ b/src/node.cc @@ -2681,6 +2681,9 @@ static void ProcessTitleSetter(Local property, static void EnvGetter(Local property, const PropertyCallbackInfo& info) { Isolate* isolate = info.GetIsolate(); + if (property->IsSymbol()) { + return info.GetReturnValue().SetUndefined(); + } #ifdef __POSIX__ node::Utf8Value key(isolate, property); const char* val = getenv(*key); diff --git a/test/parallel/test-process-env-symbols.js b/test/parallel/test-process-env-symbols.js index bb6e1f8778533d..a8798fc457d935 100644 --- a/test/parallel/test-process-env-symbols.js +++ b/test/parallel/test-process-env-symbols.js @@ -5,10 +5,8 @@ const assert = require('assert'); const symbol = Symbol('sym'); const errRegExp = /^TypeError: Cannot convert a Symbol value to a string$/; -// Verify that getting via a symbol key throws. -assert.throws(() => { - process.env[symbol]; -}, errRegExp); +// Verify that getting via a symbol key returns undefined. +assert.strictEqual(process.env[symbol], undefined); // Verify that assigning via a symbol key throws. assert.throws(() => { @@ -24,3 +22,6 @@ assert.throws(() => { assert.throws(() => { symbol in process.env; }, errRegExp); + +// Checks that well-known symbols like `Symbol.toStringTag` won’t throw. +assert.doesNotThrow(() => Object.prototype.toString.call(process.env)); diff --git a/test/parallel/test-util-inspect.js b/test/parallel/test-util-inspect.js index f730ec1c98303e..7fd682954207d3 100644 --- a/test/parallel/test-util-inspect.js +++ b/test/parallel/test-util-inspect.js @@ -925,3 +925,5 @@ checkAlignment(new Map(big_array.map(function(y) { return [y, null]; }))); util.inspect.defaultOptions = 'bad'; }, /"options" must be an object/); } + +assert.doesNotThrow(() => util.inspect(process));