diff options
author | Trevor Norris <trev.norris@gmail.com> | 2016-04-29 12:26:35 -0600 |
---|---|---|
committer | Trevor Norris <trev.norris@gmail.com> | 2016-05-24 14:38:34 -0600 |
commit | 9dd5b93c42a2e693a6660a580cf67723d7b287c8 (patch) | |
tree | 46b3931cb82645cef802e8857dd84bd697a036c7 /src | |
parent | ddc19be6de1ba263d9c175b2760696e7b9918b25 (diff) | |
download | android-node-v8-9dd5b93c42a2e693a6660a580cf67723d7b287c8.tar.gz android-node-v8-9dd5b93c42a2e693a6660a580cf67723d7b287c8.tar.bz2 android-node-v8-9dd5b93c42a2e693a6660a580cf67723d7b287c8.zip |
src: always clear wrap before persistent Reset()
In case the handle is stored and accessed after the associated C++ class
was destructed, set the internal pointer to nullptr so any
getters/setters can return accordingly without aborting the application.
PR-URL: https://github.com/nodejs/node/pull/6184
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Diffstat (limited to 'src')
-rw-r--r-- | src/cares_wrap.cc | 2 | ||||
-rw-r--r-- | src/handle_wrap.cc | 2 | ||||
-rw-r--r-- | src/node_crypto.cc | 2 | ||||
-rw-r--r-- | src/req-wrap-inl.h | 1 |
4 files changed, 6 insertions, 1 deletions
diff --git a/src/cares_wrap.cc b/src/cares_wrap.cc index 6bd73ae3ba..91d139ac9c 100644 --- a/src/cares_wrap.cc +++ b/src/cares_wrap.cc @@ -9,6 +9,7 @@ #include "req-wrap-inl.h" #include "tree.h" #include "util.h" +#include "util-inl.h" #include "uv.h" #include <errno.h> @@ -258,6 +259,7 @@ class QueryWrap : public AsyncWrap { virtual ~QueryWrap() override { CHECK_EQ(false, persistent().IsEmpty()); + ClearWrap(object()); persistent().Reset(); } diff --git a/src/handle_wrap.cc b/src/handle_wrap.cc index b3ef152a2e..c5792338af 100644 --- a/src/handle_wrap.cc +++ b/src/handle_wrap.cc @@ -98,7 +98,7 @@ void HandleWrap::OnClose(uv_handle_t* handle) { if (have_close_callback) wrap->MakeCallback(env->onclose_string(), 0, nullptr); - wrap->object()->SetAlignedPointerInInternalField(0, nullptr); + ClearWrap(wrap->object()); wrap->persistent().Reset(); delete wrap; } diff --git a/src/node_crypto.cc b/src/node_crypto.cc index 71799d0bfa..71e1272e9d 100644 --- a/src/node_crypto.cc +++ b/src/node_crypto.cc @@ -5023,6 +5023,7 @@ class PBKDF2Request : public AsyncWrap { ~PBKDF2Request() override { release(); + ClearWrap(object()); persistent().Reset(); } @@ -5288,6 +5289,7 @@ class RandomBytesRequest : public AsyncWrap { } ~RandomBytesRequest() override { + ClearWrap(object()); persistent().Reset(); } diff --git a/src/req-wrap-inl.h b/src/req-wrap-inl.h index 63229260ec..653babd2a7 100644 --- a/src/req-wrap-inl.h +++ b/src/req-wrap-inl.h @@ -28,6 +28,7 @@ template <typename T> ReqWrap<T>::~ReqWrap() { CHECK_EQ(req_.data, this); // Assert that someone has called Dispatched(). CHECK_EQ(false, persistent().IsEmpty()); + ClearWrap(object()); persistent().Reset(); } |