Skip to content

Commit b3439a5

Browse files
committed
sqlite: validate options before creating stmt
1 parent 9bca95a commit b3439a5

File tree

1 file changed

+30
-13
lines changed

1 file changed

+30
-13
lines changed

src/node_sqlite.cc

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1147,14 +1147,10 @@ void DatabaseSync::Prepare(const FunctionCallbackInfo<Value>& args) {
11471147
return;
11481148
}
11491149

1150-
Utf8Value sql(env->isolate(), args[0].As<String>());
1151-
sqlite3_stmt* s = nullptr;
1152-
int r = sqlite3_prepare_v2(db->connection_, *sql, -1, &s, 0);
1153-
1154-
CHECK_ERROR_OR_THROW(env->isolate(), db, r, SQLITE_OK, void());
1155-
BaseObjectPtr<StatementSync> stmt =
1156-
StatementSync::Create(env, BaseObjectPtr<DatabaseSync>(db), s);
1157-
db->statements_.insert(stmt.get());
1150+
std::optional<bool> return_arrays;
1151+
std::optional<bool> use_big_ints;
1152+
std::optional<bool> allow_bare_named_params;
1153+
std::optional<bool> allow_unknown_named_params;
11581154

11591155
if (args.Length() > 1 && !args[1]->IsUndefined()) {
11601156
if (!args[1]->IsObject()) {
@@ -1178,7 +1174,7 @@ void DatabaseSync::Prepare(const FunctionCallbackInfo<Value>& args) {
11781174
"The \"options.returnArrays\" argument must be a boolean.");
11791175
return;
11801176
}
1181-
stmt->return_arrays_ = return_arrays_v->IsTrue();
1177+
return_arrays = return_arrays_v->IsTrue();
11821178
}
11831179

11841180
Local<Value> read_big_ints_v;
@@ -1195,7 +1191,7 @@ void DatabaseSync::Prepare(const FunctionCallbackInfo<Value>& args) {
11951191
"The \"options.readBigInts\" argument must be a boolean.");
11961192
return;
11971193
}
1198-
stmt->use_big_ints_ = read_big_ints_v->IsTrue();
1194+
use_big_ints = read_big_ints_v->IsTrue();
11991195
}
12001196

12011197
Local<Value> allow_bare_named_params_v;
@@ -1214,7 +1210,7 @@ void DatabaseSync::Prepare(const FunctionCallbackInfo<Value>& args) {
12141210
"boolean.");
12151211
return;
12161212
}
1217-
stmt->allow_bare_named_params_ = allow_bare_named_params_v->IsTrue();
1213+
allow_bare_named_params = allow_bare_named_params_v->IsTrue();
12181214
}
12191215

12201216
Local<Value> allow_unknown_named_params_v;
@@ -1233,11 +1229,32 @@ void DatabaseSync::Prepare(const FunctionCallbackInfo<Value>& args) {
12331229
"boolean.");
12341230
return;
12351231
}
1236-
stmt->allow_unknown_named_params_ =
1237-
allow_unknown_named_params_v->IsTrue();
1232+
allow_unknown_named_params = allow_unknown_named_params_v->IsTrue();
12381233
}
12391234
}
12401235

1236+
Utf8Value sql(env->isolate(), args[0].As<String>());
1237+
sqlite3_stmt* s = nullptr;
1238+
int r = sqlite3_prepare_v2(db->connection_, *sql, -1, &s, 0);
1239+
1240+
CHECK_ERROR_OR_THROW(env->isolate(), db, r, SQLITE_OK, void());
1241+
BaseObjectPtr<StatementSync> stmt =
1242+
StatementSync::Create(env, BaseObjectPtr<DatabaseSync>(db), s);
1243+
db->statements_.insert(stmt.get());
1244+
1245+
if (return_arrays.has_value()) {
1246+
stmt->return_arrays_ = return_arrays.value();
1247+
}
1248+
if (use_big_ints.has_value()) {
1249+
stmt->use_big_ints_ = use_big_ints.value();
1250+
}
1251+
if (allow_bare_named_params.has_value()) {
1252+
stmt->allow_bare_named_params_ = allow_bare_named_params.value();
1253+
}
1254+
if (allow_unknown_named_params.has_value()) {
1255+
stmt->allow_unknown_named_params_ = allow_unknown_named_params.value();
1256+
}
1257+
12411258
args.GetReturnValue().Set(stmt->object());
12421259
}
12431260

0 commit comments

Comments
 (0)