From 9b361f0e90fb1c154a16e65ec087ad36d5cca9b4 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Tue, 5 Dec 2017 14:21:05 +0100 Subject: Return an invalid QSqlDatabase when accessing from another thread QSqlDatabase objects can only be used in the thread that the connection was opened for. So if the driver was created already then we check if the thread is correct. If it is not then we output a warning and return an invalid QSqlDatabase. [ChangeLog][QtSql][QSqlDatabase] QSqlDatabase::database() will return an invalid QSqlDatabase if the calling thread does not own the requested QSqlDatabase. Task-number: QTBUG-216 Change-Id: Ib5a25aa62129e3925f9819109af05961e5178bc5 Reviewed-by: Friedemann Kleint Reviewed-by: Edward Welbourne --- src/sql/kernel/qsqldatabase.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/sql/kernel') diff --git a/src/sql/kernel/qsqldatabase.cpp b/src/sql/kernel/qsqldatabase.cpp index b129499fe6..ded9bd7246 100644 --- a/src/sql/kernel/qsqldatabase.cpp +++ b/src/sql/kernel/qsqldatabase.cpp @@ -50,6 +50,7 @@ #include "private/qsqlnulldriver_p.h" #include "qmutex.h" #include "qhash.h" +#include "qthread.h" #include QT_BEGIN_NAMESPACE @@ -232,6 +233,11 @@ QSqlDatabase QSqlDatabasePrivate::database(const QString& name, bool open) dict->lock.lockForRead(); QSqlDatabase db = dict->value(name); dict->lock.unlock(); + if (db.driver() && db.driver()->thread() != QThread::currentThread()) { + qWarning("QSqlDatabasePrivate::database: requested database does not belong to the calling thread."); + return QSqlDatabase(); + } + if (db.isValid() && !db.isOpen() && open) { if (!db.open()) qWarning() << "QSqlDatabasePrivate::database: unable to open database:" << db.lastError().text(); -- cgit v1.2.3