sqlite: invalidate sessions when closing database · nodejs/node@14e802d · GitHub
Skip to content

Commit 14e802d

Browse files
trivikraduh95
authored andcommitted
sqlite: invalidate sessions when closing database
DatabaseSync::DeleteSessions() deleted native sqlite3_session handles without clearing the pointers held by their Session wrappers. Reopening the database allowed stale session handles to be used, crashing the process. Track Session wrappers and delete sessions through Session::Delete() so the wrappers are marked closed. Signed-off-by: Kamat, Trivikram <16024985+trivikr@users.noreply.github.com> Assisted-by: codex:gpt-5.6-sol PR-URL: #64783 Fixes: #64782 Reviewed-By: Aviv Keller <me@aviv.sh>
1 parent 31522c4 commit 14e802d

3 files changed

Lines changed: 37 additions & 7 deletions

File tree

src/node_sqlite.cc

Lines changed: 17 additions & 6 deletions

src/node_sqlite.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ class DatabaseSyncLimits;
133133
class StatementSyncIterator;
134134
class StatementSync;
135135
class BackupJob;
136+
class Session;
136137

137138
class StatementExecutionHelper {
138139
public:
@@ -243,7 +244,7 @@ class DatabaseSync : public BaseObject {
243244
bool ignore_next_sqlite_error_;
244245

245246
std::set<BackupJob*> backups_;
246-
std::set<sqlite3_session*> sessions_;
247+
std::unordered_set<Session*> sessions_;
247248
std::unordered_set<StatementSync*> statements_;
248249

249250
friend class DatabaseSyncLimits;
@@ -360,6 +361,8 @@ class Session : public BaseObject {
360361
void Delete();
361362
sqlite3_session* session_;
362363
BaseObjectPtr<DatabaseSync> database_; // The Parent Database
364+
365+
friend class DatabaseSync;
363366
};
364367

365368
class SQLTagStore : public BaseObject {

test/parallel/test-sqlite-session.js

Lines changed: 16 additions & 0 deletions

0 commit comments

Comments
 (0)