diff --git a/src/better_sqlite3.cpp b/src/better_sqlite3.cpp index b0a0f8303..0fcc20479 100644 --- a/src/better_sqlite3.cpp +++ b/src/better_sqlite3.cpp @@ -2,6 +2,17 @@ // #include "better_sqlite3.hpp" +#line 161 "./src/util/macros.lzz" +#ifndef V8_COMPRESS_POINTERS_IN_SHARED_CAGE +# define SAFE_NEW_BUFFER(env, data, length, finalizeCallback, finalizeHint) node::Buffer::New(env, data, length, finalizeCallback, finalizeHint) +#else + static inline v8::MaybeLocal BufferSandboxNew(v8::Isolate* isolate, char* data, size_t length, void (*finalizeCallback)(char*, void*), void* finalizeHint) { + v8::MaybeLocal buffer = node::Buffer::Copy(isolate, data, length); + finalizeCallback(data, finalizeHint); + return buffer; + } +# define SAFE_NEW_BUFFER(env, data, length, finalizeCallback, finalizeHint) BufferSandboxNew(env, data, length, finalizeCallback, finalizeHint) +#endif #line 39 "./src/util/binder.lzz" static bool IsPlainObject(v8::Isolate* isolate, v8::Local obj) { v8::Local proto = obj->GetPrototype(); @@ -573,7 +584,7 @@ void Database::JS_serialize (v8::FunctionCallbackInfo const & info } info.GetReturnValue().Set( - node::Buffer::New(isolate, reinterpret_cast(data), length, FreeSerialization, NULL).ToLocalChecked() + SAFE_NEW_BUFFER(isolate, reinterpret_cast(data), length, FreeSerialization, NULL).ToLocalChecked() ); } #line 297 "./src/objects/database.lzz" diff --git a/src/objects/database.lzz b/src/objects/database.lzz index 94b1d455e..14e80f705 100644 --- a/src/objects/database.lzz +++ b/src/objects/database.lzz @@ -290,7 +290,7 @@ private: } info.GetReturnValue().Set( - node::Buffer::New(isolate, reinterpret_cast(data), length, FreeSerialization, NULL).ToLocalChecked() + SAFE_NEW_BUFFER(isolate, reinterpret_cast(data), length, FreeSerialization, NULL).ToLocalChecked() ); } diff --git a/src/util/macros.lzz b/src/util/macros.lzz index 666488cc5..1562e178c 100644 --- a/src/util/macros.lzz +++ b/src/util/macros.lzz @@ -156,3 +156,16 @@ void SetPrototypeGetter( v8::PropertyAttribute::None ); } + +#src +#ifndef V8_COMPRESS_POINTERS_IN_SHARED_CAGE +# define SAFE_NEW_BUFFER(env, data, length, finalizeCallback, finalizeHint) node::Buffer::New(env, data, length, finalizeCallback, finalizeHint) +#else + static inline v8::MaybeLocal BufferSandboxNew(v8::Isolate* isolate, char* data, size_t length, void (*finalizeCallback)(char*, void*), void* finalizeHint) { + v8::MaybeLocal buffer = node::Buffer::Copy(isolate, data, length); + finalizeCallback(data, finalizeHint); + return buffer; + } +# define SAFE_NEW_BUFFER(env, data, length, finalizeCallback, finalizeHint) BufferSandboxNew(env, data, length, finalizeCallback, finalizeHint) +#endif +#end \ No newline at end of file