From 4a0646c76fa2930f3978659ecbc20f5d5978cdc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guilherme=20Ara=C3=BAjo?= Date: Mon, 26 Jan 2026 22:53:35 -0300 Subject: [PATCH 1/2] sqlite: reserve vectors space --- src/node_sqlite.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/node_sqlite.cc b/src/node_sqlite.cc index 4fad22c618900d..26293e1ebcff2f 100644 --- a/src/node_sqlite.cc +++ b/src/node_sqlite.cc @@ -321,7 +321,8 @@ class CustomAggregate { } auto recv = Undefined(isolate); - LocalVector js_argv(isolate); + LocalVector js_argv(isolate, argc + 1); + js_argv.emplace_back(Local::New(isolate, agg->value)); for (int i = 0; i < argc; ++i) { @@ -624,7 +625,7 @@ void UserDefinedFunction::xFunc(sqlite3_context* ctx, Isolate* isolate = env->isolate(); auto recv = Undefined(isolate); auto fn = self->fn_.Get(isolate); - LocalVector js_argv(isolate); + LocalVector js_argv(isolate, argc); for (int i = 0; i < argc; ++i) { sqlite3_value* value = argv[i]; @@ -2063,7 +2064,7 @@ int DatabaseSync::AuthorizerCallback(void* user_data, CHECK(cb->IsFunction()); Local callback = cb.As(); - LocalVector js_argv(isolate); + LocalVector js_argv(isolate, 5); // Convert SQLite authorizer parameters to JavaScript values js_argv.emplace_back(Integer::New(isolate, action_code)); From ec4defd2917a35805a6677ad86ce6372a1d7686d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guilherme=20Ara=C3=BAjo?= Date: Tue, 27 Jan 2026 07:56:04 -0300 Subject: [PATCH 2/2] sqlite: fix crashes --- src/node_sqlite.cc | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/node_sqlite.cc b/src/node_sqlite.cc index 26293e1ebcff2f..ee8c1788c4b3a7 100644 --- a/src/node_sqlite.cc +++ b/src/node_sqlite.cc @@ -321,7 +321,8 @@ class CustomAggregate { } auto recv = Undefined(isolate); - LocalVector js_argv(isolate, argc + 1); + LocalVector js_argv(isolate); + js_argv.reserve(argc + 1); js_argv.emplace_back(Local::New(isolate, agg->value)); @@ -625,7 +626,8 @@ void UserDefinedFunction::xFunc(sqlite3_context* ctx, Isolate* isolate = env->isolate(); auto recv = Undefined(isolate); auto fn = self->fn_.Get(isolate); - LocalVector js_argv(isolate, argc); + LocalVector js_argv(isolate); + js_argv.reserve(argc); for (int i = 0; i < argc; ++i) { sqlite3_value* value = argv[i]; @@ -2064,18 +2066,16 @@ int DatabaseSync::AuthorizerCallback(void* user_data, CHECK(cb->IsFunction()); Local callback = cb.As(); - LocalVector js_argv(isolate, 5); - - // Convert SQLite authorizer parameters to JavaScript values - js_argv.emplace_back(Integer::New(isolate, action_code)); - js_argv.emplace_back( - NullableSQLiteStringToValue(isolate, param1).ToLocalChecked()); - js_argv.emplace_back( - NullableSQLiteStringToValue(isolate, param2).ToLocalChecked()); - js_argv.emplace_back( - NullableSQLiteStringToValue(isolate, param3).ToLocalChecked()); - js_argv.emplace_back( - NullableSQLiteStringToValue(isolate, param4).ToLocalChecked()); + + LocalVector js_argv( + isolate, + { + Integer::New(isolate, action_code), + NullableSQLiteStringToValue(isolate, param1).ToLocalChecked(), + NullableSQLiteStringToValue(isolate, param2).ToLocalChecked(), + NullableSQLiteStringToValue(isolate, param3).ToLocalChecked(), + NullableSQLiteStringToValue(isolate, param4).ToLocalChecked(), + }); MaybeLocal retval = callback->Call( context, Undefined(isolate), js_argv.size(), js_argv.data());