diff options
author | Anna Henningsen <anna@addaleax.net> | 2020-04-24 15:45:51 +0200 |
---|---|---|
committer | Ruben Bridgewater <ruben@bridgewater.de> | 2020-04-28 13:58:25 +0200 |
commit | 18fd841ab494f122579ec310eab7d9b3bc5364a7 (patch) | |
tree | f2cd858b5c9d2bbad85dc2b737c35af96c596b43 | |
parent | dd1cc1a4ac18b6d2794314e5d17d3652b75d4c3d (diff) | |
download | node-new-18fd841ab494f122579ec310eab7d9b3bc5364a7.tar.gz |
buffer,n-api: fix double ArrayBuffer::Detach() during cleanup
These calls could fail if the `ArrayBuffer` had already been explicitly
detached at some point in the past.
The necessary test changes already came with 4f523c2c1a1c and could
be ported back to v12.x with a backport of this PR.
Fixes: https://github.com/nodejs/node/issues/33022
Refs: https://github.com/nodejs/node/pull/30551
PR-URL: https://github.com/nodejs/node/pull/33039
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
Reviewed-By: Gerhard Stöbich <deb2001-github@yahoo.de>
Reviewed-By: David Carlier <devnexen@gmail.com>
Reviewed-By: Juan José Arboleda <soyjuanarbol@gmail.com>
-rw-r--r-- | src/js_native_api_v8.cc | 10 | ||||
-rw-r--r-- | src/node_buffer.cc | 3 |
2 files changed, 8 insertions, 5 deletions
diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc index 1a01f2a290..5e8794e8d0 100644 --- a/src/js_native_api_v8.cc +++ b/src/js_native_api_v8.cc @@ -392,10 +392,12 @@ class ArrayBufferReference final : public Reference { inline void Finalize(bool is_env_teardown) override { if (is_env_teardown) { v8::HandleScope handle_scope(_env->isolate); - v8::Local<v8::Value> ab = Get(); - CHECK(!ab.IsEmpty()); - CHECK(ab->IsArrayBuffer()); - ab.As<v8::ArrayBuffer>()->Detach(); + v8::Local<v8::Value> obj = Get(); + CHECK(!obj.IsEmpty()); + CHECK(obj->IsArrayBuffer()); + v8::Local<v8::ArrayBuffer> ab = obj.As<v8::ArrayBuffer>(); + if (ab->IsDetachable()) + ab->Detach(); } Reference::Finalize(is_env_teardown); diff --git a/src/node_buffer.cc b/src/node_buffer.cc index 9da95a350b..374e4c52cc 100644 --- a/src/node_buffer.cc +++ b/src/node_buffer.cc @@ -152,7 +152,8 @@ void CallbackInfo::CleanupHook(void* data) { HandleScope handle_scope(self->env_->isolate()); Local<ArrayBuffer> ab = self->persistent_.Get(self->env_->isolate()); CHECK(!ab.IsEmpty()); - ab->Detach(); + if (ab->IsDetachable()) + ab->Detach(); } self->WeakCallback(self->env_->isolate()); |