summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2020-04-24 15:45:51 +0200
committerRuben Bridgewater <ruben@bridgewater.de>2020-04-28 13:58:25 +0200
commit18fd841ab494f122579ec310eab7d9b3bc5364a7 (patch)
treef2cd858b5c9d2bbad85dc2b737c35af96c596b43
parentdd1cc1a4ac18b6d2794314e5d17d3652b75d4c3d (diff)
downloadnode-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.cc10
-rw-r--r--src/node_buffer.cc3
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());