Skip to content

Commit d6d2a71

Browse files
Anshikakalpanaaduh95
authored andcommitted
sqlite: validate maxSize argument in createTagStore()
Signed-off-by: anshikakalpana <anshikajain196872@gmail.com> PR-URL: #63792 Fixes: #63791 Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent cd84d55 commit d6d2a71

2 files changed

Lines changed: 50 additions & 3 deletions

File tree

src/node_sqlite.cc

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,10 +1068,23 @@ void DatabaseSync::CreateTagStore(const FunctionCallbackInfo<Value>& args) {
10681068
return;
10691069
}
10701070
int capacity = 1000;
1071-
if (args.Length() > 0 && args[0]->IsNumber()) {
1072-
capacity = args[0].As<Number>()->Value();
1071+
if (args.Length() > 0 && !args[0]->IsUndefined()) {
1072+
if (!args[0]->IsNumber()) {
1073+
THROW_ERR_INVALID_ARG_TYPE(
1074+
env->isolate(),
1075+
"The \"maxSize\" argument must be a positive integer.");
1076+
return;
1077+
}
1078+
double val = args[0].As<Number>()->Value();
1079+
if (std::floor(val) != val || val <= 0 ||
1080+
val > std::numeric_limits<int>::max()) {
1081+
THROW_ERR_OUT_OF_RANGE(
1082+
env->isolate(),
1083+
"The \"maxSize\" argument must be a positive integer.");
1084+
return;
1085+
}
1086+
capacity = static_cast<int>(val);
10731087
}
1074-
10751088
BaseObjectPtr<SQLTagStore> session =
10761089
SQLTagStore::Create(env, BaseObjectWeakPtr<DatabaseSync>(db), capacity);
10771090
if (!session) {

test/parallel/test-sqlite-template-tag.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,40 @@ test('a finished iterator stays done and does not restart', () => {
257257
assert.strictEqual(iter.next().done, true);
258258
});
259259

260+
test('createTagStore throws on invalid maxSize', () => {
261+
const db = new DatabaseSync(':memory:');
262+
263+
assert.throws(() => db.createTagStore(0), {
264+
code: 'ERR_OUT_OF_RANGE',
265+
message: /maxSize/,
266+
});
267+
268+
assert.throws(() => db.createTagStore(-1), {
269+
code: 'ERR_OUT_OF_RANGE',
270+
message: /maxSize/,
271+
});
272+
273+
assert.throws(() => db.createTagStore(NaN), {
274+
code: 'ERR_OUT_OF_RANGE',
275+
message: /maxSize/,
276+
});
277+
278+
assert.throws(() => db.createTagStore(1.5), {
279+
code: 'ERR_OUT_OF_RANGE',
280+
message: /maxSize/,
281+
});
282+
283+
assert.throws(() => db.createTagStore('abc'), {
284+
code: 'ERR_INVALID_ARG_TYPE',
285+
message: /maxSize/,
286+
});
287+
288+
assert.throws(() => db.createTagStore(Number.MAX_SAFE_INTEGER), {
289+
code: 'ERR_OUT_OF_RANGE',
290+
message: /maxSize/,
291+
});
292+
});
293+
260294
test('sql.db returns the associated DatabaseSync instance', () => {
261295
assert.strictEqual(sql.db, db);
262296
});

0 commit comments

Comments
 (0)