diff options
author | Ben Noordhuis <info@bnoordhuis.nl> | 2018-02-21 15:24:18 +0100 |
---|---|---|
committer | Ben Noordhuis <info@bnoordhuis.nl> | 2018-02-21 15:24:18 +0100 |
commit | 992703f2b50f6b3483e9b930737d177b9e01256d (patch) | |
tree | 7d9b2752b6021d7653d426bbebdc80a437624a47 /src/node_api.cc | |
parent | e53275d819fb21d4bb15a27a714f134551233cf9 (diff) | |
download | node-new-992703f2b50f6b3483e9b930737d177b9e01256d.tar.gz |
src: prevent persistent handle resource leaks
Replace v8::Persistent with node::Persistent, a specialization that
resets the persistent handle on destruction. Prevents accidental
resource leaks when forgetting to call .Reset() manually.
I'm fairly confident this commit fixes a number of resource leaks that
have gone undiagnosed so far.
PR-URL: https://github.com/nodejs/node/pull/18656
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Diffstat (limited to 'src/node_api.cc')
-rw-r--r-- | src/node_api.cc | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/src/node_api.cc b/src/node_api.cc index 2c5f3066f7..7b0e110579 100644 --- a/src/node_api.cc +++ b/src/node_api.cc @@ -38,10 +38,10 @@ struct napi_env__ { accessor_data_template.Reset(); } v8::Isolate* isolate; - v8::Persistent<v8::Value> last_exception; - v8::Persistent<v8::ObjectTemplate> wrap_template; - v8::Persistent<v8::ObjectTemplate> function_data_template; - v8::Persistent<v8::ObjectTemplate> accessor_data_template; + node::Persistent<v8::Value> last_exception; + node::Persistent<v8::ObjectTemplate> wrap_template; + node::Persistent<v8::ObjectTemplate> function_data_template; + node::Persistent<v8::ObjectTemplate> accessor_data_template; napi_extended_error_info last_error; int open_handle_scopes = 0; int open_callback_scopes = 0; @@ -274,13 +274,13 @@ static_assert(sizeof(v8::Local<v8::Value>) == sizeof(napi_value), "Cannot convert between v8::Local<v8::Value> and napi_value"); static -napi_deferred JsDeferredFromV8Persistent(v8::Persistent<v8::Value>* local) { +napi_deferred JsDeferredFromNodePersistent(node::Persistent<v8::Value>* local) { return reinterpret_cast<napi_deferred>(local); } static -v8::Persistent<v8::Value>* V8PersistentFromJsDeferred(napi_deferred local) { - return reinterpret_cast<v8::Persistent<v8::Value>*>(local); +node::Persistent<v8::Value>* NodePersistentFromJsDeferred(napi_deferred local) { + return reinterpret_cast<node::Persistent<v8::Value>*>(local); } static @@ -360,7 +360,7 @@ class Finalizer { void* _finalize_hint; }; -// Wrapper around v8::Persistent that implements reference counting. +// Wrapper around node::Persistent that implements reference counting. class Reference : private Finalizer { private: Reference(napi_env env, @@ -470,7 +470,7 @@ class Reference : private Finalizer { } } - v8::Persistent<v8::Value> _persistent; + node::Persistent<v8::Value> _persistent; uint32_t _refcount; bool _delete_self; }; @@ -846,8 +846,8 @@ napi_status ConcludeDeferred(napi_env env, CHECK_ARG(env, result); v8::Local<v8::Context> context = env->isolate->GetCurrentContext(); - v8::Persistent<v8::Value>* deferred_ref = - V8PersistentFromJsDeferred(deferred); + node::Persistent<v8::Value>* deferred_ref = + NodePersistentFromJsDeferred(deferred); v8::Local<v8::Value> v8_deferred = v8::Local<v8::Value>::New(env->isolate, *deferred_ref); @@ -3493,10 +3493,10 @@ napi_status napi_create_promise(napi_env env, CHECK_MAYBE_EMPTY(env, maybe, napi_generic_failure); auto v8_resolver = maybe.ToLocalChecked(); - auto v8_deferred = new v8::Persistent<v8::Value>(); + auto v8_deferred = new node::Persistent<v8::Value>(); v8_deferred->Reset(env->isolate, v8_resolver); - *deferred = v8impl::JsDeferredFromV8Persistent(v8_deferred); + *deferred = v8impl::JsDeferredFromNodePersistent(v8_deferred); *promise = v8impl::JsValueFromV8LocalValue(v8_resolver->GetPromise()); return GET_RETURN_STATUS(env); } |