diff --git a/src/node_sqlite.cc b/src/node_sqlite.cc index d9f979c36b3ce5..0d1d8c5e4481ce 100644 --- a/src/node_sqlite.cc +++ b/src/node_sqlite.cc @@ -1044,10 +1044,23 @@ void DatabaseSync::CreateTagStore(const FunctionCallbackInfo& args) { return; } int capacity = 1000; - if (args.Length() > 0 && args[0]->IsNumber()) { - capacity = args[0].As()->Value(); + if (args.Length() > 0 && !args[0]->IsUndefined()) { + if (!args[0]->IsNumber()) { + THROW_ERR_INVALID_ARG_TYPE( + env->isolate(), + "The \"maxSize\" argument must be a positive integer."); + return; + } + double val = args[0].As()->Value(); + if (!std::isfinite(val) || std::floor(val) != val || val <= 0 || + val > std::numeric_limits::max()) { + THROW_ERR_OUT_OF_RANGE( + env->isolate(), + "The \"maxSize\" argument must be a positive integer."); + return; + } + capacity = static_cast(val); } - BaseObjectPtr session = SQLTagStore::Create(env, BaseObjectWeakPtr(db), capacity); if (!session) { diff --git a/test/parallel/test-sqlite-template-tag.js b/test/parallel/test-sqlite-template-tag.js index 0c6328e33af2f6..acf0fe53fa75a8 100644 --- a/test/parallel/test-sqlite-template-tag.js +++ b/test/parallel/test-sqlite-template-tag.js @@ -112,6 +112,40 @@ test('TagStore capacity, size, and clear', () => { assert.strictEqual(sql.capacity, 10); }); +test('createTagStore throws on invalid maxSize', () => { + const db = new DatabaseSync(':memory:'); + + assert.throws(() => db.createTagStore(0), { + code: 'ERR_OUT_OF_RANGE', + message: /maxSize/, + }); + + assert.throws(() => db.createTagStore(-1), { + code: 'ERR_OUT_OF_RANGE', + message: /maxSize/, + }); + + assert.throws(() => db.createTagStore(NaN), { + code: 'ERR_OUT_OF_RANGE', + message: /maxSize/, + }); + + assert.throws(() => db.createTagStore(1.5), { + code: 'ERR_OUT_OF_RANGE', + message: /maxSize/, + }); + + assert.throws(() => db.createTagStore('abc'), { + code: 'ERR_INVALID_ARG_TYPE', + message: /maxSize/, + }); + + assert.throws(() => db.createTagStore(Number.MAX_SAFE_INTEGER), { + code: 'ERR_OUT_OF_RANGE', + message: /maxSize/, + }); +}); + test('sql.db returns the associated DatabaseSync instance', () => { assert.strictEqual(sql.db, db); });