Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorliuxingbaoyu <30521560+liuxingbaoyu@users.noreply.github.com>2022-05-02 22:45:47 +0300
committerGitHub <noreply@github.com>2022-05-02 22:45:47 +0300
commitce29d2847b9996602e3b49523d2325aad206543c (patch)
tree3d5466d60f5c354be75cd4321af8fcd99915dbd2 /src
parent961967c1ffcdf08855d05380f1e6b4b4d4e8cbac (diff)
src: fix memory leak for v8.serialize
When Buffer::New passes in existing data, it cannot be garbage collected in js synchronous execution. Fixes: https://github.com/nodejs/node/issues/40828 Refs: https://github.com/nodejs/node/issues/38300 PR-URL: https://github.com/nodejs/node/pull/42695 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Minwoo Jung <nodecorelab@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/node_buffer.cc16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/node_buffer.cc b/src/node_buffer.cc
index 215bd8003aa..dcf5d84ca34 100644
--- a/src/node_buffer.cc
+++ b/src/node_buffer.cc
@@ -502,8 +502,20 @@ MaybeLocal<Object> New(Environment* env,
}
}
- auto free_callback = [](char* data, void* hint) { free(data); };
- return New(env, data, length, free_callback, nullptr);
+ EscapableHandleScope handle_scope(env->isolate());
+
+ auto free_callback = [](void* data, size_t length, void* deleter_data) {
+ free(data);
+ };
+ std::unique_ptr<BackingStore> bs =
+ v8::ArrayBuffer::NewBackingStore(data, length, free_callback, nullptr);
+
+ Local<ArrayBuffer> ab = v8::ArrayBuffer::New(env->isolate(), std::move(bs));
+
+ Local<Object> obj;
+ if (Buffer::New(env, ab, 0, length).ToLocal(&obj))
+ return handle_scope.Escape(obj);
+ return Local<Object>();
}
namespace {