diff options
author | liuxingbaoyu <30521560+liuxingbaoyu@users.noreply.github.com> | 2022-05-02 22:45:47 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-02 22:45:47 +0300 |
commit | ce29d2847b9996602e3b49523d2325aad206543c (patch) | |
tree | 3d5466d60f5c354be75cd4321af8fcd99915dbd2 /src | |
parent | 961967c1ffcdf08855d05380f1e6b4b4d4e8cbac (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.cc | 16 |
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 { |