diff --git a/src/node.cc b/src/node.cc index bc33847e6d8674..5207da0a1bfdc0 100644 --- a/src/node.cc +++ b/src/node.cc @@ -115,6 +115,7 @@ using v8::Locker; using v8::MaybeLocal; using v8::Message; using v8::Name; +using v8::NamedPropertyHandlerConfiguration; using v8::Null; using v8::Number; using v8::Object; @@ -122,6 +123,7 @@ using v8::ObjectTemplate; using v8::Promise; using v8::PromiseRejectMessage; using v8::PropertyCallbackInfo; +using v8::PropertyHandlerFlags; using v8::ScriptOrigin; using v8::SealHandleScope; using v8::String; @@ -2719,7 +2721,7 @@ static void ProcessTitleSetter(Local property, } -static void EnvGetter(Local property, +static void EnvGetter(Local property, const PropertyCallbackInfo& info) { Isolate* isolate = info.GetIsolate(); #ifdef __POSIX__ @@ -2747,7 +2749,7 @@ static void EnvGetter(Local property, } -static void EnvSetter(Local property, +static void EnvSetter(Local property, Local value, const PropertyCallbackInfo& info) { #ifdef __POSIX__ @@ -2768,7 +2770,7 @@ static void EnvSetter(Local property, } -static void EnvQuery(Local property, +static void EnvQuery(Local property, const PropertyCallbackInfo& info) { int32_t rc = -1; // Not found unless proven otherwise. #ifdef __POSIX__ @@ -2794,7 +2796,7 @@ static void EnvQuery(Local property, } -static void EnvDeleter(Local property, +static void EnvDeleter(Local property, const PropertyCallbackInfo& info) { #ifdef __POSIX__ node::Utf8Value key(info.GetIsolate(), property); @@ -3221,12 +3223,15 @@ void SetupProcessObject(Environment* env, // create process.env Local process_env_template = ObjectTemplate::New(env->isolate()); - process_env_template->SetNamedPropertyHandler(EnvGetter, - EnvSetter, - EnvQuery, - EnvDeleter, - EnvEnumerator, - env->as_external()); + process_env_template->SetHandler(NamedPropertyHandlerConfiguration( + EnvGetter, + EnvSetter, + EnvQuery, + EnvDeleter, + EnvEnumerator, + env->as_external(), + PropertyHandlerFlags::kOnlyInterceptStrings)); + Local process_env = process_env_template->NewInstance(env->context()).ToLocalChecked(); process->Set(env->env_string(), process_env); diff --git a/test/parallel/test-v8-interceptStrings-not-Symbols.js b/test/parallel/test-v8-interceptStrings-not-Symbols.js new file mode 100644 index 00000000000000..e999aae0b7e687 --- /dev/null +++ b/test/parallel/test-v8-interceptStrings-not-Symbols.js @@ -0,0 +1,34 @@ +'use strict'; +require('../common'); + +const assert = require('assert'); + +// Test that the v8 named property handler intercepts callbacks +// when properties are defined as Strings and NOT for Symbols. +// +// With the kOnlyInterceptStrings flag, manipulating properties via +// Strings is intercepted by the callbacks, while Symbols adopt +// the default global behaviour. +// Removing the kOnlyInterceptStrings flag, adds intercepting to Symbols, +// which causes Type Error at process.env[symbol]=42 due to process.env being +// strongly typed for Strings +// (node::Utf8Value key(info.GetIsolate(), property);). + + +const symbol = Symbol('sym'); + +// check if its undefined +assert.strictEqual(process.env[symbol], undefined); + +// set a value using a Symbol +process.env[symbol] = 42; + +// set a value using a String (call to EnvSetter, node.cc) +process.env['s'] = 42; + +//check the values after substitutions +assert.strictEqual(42, process.env[symbol]); +assert.strictEqual('42', process.env['s']); + +delete process.env[symbol]; +assert.strictEqual(undefined, process.env[symbol]);