diff options
Diffstat (limited to 'src/node.cc')
-rw-r--r-- | src/node.cc | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/src/node.cc b/src/node.cc index 0c69ece87a..6c1b11d4ca 100644 --- a/src/node.cc +++ b/src/node.cc @@ -1156,8 +1156,19 @@ bool ShouldAbortOnUncaughtException(Isolate* isolate) { } +Local<Value> GetDomainProperty(Environment* env, Local<Object> object) { + Local<Value> domain_v = + object->GetPrivate(env->context(), env->domain_private_symbol()) + .ToLocalChecked(); + if (domain_v->IsObject()) { + return domain_v; + } + return object->Get(env->context(), env->domain_string()).ToLocalChecked(); +} + + void DomainEnter(Environment* env, Local<Object> object) { - Local<Value> domain_v = object->Get(env->domain_string()); + Local<Value> domain_v = GetDomainProperty(env, object); if (domain_v->IsObject()) { Local<Object> domain = domain_v.As<Object>(); Local<Value> enter_v = domain->Get(env->enter_string()); @@ -1172,7 +1183,7 @@ void DomainEnter(Environment* env, Local<Object> object) { void DomainExit(Environment* env, v8::Local<v8::Object> object) { - Local<Value> domain_v = object->Get(env->domain_string()); + Local<Value> domain_v = GetDomainProperty(env, object); if (domain_v->IsObject()) { Local<Object> domain = domain_v.As<Object>(); Local<Value> exit_v = domain->Get(env->exit_string()); @@ -1194,10 +1205,16 @@ void DomainPromiseHook(PromiseHookType type, Local<Context> context = env->context(); if (type == PromiseHookType::kInit && env->in_domain()) { - promise->Set(context, - env->domain_string(), - env->domain_array()->Get(context, - 0).ToLocalChecked()).FromJust(); + Local<Value> domain_obj = + env->domain_array()->Get(context, 0).ToLocalChecked(); + if (promise->CreationContext() == context) { + promise->Set(context, env->domain_string(), domain_obj).FromJust(); + } else { + // Do not expose object from another context publicly in promises created + // in non-main contexts. + promise->SetPrivate(context, env->domain_private_symbol(), domain_obj) + .FromJust(); + } return; } |