From 6b76017b1e84b94dd4b912cc62ea4f76597e94a0 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Sun, 4 Mar 2018 19:28:38 +0100 Subject: [PATCH 01/36] src: fix async hooks crashing when there is no node context Fixes: https://github.com/nodejs/node/issues/19104 --- src/env.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/env.cc b/src/env.cc index f02cb36fe53f1e..2f4fa81279228c 100644 --- a/src/env.cc +++ b/src/env.cc @@ -298,7 +298,12 @@ bool Environment::EmitNapiWarning() { void Environment::EnvPromiseHook(v8::PromiseHookType type, v8::Local promise, v8::Local parent) { - Environment* env = Environment::GetCurrent(promise->CreationContext()); + auto context = promise->CreationContext(); + // if the context is undefined (not a node context) then skip + if (context->GetEmbedderData(node::Environment::kContextEmbedderDataIndex)->IsNullOrUndefined()) { + return; + } + Environment* env = Environment::GetCurrent(context); for (const PromiseHookCallback& hook : env->promise_hooks_) { hook.cb_(type, promise, parent, hook.arg_); } From 84a1822dfc7a56ce3110919660185dd181c828d3 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Sun, 4 Mar 2018 19:35:36 +0100 Subject: [PATCH 02/36] src: optimization for check for env promise hook --- src/env.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/env.cc b/src/env.cc index 2f4fa81279228c..cc038e99a7b7e8 100644 --- a/src/env.cc +++ b/src/env.cc @@ -300,7 +300,7 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, v8::Local parent) { auto context = promise->CreationContext(); // if the context is undefined (not a node context) then skip - if (context->GetEmbedderData(node::Environment::kContextEmbedderDataIndex)->IsNullOrUndefined()) { + if (context->GetEmbedderData(node::Environment::kContextEmbedderDataIndex)->IsUndefined()) { return; } Environment* env = Environment::GetCurrent(context); From 5e9128f098818ce0201cd9226f882b13b7991c13 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Sun, 4 Mar 2018 19:43:52 +0100 Subject: [PATCH 03/36] src: fixed linting errors for env.cc --- src/env.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/env.cc b/src/env.cc index cc038e99a7b7e8..6f4540011703ad 100644 --- a/src/env.cc +++ b/src/env.cc @@ -299,8 +299,9 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, v8::Local promise, v8::Local parent) { auto context = promise->CreationContext(); - // if the context is undefined (not a node context) then skip - if (context->GetEmbedderData(node::Environment::kContextEmbedderDataIndex)->IsUndefined()) { + auto dataIndex = node::Environment::kContextEmbedderDataIndex; + // If the context is undefined (not a node context) then skip. + if (context->GetEmbedderData(dataIndex)->IsUndefined()) { return; } Environment* env = Environment::GetCurrent(context); From 9690b862cb7e5888c25562a8bda65ce052934db6 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Tue, 6 Mar 2018 21:31:57 +0100 Subject: [PATCH 04/36] fix: updated with the latest code review --- src/env.cc | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/env.cc b/src/env.cc index 6f4540011703ad..2122c0cbdc5701 100644 --- a/src/env.cc +++ b/src/env.cc @@ -145,12 +145,17 @@ void Environment::Start(int argc, auto process_template = FunctionTemplate::New(isolate()); process_template->SetClassName(FIXED_ONE_BYTE_STRING(isolate(), "process")); + process_template->InstanceTemplate()->SetInternalFieldCount(1); auto process_object = process_template->GetFunction()->NewInstance(context()).ToLocalChecked(); set_process_object(process_object); SetupProcessObject(this, argc, argv, exec_argc, exec_argv); + + // Used by EnvPromiseHook to know that we are on a node context. + process_object->SetInternalField(0, v8::Int32::New(isolate(), 0x6e6f6465)); + LoadAsyncWrapperInfo(this); static uv_once_t init_once = UV_ONCE_INIT; @@ -298,12 +303,24 @@ bool Environment::EmitNapiWarning() { void Environment::EnvPromiseHook(v8::PromiseHookType type, v8::Local promise, v8::Local parent) { - auto context = promise->CreationContext(); - auto dataIndex = node::Environment::kContextEmbedderDataIndex; - // If the context is undefined (not a node context) then skip. - if (context->GetEmbedderData(dataIndex)->IsUndefined()) { + v8::Isolate *isolate = Isolate::GetCurrent(); + Local context = isolate->GetCurrentContext(); + Local global = context->Global(); + + // Make sure process is there and its first internal field is the magic value. + Local process = global->Get(OneByteString(isolate, "process")); + if (!process->IsObject()) { + return; + } + Local process_object = process.As(); + if (process_object->InternalFieldCount() < 1) { + return; + } + Local internal_field = process_object->GetInternalField(0); + if (!internal_field->IsInt32() || internal_field.As()->Value() != 0x6e6f6465) { return; } + Environment* env = Environment::GetCurrent(context); for (const PromiseHookCallback& hook : env->promise_hooks_) { hook.cb_(type, promise, parent, hook.arg_); From 0e4fda8a9bbaaa9bc1009ffe4173b6ee3a21e57d Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Tue, 6 Mar 2018 22:54:07 +0100 Subject: [PATCH 05/36] fix: made the magic number smaller and a constant --- src/env.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/env.cc b/src/env.cc index 2122c0cbdc5701..502da0ba882af0 100644 --- a/src/env.cc +++ b/src/env.cc @@ -22,6 +22,8 @@ using v8::StackTrace; using v8::String; using v8::Value; +const int kNodeContextTag = 0x6e6f64; + IsolateData::IsolateData(Isolate* isolate, uv_loop_t* event_loop, MultiIsolatePlatform* platform, @@ -154,7 +156,7 @@ void Environment::Start(int argc, SetupProcessObject(this, argc, argv, exec_argc, exec_argv); // Used by EnvPromiseHook to know that we are on a node context. - process_object->SetInternalField(0, v8::Int32::New(isolate(), 0x6e6f6465)); + process_object->SetInternalField(0, v8::Int32::New(isolate(), kNodeContextTag)); LoadAsyncWrapperInfo(this); @@ -317,7 +319,7 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, return; } Local internal_field = process_object->GetInternalField(0); - if (!internal_field->IsInt32() || internal_field.As()->Value() != 0x6e6f6465) { + if (!internal_field->IsInt32() || internal_field.As()->Value() != kNodeContextTag) { return; } From c938269fd7df28a2bcd5157086e582844af031c4 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Thu, 8 Mar 2018 17:41:36 +0100 Subject: [PATCH 06/36] fix: switched back to promise creation context --- src/env.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/env.cc b/src/env.cc index 502da0ba882af0..52f0a22792f874 100644 --- a/src/env.cc +++ b/src/env.cc @@ -305,8 +305,8 @@ bool Environment::EmitNapiWarning() { void Environment::EnvPromiseHook(v8::PromiseHookType type, v8::Local promise, v8::Local parent) { - v8::Isolate *isolate = Isolate::GetCurrent(); - Local context = isolate->GetCurrentContext(); + Local context = promise->CreationContext(); + v8::Isolate *isolate = context->GetIsolate(); Local global = context->Global(); // Make sure process is there and its first internal field is the magic value. From 70169d3b30b4764a51532b46c9d64a0f83da22f6 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Thu, 8 Mar 2018 19:03:48 +0100 Subject: [PATCH 07/36] fix: using a faster way to know if we are in a node context --- src/env.cc | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/src/env.cc b/src/env.cc index 52f0a22792f874..4c2f0a2a00b41f 100644 --- a/src/env.cc +++ b/src/env.cc @@ -147,7 +147,6 @@ void Environment::Start(int argc, auto process_template = FunctionTemplate::New(isolate()); process_template->SetClassName(FIXED_ONE_BYTE_STRING(isolate(), "process")); - process_template->InstanceTemplate()->SetInternalFieldCount(1); auto process_object = process_template->GetFunction()->NewInstance(context()).ToLocalChecked(); @@ -156,7 +155,7 @@ void Environment::Start(int argc, SetupProcessObject(this, argc, argv, exec_argc, exec_argv); // Used by EnvPromiseHook to know that we are on a node context. - process_object->SetInternalField(0, v8::Int32::New(isolate(), kNodeContextTag)); + context()->SetAlignedPointerInEmbedderData(kContextEmbedderDataIndex + 1, (void *)kNodeContextTag); LoadAsyncWrapperInfo(this); @@ -306,20 +305,12 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, v8::Local promise, v8::Local parent) { Local context = promise->CreationContext(); - v8::Isolate *isolate = context->GetIsolate(); - Local global = context->Global(); - // Make sure process is there and its first internal field is the magic value. - Local process = global->Get(OneByteString(isolate, "process")); - if (!process->IsObject()) { - return; - } - Local process_object = process.As(); - if (process_object->InternalFieldCount() < 1) { - return; - } - Local internal_field = process_object->GetInternalField(0); - if (!internal_field->IsInt32() || internal_field.As()->Value() != kNodeContextTag) { + // Grow the embedder data if necessary to make sure we are not out of bounds + // when reading the magic number. + context->SetAlignedPointerInEmbedderData(kContextEmbedderDataIndex + 2, nullptr); + int magicNumber = (int)context->GetAlignedPointerFromEmbedderData(kContextEmbedderDataIndex + 1); + if (magicNumber != kNodeContextTag) { return; } From cb3bba11fe4a5a09e50e0e916e56f2139770b304 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Wed, 11 Apr 2018 19:07:01 +0200 Subject: [PATCH 08/36] fix: rebase to latest master and use node_context_data constants --- src/env.cc | 18 +++++++++++++++++- src/node_context_data.h | 10 ++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/env.cc b/src/env.cc index b62594699ee7a4..a8d3f16af0fb26 100644 --- a/src/env.cc +++ b/src/env.cc @@ -3,6 +3,7 @@ #include "node_buffer.h" #include "node_platform.h" #include "node_file.h" +#include "node_context_data.h" #include #include @@ -194,6 +195,10 @@ void Environment::Start(int argc, set_process_object(process_object); SetupProcessObject(this, argc, argv, exec_argc, exec_argv); + + // Used by EnvPromiseHook to know that we are on a node context. + context()->SetAlignedPointerInEmbedderData(kContextTag, (void *)kNodeContextTag); + LoadAsyncWrapperInfo(this); static uv_once_t init_once = UV_ONCE_INIT; @@ -363,7 +368,18 @@ bool Environment::RemovePromiseHook(promise_hook_func fn, void* arg) { void Environment::EnvPromiseHook(v8::PromiseHookType type, v8::Local promise, v8::Local parent) { - Environment* env = Environment::GetCurrent(promise->CreationContext()); + Local context = promise->CreationContext(); + + // Grow the embedder data if necessary to make sure we are not out of bounds + // when reading the magic number. + context->SetAlignedPointerInEmbedderData(kContextTagBoundary, nullptr); + int magicNumber = (int)context->GetAlignedPointerFromEmbedderData(kContextTag); + if (magicNumber != kNodeContextTag) { + return; + } + + Environment* env = Environment::GetCurrent(context); + for (const PromiseHookCallback& hook : env->promise_hooks_) { hook.cb_(type, promise, parent, hook.arg_); } diff --git a/src/node_context_data.h b/src/node_context_data.h index 522ce292d21684..3892b31354027d 100644 --- a/src/node_context_data.h +++ b/src/node_context_data.h @@ -19,10 +19,20 @@ namespace node { #define NODE_CONTEXT_ALLOW_WASM_CODE_GENERATION_INDEX 34 #endif +#ifndef NODE_CONTEXT_TAG +#define NODE_CONTEXT_TAG 35 +#endif + +#ifndef NODE_CONTEXT_TAG_BOUNDARY +#define NODE_CONTEXT_TAG_BOUNDARY 36 +#endif + enum ContextEmbedderIndex { kEnvironment = NODE_CONTEXT_EMBEDDER_DATA_INDEX, kSandboxObject = NODE_CONTEXT_SANDBOX_OBJECT_INDEX, kAllowWasmCodeGeneration = NODE_CONTEXT_ALLOW_WASM_CODE_GENERATION_INDEX, + kContextTag = NODE_CONTEXT_TAG, + kContextTagBoundary = NODE_CONTEXT_TAG_BOUNDARY, }; } // namespace node From 51257ed5b7c32f0e0acbfd19c747e99113cd80bc Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Wed, 11 Apr 2018 19:20:57 +0200 Subject: [PATCH 09/36] fix: added namespace for enum --- src/env.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/env.cc b/src/env.cc index a8d3f16af0fb26..5d034b6786d457 100644 --- a/src/env.cc +++ b/src/env.cc @@ -197,7 +197,7 @@ void Environment::Start(int argc, SetupProcessObject(this, argc, argv, exec_argc, exec_argv); // Used by EnvPromiseHook to know that we are on a node context. - context()->SetAlignedPointerInEmbedderData(kContextTag, (void *)kNodeContextTag); + context()->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kContextTag, (void *)kNodeContextTag); LoadAsyncWrapperInfo(this); @@ -372,8 +372,8 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, // Grow the embedder data if necessary to make sure we are not out of bounds // when reading the magic number. - context->SetAlignedPointerInEmbedderData(kContextTagBoundary, nullptr); - int magicNumber = (int)context->GetAlignedPointerFromEmbedderData(kContextTag); + context->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kContextTagBoundary, nullptr); + int magicNumber = (int)context->GetAlignedPointerFromEmbedderData(ContextEmbedderIndex::kContextTag); if (magicNumber != kNodeContextTag) { return; } From 361d42501036920ce37809fce0fd52ad623188ea Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Thu, 19 Apr 2018 21:18:29 +0200 Subject: [PATCH 10/36] fix: storing actual pointers on the context --- src/env.cc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/env.cc b/src/env.cc index 5d034b6786d457..fa33fbcb1725b8 100644 --- a/src/env.cc +++ b/src/env.cc @@ -25,6 +25,9 @@ using v8::String; using v8::Value; const int kNodeContextTag = 0x6e6f64; +void *kNodeContextTagPtr = const_cast( + reinterpret_cast(&kNodeContextTag) +); IsolateData::IsolateData(Isolate* isolate, uv_loop_t* event_loop, @@ -197,7 +200,7 @@ void Environment::Start(int argc, SetupProcessObject(this, argc, argv, exec_argc, exec_argv); // Used by EnvPromiseHook to know that we are on a node context. - context()->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kContextTag, (void *)kNodeContextTag); + context()->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kContextTag, kNodeContextTagPtr); LoadAsyncWrapperInfo(this); @@ -373,8 +376,10 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, // Grow the embedder data if necessary to make sure we are not out of bounds // when reading the magic number. context->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kContextTagBoundary, nullptr); - int magicNumber = (int)context->GetAlignedPointerFromEmbedderData(ContextEmbedderIndex::kContextTag); - if (magicNumber != kNodeContextTag) { + int *magicNumberPtr = reinterpret_cast( + context->GetAlignedPointerFromEmbedderData(ContextEmbedderIndex::kContextTag) + ); + if (magicNumberPtr != kNodeContextTagPtr || *magicNumberPtr != kNodeContextTag) { return; } From bca7fd17eeda417d1431da14174fbc684b98e28f Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Mon, 14 May 2018 20:19:17 +0200 Subject: [PATCH 11/36] src: code review --- src/env.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/env.cc b/src/env.cc index 732b93b83db438..f5b69b54464b88 100644 --- a/src/env.cc +++ b/src/env.cc @@ -27,7 +27,7 @@ using v8::Value; const int kNodeContextTag = 0x6e6f64; void *kNodeContextTagPtr = const_cast( - reinterpret_cast(&kNodeContextTag) + static_cast(&kNodeContextTag) ); IsolateData::IsolateData(Isolate* isolate, @@ -379,7 +379,7 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, // Grow the embedder data if necessary to make sure we are not out of bounds // when reading the magic number. context->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kContextTagBoundary, nullptr); - int *magicNumberPtr = reinterpret_cast( + int* magicNumberPtr = reinterpret_cast( context->GetAlignedPointerFromEmbedderData(ContextEmbedderIndex::kContextTag) ); if (magicNumberPtr != kNodeContextTagPtr || *magicNumberPtr != kNodeContextTag) { From 0577c2900898818dcd2264179c731d2888dd410f Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Mon, 14 May 2018 20:20:09 +0200 Subject: [PATCH 12/36] fix: code review changes --- src/env.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/env.cc b/src/env.cc index f5b69b54464b88..4750d5de945500 100644 --- a/src/env.cc +++ b/src/env.cc @@ -26,7 +26,7 @@ using v8::String; using v8::Value; const int kNodeContextTag = 0x6e6f64; -void *kNodeContextTagPtr = const_cast( +void* kNodeContextTagPtr = const_cast( static_cast(&kNodeContextTag) ); From 54bf6dc2a030fde04d94731f14c43faa02b93395 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Mon, 14 May 2018 20:34:13 +0200 Subject: [PATCH 13/36] fix: code review --- src/env.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/env.cc b/src/env.cc index 4750d5de945500..34659597961364 100644 --- a/src/env.cc +++ b/src/env.cc @@ -382,7 +382,7 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, int* magicNumberPtr = reinterpret_cast( context->GetAlignedPointerFromEmbedderData(ContextEmbedderIndex::kContextTag) ); - if (magicNumberPtr != kNodeContextTagPtr || *magicNumberPtr != kNodeContextTag) { + if (magicNumberPtr != kNodeContextTagPtr) { return; } From 3c4d991641e75b574f1e9aa4e395debc1175531d Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Mon, 14 May 2018 20:37:17 +0200 Subject: [PATCH 14/36] fix: code review changes --- src/env.cc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/env.cc b/src/env.cc index 34659597961364..faa12934eba339 100644 --- a/src/env.cc +++ b/src/env.cc @@ -27,8 +27,7 @@ using v8::Value; const int kNodeContextTag = 0x6e6f64; void* kNodeContextTagPtr = const_cast( - static_cast(&kNodeContextTag) -); + static_cast(&kNodeContextTag)); IsolateData::IsolateData(Isolate* isolate, uv_loop_t* event_loop, @@ -380,8 +379,7 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, // when reading the magic number. context->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kContextTagBoundary, nullptr); int* magicNumberPtr = reinterpret_cast( - context->GetAlignedPointerFromEmbedderData(ContextEmbedderIndex::kContextTag) - ); + context->GetAlignedPointerFromEmbedderData(ContextEmbedderIndex::kContextTag)); if (magicNumberPtr != kNodeContextTagPtr) { return; } From 4d20b729fd4bc0612c2a04bf27b70ce9a5d2d4b7 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Mon, 14 May 2018 20:43:53 +0200 Subject: [PATCH 15/36] fix: code review --- src/env.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/env.cc b/src/env.cc index faa12934eba339..d17df329b182b4 100644 --- a/src/env.cc +++ b/src/env.cc @@ -27,7 +27,7 @@ using v8::Value; const int kNodeContextTag = 0x6e6f64; void* kNodeContextTagPtr = const_cast( - static_cast(&kNodeContextTag)); + static_cast(&kNodeContextTag)); IsolateData::IsolateData(Isolate* isolate, uv_loop_t* event_loop, @@ -379,7 +379,7 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, // when reading the magic number. context->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kContextTagBoundary, nullptr); int* magicNumberPtr = reinterpret_cast( - context->GetAlignedPointerFromEmbedderData(ContextEmbedderIndex::kContextTag)); + context->GetAlignedPointerFromEmbedderData(ContextEmbedderIndex::kContextTag)); if (magicNumberPtr != kNodeContextTagPtr) { return; } From 23fa418032a28fb95c93fe444fdef25c53aab5da Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Sun, 4 Mar 2018 19:28:38 +0100 Subject: [PATCH 16/36] src: fix async hooks crashing when there is no node context Fixes: https://github.com/nodejs/node/issues/19104 --- src/env.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/env.cc b/src/env.cc index f940c18d16eceb..a95bd3b031c3f1 100644 --- a/src/env.cc +++ b/src/env.cc @@ -434,7 +434,12 @@ bool Environment::RemovePromiseHook(promise_hook_func fn, void* arg) { void Environment::EnvPromiseHook(v8::PromiseHookType type, v8::Local promise, v8::Local parent) { - Environment* env = Environment::GetCurrent(promise->CreationContext()); + auto context = promise->CreationContext(); + // if the context is undefined (not a node context) then skip + if (context->GetEmbedderData(node::Environment::kContextEmbedderDataIndex)->IsNullOrUndefined()) { + return; + } + Environment* env = Environment::GetCurrent(context); for (const PromiseHookCallback& hook : env->promise_hooks_) { hook.cb_(type, promise, parent, hook.arg_); } From c2b9b3268143b77e601ab56ed810dc2697e0c6fd Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Sun, 4 Mar 2018 19:35:36 +0100 Subject: [PATCH 17/36] src: optimization for check for env promise hook --- src/env.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/env.cc b/src/env.cc index a95bd3b031c3f1..fd89b259243212 100644 --- a/src/env.cc +++ b/src/env.cc @@ -436,7 +436,7 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, v8::Local parent) { auto context = promise->CreationContext(); // if the context is undefined (not a node context) then skip - if (context->GetEmbedderData(node::Environment::kContextEmbedderDataIndex)->IsNullOrUndefined()) { + if (context->GetEmbedderData(node::Environment::kContextEmbedderDataIndex)->IsUndefined()) { return; } Environment* env = Environment::GetCurrent(context); From 4437f90281b952f7322d9a713cd5f613e9c86b5b Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Sun, 4 Mar 2018 19:43:52 +0100 Subject: [PATCH 18/36] src: fixed linting errors for env.cc --- src/env.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/env.cc b/src/env.cc index fd89b259243212..9eb07411141a1b 100644 --- a/src/env.cc +++ b/src/env.cc @@ -435,8 +435,9 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, v8::Local promise, v8::Local parent) { auto context = promise->CreationContext(); - // if the context is undefined (not a node context) then skip - if (context->GetEmbedderData(node::Environment::kContextEmbedderDataIndex)->IsUndefined()) { + auto dataIndex = node::Environment::kContextEmbedderDataIndex; + // If the context is undefined (not a node context) then skip. + if (context->GetEmbedderData(dataIndex)->IsUndefined()) { return; } Environment* env = Environment::GetCurrent(context); From 436919efcf7ffc586eeb87b604ffb8851fd8ea9a Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Tue, 6 Mar 2018 21:31:57 +0100 Subject: [PATCH 19/36] fix: updated with the latest code review --- src/env.cc | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/env.cc b/src/env.cc index 9eb07411141a1b..84a7d3e868a806 100644 --- a/src/env.cc +++ b/src/env.cc @@ -211,12 +211,17 @@ void Environment::Start(int argc, auto process_template = FunctionTemplate::New(isolate()); process_template->SetClassName(FIXED_ONE_BYTE_STRING(isolate(), "process")); + process_template->InstanceTemplate()->SetInternalFieldCount(1); auto process_object = process_template->GetFunction()->NewInstance(context()).ToLocalChecked(); set_process_object(process_object); SetupProcessObject(this, argc, argv, exec_argc, exec_argv); + + // Used by EnvPromiseHook to know that we are on a node context. + process_object->SetInternalField(0, v8::Int32::New(isolate(), 0x6e6f6465)); + LoadAsyncWrapperInfo(this); static uv_once_t init_once = UV_ONCE_INIT; @@ -434,12 +439,24 @@ bool Environment::RemovePromiseHook(promise_hook_func fn, void* arg) { void Environment::EnvPromiseHook(v8::PromiseHookType type, v8::Local promise, v8::Local parent) { - auto context = promise->CreationContext(); - auto dataIndex = node::Environment::kContextEmbedderDataIndex; - // If the context is undefined (not a node context) then skip. - if (context->GetEmbedderData(dataIndex)->IsUndefined()) { + v8::Isolate *isolate = Isolate::GetCurrent(); + Local context = isolate->GetCurrentContext(); + Local global = context->Global(); + + // Make sure process is there and its first internal field is the magic value. + Local process = global->Get(OneByteString(isolate, "process")); + if (!process->IsObject()) { + return; + } + Local process_object = process.As(); + if (process_object->InternalFieldCount() < 1) { + return; + } + Local internal_field = process_object->GetInternalField(0); + if (!internal_field->IsInt32() || internal_field.As()->Value() != 0x6e6f6465) { return; } + Environment* env = Environment::GetCurrent(context); for (const PromiseHookCallback& hook : env->promise_hooks_) { hook.cb_(type, promise, parent, hook.arg_); From 6b095d74a11214f005d50fc994e1174024f9397d Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Tue, 6 Mar 2018 22:54:07 +0100 Subject: [PATCH 20/36] fix: made the magic number smaller and a constant --- src/env.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/env.cc b/src/env.cc index 84a7d3e868a806..db8444e7913cc5 100644 --- a/src/env.cc +++ b/src/env.cc @@ -30,6 +30,8 @@ using v8::TryCatch; using v8::Value; using worker::Worker; +const int kNodeContextTag = 0x6e6f64; + IsolateData::IsolateData(Isolate* isolate, uv_loop_t* event_loop, MultiIsolatePlatform* platform, @@ -220,7 +222,7 @@ void Environment::Start(int argc, SetupProcessObject(this, argc, argv, exec_argc, exec_argv); // Used by EnvPromiseHook to know that we are on a node context. - process_object->SetInternalField(0, v8::Int32::New(isolate(), 0x6e6f6465)); + process_object->SetInternalField(0, v8::Int32::New(isolate(), kNodeContextTag)); LoadAsyncWrapperInfo(this); @@ -453,7 +455,7 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, return; } Local internal_field = process_object->GetInternalField(0); - if (!internal_field->IsInt32() || internal_field.As()->Value() != 0x6e6f6465) { + if (!internal_field->IsInt32() || internal_field.As()->Value() != kNodeContextTag) { return; } From 85cf945183bf0779f673947f22614b7eed27efa9 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Thu, 8 Mar 2018 17:41:36 +0100 Subject: [PATCH 21/36] fix: switched back to promise creation context --- src/env.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/env.cc b/src/env.cc index db8444e7913cc5..e82e746351862d 100644 --- a/src/env.cc +++ b/src/env.cc @@ -441,8 +441,8 @@ bool Environment::RemovePromiseHook(promise_hook_func fn, void* arg) { void Environment::EnvPromiseHook(v8::PromiseHookType type, v8::Local promise, v8::Local parent) { - v8::Isolate *isolate = Isolate::GetCurrent(); - Local context = isolate->GetCurrentContext(); + Local context = promise->CreationContext(); + v8::Isolate *isolate = context->GetIsolate(); Local global = context->Global(); // Make sure process is there and its first internal field is the magic value. From 76df61388f5bbf3f2c6f28784a259d9d234da41e Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Thu, 8 Mar 2018 19:03:48 +0100 Subject: [PATCH 22/36] fix: using a faster way to know if we are in a node context --- src/env.cc | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/src/env.cc b/src/env.cc index e82e746351862d..eca9da476b8714 100644 --- a/src/env.cc +++ b/src/env.cc @@ -213,7 +213,6 @@ void Environment::Start(int argc, auto process_template = FunctionTemplate::New(isolate()); process_template->SetClassName(FIXED_ONE_BYTE_STRING(isolate(), "process")); - process_template->InstanceTemplate()->SetInternalFieldCount(1); auto process_object = process_template->GetFunction()->NewInstance(context()).ToLocalChecked(); @@ -222,7 +221,7 @@ void Environment::Start(int argc, SetupProcessObject(this, argc, argv, exec_argc, exec_argv); // Used by EnvPromiseHook to know that we are on a node context. - process_object->SetInternalField(0, v8::Int32::New(isolate(), kNodeContextTag)); + context()->SetAlignedPointerInEmbedderData(kContextEmbedderDataIndex + 1, (void *)kNodeContextTag); LoadAsyncWrapperInfo(this); @@ -442,20 +441,12 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, v8::Local promise, v8::Local parent) { Local context = promise->CreationContext(); - v8::Isolate *isolate = context->GetIsolate(); - Local global = context->Global(); - // Make sure process is there and its first internal field is the magic value. - Local process = global->Get(OneByteString(isolate, "process")); - if (!process->IsObject()) { - return; - } - Local process_object = process.As(); - if (process_object->InternalFieldCount() < 1) { - return; - } - Local internal_field = process_object->GetInternalField(0); - if (!internal_field->IsInt32() || internal_field.As()->Value() != kNodeContextTag) { + // Grow the embedder data if necessary to make sure we are not out of bounds + // when reading the magic number. + context->SetAlignedPointerInEmbedderData(kContextEmbedderDataIndex + 2, nullptr); + int magicNumber = (int)context->GetAlignedPointerFromEmbedderData(kContextEmbedderDataIndex + 1); + if (magicNumber != kNodeContextTag) { return; } From 077c7a57b6ceb400bae64cc3053f9addc2d2d592 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Wed, 11 Apr 2018 19:07:01 +0200 Subject: [PATCH 23/36] fix: rebase to latest master and use node_context_data constants --- src/node_context_data.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/node_context_data.h b/src/node_context_data.h index 522ce292d21684..3892b31354027d 100644 --- a/src/node_context_data.h +++ b/src/node_context_data.h @@ -19,10 +19,20 @@ namespace node { #define NODE_CONTEXT_ALLOW_WASM_CODE_GENERATION_INDEX 34 #endif +#ifndef NODE_CONTEXT_TAG +#define NODE_CONTEXT_TAG 35 +#endif + +#ifndef NODE_CONTEXT_TAG_BOUNDARY +#define NODE_CONTEXT_TAG_BOUNDARY 36 +#endif + enum ContextEmbedderIndex { kEnvironment = NODE_CONTEXT_EMBEDDER_DATA_INDEX, kSandboxObject = NODE_CONTEXT_SANDBOX_OBJECT_INDEX, kAllowWasmCodeGeneration = NODE_CONTEXT_ALLOW_WASM_CODE_GENERATION_INDEX, + kContextTag = NODE_CONTEXT_TAG, + kContextTagBoundary = NODE_CONTEXT_TAG_BOUNDARY, }; } // namespace node From 92ec8c153b92ffd8b6f3c5f8953d1ce7433fb869 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Wed, 11 Apr 2018 19:20:57 +0200 Subject: [PATCH 24/36] fix: added namespace for enum --- src/env.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/env.cc b/src/env.cc index eca9da476b8714..3ebc0a2dfa337f 100644 --- a/src/env.cc +++ b/src/env.cc @@ -221,7 +221,7 @@ void Environment::Start(int argc, SetupProcessObject(this, argc, argv, exec_argc, exec_argv); // Used by EnvPromiseHook to know that we are on a node context. - context()->SetAlignedPointerInEmbedderData(kContextEmbedderDataIndex + 1, (void *)kNodeContextTag); + context()->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kContextTag, (void *)kNodeContextTag); LoadAsyncWrapperInfo(this); @@ -444,8 +444,8 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, // Grow the embedder data if necessary to make sure we are not out of bounds // when reading the magic number. - context->SetAlignedPointerInEmbedderData(kContextEmbedderDataIndex + 2, nullptr); - int magicNumber = (int)context->GetAlignedPointerFromEmbedderData(kContextEmbedderDataIndex + 1); + context->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kContextTagBoundary, nullptr); + int magicNumber = (int)context->GetAlignedPointerFromEmbedderData(ContextEmbedderIndex::kContextTag); if (magicNumber != kNodeContextTag) { return; } From 39b5c1f589e79300f4143f81b507db2aa2d7b767 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Thu, 19 Apr 2018 21:18:29 +0200 Subject: [PATCH 25/36] fix: storing actual pointers on the context --- src/env.cc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/env.cc b/src/env.cc index 3ebc0a2dfa337f..384b287406ac96 100644 --- a/src/env.cc +++ b/src/env.cc @@ -31,6 +31,9 @@ using v8::Value; using worker::Worker; const int kNodeContextTag = 0x6e6f64; +void *kNodeContextTagPtr = const_cast( + reinterpret_cast(&kNodeContextTag) +); IsolateData::IsolateData(Isolate* isolate, uv_loop_t* event_loop, @@ -221,7 +224,7 @@ void Environment::Start(int argc, SetupProcessObject(this, argc, argv, exec_argc, exec_argv); // Used by EnvPromiseHook to know that we are on a node context. - context()->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kContextTag, (void *)kNodeContextTag); + context()->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kContextTag, kNodeContextTagPtr); LoadAsyncWrapperInfo(this); @@ -445,8 +448,10 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, // Grow the embedder data if necessary to make sure we are not out of bounds // when reading the magic number. context->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kContextTagBoundary, nullptr); - int magicNumber = (int)context->GetAlignedPointerFromEmbedderData(ContextEmbedderIndex::kContextTag); - if (magicNumber != kNodeContextTag) { + int *magicNumberPtr = reinterpret_cast( + context->GetAlignedPointerFromEmbedderData(ContextEmbedderIndex::kContextTag) + ); + if (magicNumberPtr != kNodeContextTagPtr || *magicNumberPtr != kNodeContextTag) { return; } From 9c7257484fa453c70fc75ed2718c8dfc02391294 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Mon, 14 May 2018 20:19:17 +0200 Subject: [PATCH 26/36] src: code review --- src/env.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/env.cc b/src/env.cc index 384b287406ac96..af213781e53c34 100644 --- a/src/env.cc +++ b/src/env.cc @@ -32,7 +32,7 @@ using worker::Worker; const int kNodeContextTag = 0x6e6f64; void *kNodeContextTagPtr = const_cast( - reinterpret_cast(&kNodeContextTag) + static_cast(&kNodeContextTag) ); IsolateData::IsolateData(Isolate* isolate, @@ -448,7 +448,7 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, // Grow the embedder data if necessary to make sure we are not out of bounds // when reading the magic number. context->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kContextTagBoundary, nullptr); - int *magicNumberPtr = reinterpret_cast( + int* magicNumberPtr = reinterpret_cast( context->GetAlignedPointerFromEmbedderData(ContextEmbedderIndex::kContextTag) ); if (magicNumberPtr != kNodeContextTagPtr || *magicNumberPtr != kNodeContextTag) { From e91cdc0ba9b58217c69d7fb0c6d029c464c299c8 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Mon, 14 May 2018 20:20:09 +0200 Subject: [PATCH 27/36] fix: code review changes --- src/env.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/env.cc b/src/env.cc index af213781e53c34..0b7008612e5fee 100644 --- a/src/env.cc +++ b/src/env.cc @@ -31,7 +31,7 @@ using v8::Value; using worker::Worker; const int kNodeContextTag = 0x6e6f64; -void *kNodeContextTagPtr = const_cast( +void* kNodeContextTagPtr = const_cast( static_cast(&kNodeContextTag) ); From 6ef891ec9b5516d04b8d1832483d576339c19744 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Mon, 14 May 2018 20:34:13 +0200 Subject: [PATCH 28/36] fix: code review --- src/env.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/env.cc b/src/env.cc index 0b7008612e5fee..560723e96ee29d 100644 --- a/src/env.cc +++ b/src/env.cc @@ -451,7 +451,7 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, int* magicNumberPtr = reinterpret_cast( context->GetAlignedPointerFromEmbedderData(ContextEmbedderIndex::kContextTag) ); - if (magicNumberPtr != kNodeContextTagPtr || *magicNumberPtr != kNodeContextTag) { + if (magicNumberPtr != kNodeContextTagPtr) { return; } From 5ac8e6267892367d752abf46f176f0ba3af584cb Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Mon, 14 May 2018 20:37:17 +0200 Subject: [PATCH 29/36] fix: code review changes --- src/env.cc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/env.cc b/src/env.cc index 560723e96ee29d..244a0961502c90 100644 --- a/src/env.cc +++ b/src/env.cc @@ -32,8 +32,7 @@ using worker::Worker; const int kNodeContextTag = 0x6e6f64; void* kNodeContextTagPtr = const_cast( - static_cast(&kNodeContextTag) -); + static_cast(&kNodeContextTag)); IsolateData::IsolateData(Isolate* isolate, uv_loop_t* event_loop, @@ -449,8 +448,7 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, // when reading the magic number. context->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kContextTagBoundary, nullptr); int* magicNumberPtr = reinterpret_cast( - context->GetAlignedPointerFromEmbedderData(ContextEmbedderIndex::kContextTag) - ); + context->GetAlignedPointerFromEmbedderData(ContextEmbedderIndex::kContextTag)); if (magicNumberPtr != kNodeContextTagPtr) { return; } From aaa53b1d49e3d5235cd50e7fad59ee450c2731ba Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Mon, 14 May 2018 20:43:53 +0200 Subject: [PATCH 30/36] fix: code review --- src/env.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/env.cc b/src/env.cc index 244a0961502c90..9fecad6b29dc73 100644 --- a/src/env.cc +++ b/src/env.cc @@ -32,7 +32,7 @@ using worker::Worker; const int kNodeContextTag = 0x6e6f64; void* kNodeContextTagPtr = const_cast( - static_cast(&kNodeContextTag)); + static_cast(&kNodeContextTag)); IsolateData::IsolateData(Isolate* isolate, uv_loop_t* event_loop, @@ -448,7 +448,7 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, // when reading the magic number. context->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kContextTagBoundary, nullptr); int* magicNumberPtr = reinterpret_cast( - context->GetAlignedPointerFromEmbedderData(ContextEmbedderIndex::kContextTag)); + context->GetAlignedPointerFromEmbedderData(ContextEmbedderIndex::kContextTag)); if (magicNumberPtr != kNodeContextTagPtr) { return; } From 634a63eba7b8edc4f0c710d54f099b134f8680d6 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Tue, 26 Jun 2018 18:47:40 +0200 Subject: [PATCH 31/36] fix: linting errors --- src/env.cc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/env.cc b/src/env.cc index 8b5cf805262290..da4997dd37d89c 100644 --- a/src/env.cc +++ b/src/env.cc @@ -224,7 +224,8 @@ void Environment::Start(int argc, SetupProcessObject(this, argc, argv, exec_argc, exec_argv); // Used by EnvPromiseHook to know that we are on a node context. - context()->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kContextTag, kNodeContextTagPtr); + context()->SetAlignedPointerInEmbedderData( + ContextEmbedderIndex::kContextTag, kNodeContextTagPtr); LoadAsyncWrapperInfo(this); @@ -447,9 +448,11 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, // Grow the embedder data if necessary to make sure we are not out of bounds // when reading the magic number. - context->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kContextTagBoundary, nullptr); + context->SetAlignedPointerInEmbedderData( + ContextEmbedderIndex::kContextTagBoundary, nullptr); int* magicNumberPtr = reinterpret_cast( - context->GetAlignedPointerFromEmbedderData(ContextEmbedderIndex::kContextTag)); + context->GetAlignedPointerFromEmbedderData( + ContextEmbedderIndex::kContextTag)); if (magicNumberPtr != kNodeContextTagPtr) { return; } From 10b280eba9f5dddbff65ef72fb2973a7f002ddd1 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Tue, 26 Jun 2018 19:22:05 +0200 Subject: [PATCH 32/36] fix: use actual magic number as ptr rather than ptr to int variable --- src/env.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/env.cc b/src/env.cc index da4997dd37d89c..9870e0423146cc 100644 --- a/src/env.cc +++ b/src/env.cc @@ -32,8 +32,10 @@ using v8::Value; using worker::Worker; const int kNodeContextTag = 0x6e6f64; +// We don't store a pointer to kNodeContextTag itself since there might be +// the case where a promise might reside on a different process, yet is a node context void* kNodeContextTagPtr = const_cast( - static_cast(&kNodeContextTag)); + static_cast(kNodeContextTag)); IsolateData::IsolateData(Isolate* isolate, uv_loop_t* event_loop, From e3942017503496f90c1700ab451b56a8381b6c62 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Tue, 26 Jun 2018 20:12:25 +0200 Subject: [PATCH 33/36] fix: reinterpret cast and linting --- src/env.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/env.cc b/src/env.cc index 9870e0423146cc..2c9587480a0447 100644 --- a/src/env.cc +++ b/src/env.cc @@ -33,9 +33,10 @@ using worker::Worker; const int kNodeContextTag = 0x6e6f64; // We don't store a pointer to kNodeContextTag itself since there might be -// the case where a promise might reside on a different process, yet is a node context +// the case where a promise might reside on a different process, yet is a +// node context void* kNodeContextTagPtr = const_cast( - static_cast(kNodeContextTag)); + reinterpret_cast(kNodeContextTag)); IsolateData::IsolateData(Isolate* isolate, uv_loop_t* event_loop, From af69d52bf46a0cc94f7f5ff6a65bed8497c7c7cd Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Tue, 26 Jun 2018 20:14:47 +0200 Subject: [PATCH 34/36] fix: better reinterpret cast --- src/env.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/env.cc b/src/env.cc index 2c9587480a0447..ae3bc82ef18dbd 100644 --- a/src/env.cc +++ b/src/env.cc @@ -35,8 +35,7 @@ const int kNodeContextTag = 0x6e6f64; // We don't store a pointer to kNodeContextTag itself since there might be // the case where a promise might reside on a different process, yet is a // node context -void* kNodeContextTagPtr = const_cast( - reinterpret_cast(kNodeContextTag)); +void* kNodeContextTagPtr = reinterpret_cast(kNodeContextTag); IsolateData::IsolateData(Isolate* isolate, uv_loop_t* event_loop, From 927d984bd84097692b847fef8b3fe353ffd960e6 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Tue, 26 Jun 2018 22:31:14 +0200 Subject: [PATCH 35/36] fix: reverting using fixed address --- src/env.cc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/env.cc b/src/env.cc index ae3bc82ef18dbd..da4997dd37d89c 100644 --- a/src/env.cc +++ b/src/env.cc @@ -32,10 +32,8 @@ using v8::Value; using worker::Worker; const int kNodeContextTag = 0x6e6f64; -// We don't store a pointer to kNodeContextTag itself since there might be -// the case where a promise might reside on a different process, yet is a -// node context -void* kNodeContextTagPtr = reinterpret_cast(kNodeContextTag); +void* kNodeContextTagPtr = const_cast( + static_cast(&kNodeContextTag)); IsolateData::IsolateData(Isolate* isolate, uv_loop_t* event_loop, From 290b62714f89336a3d270f91b4561d6af43da84e Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Wed, 27 Jun 2018 22:06:25 +0200 Subject: [PATCH 36/36] fix: fix for failing unit tests --- src/env-inl.h | 3 +++ src/env.cc | 12 ++++-------- src/env.h | 2 ++ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/env-inl.h b/src/env-inl.h index dc842582d12342..ef19b3f28275bd 100644 --- a/src/env-inl.h +++ b/src/env-inl.h @@ -281,6 +281,9 @@ inline void Environment::AssignToContext(v8::Local context, const ContextInfo& info) { context->SetAlignedPointerInEmbedderData( ContextEmbedderIndex::kEnvironment, this); + // Used by EnvPromiseHook to know that we are on a node context. + context->SetAlignedPointerInEmbedderData( + ContextEmbedderIndex::kContextTag, Environment::kNodeContextTagPtr); #if HAVE_INSPECTOR inspector_agent()->ContextCreated(context, info); #endif // HAVE_INSPECTOR diff --git a/src/env.cc b/src/env.cc index da4997dd37d89c..7976daf3fbc974 100644 --- a/src/env.cc +++ b/src/env.cc @@ -31,9 +31,9 @@ using v8::TryCatch; using v8::Value; using worker::Worker; -const int kNodeContextTag = 0x6e6f64; -void* kNodeContextTagPtr = const_cast( - static_cast(&kNodeContextTag)); +int const Environment::kNodeContextTag = 0x6e6f64; +void* Environment::kNodeContextTagPtr = const_cast( + static_cast(&Environment::kNodeContextTag)); IsolateData::IsolateData(Isolate* isolate, uv_loop_t* event_loop, @@ -223,10 +223,6 @@ void Environment::Start(int argc, SetupProcessObject(this, argc, argv, exec_argc, exec_argv); - // Used by EnvPromiseHook to know that we are on a node context. - context()->SetAlignedPointerInEmbedderData( - ContextEmbedderIndex::kContextTag, kNodeContextTagPtr); - LoadAsyncWrapperInfo(this); static uv_once_t init_once = UV_ONCE_INIT; @@ -453,7 +449,7 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type, int* magicNumberPtr = reinterpret_cast( context->GetAlignedPointerFromEmbedderData( ContextEmbedderIndex::kContextTag)); - if (magicNumberPtr != kNodeContextTagPtr) { + if (magicNumberPtr != Environment::kNodeContextTagPtr) { return; } diff --git a/src/env.h b/src/env.h index a0670db3ed28cc..b03148ef4ca3b7 100644 --- a/src/env.h +++ b/src/env.h @@ -902,6 +902,8 @@ class Environment { uint64_t thread_id_ = 0; std::unordered_set sub_worker_contexts_; + static void* kNodeContextTagPtr; + static int const kNodeContextTag; #if HAVE_INSPECTOR std::unique_ptr inspector_agent_;