summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndy Shaw <andy.shaw@qt.io>2017-12-05 14:21:05 +0100
committerAndy Shaw <andy.shaw@qt.io>2018-01-02 08:49:40 +0000
commit9b361f0e90fb1c154a16e65ec087ad36d5cca9b4 (patch)
treea72ecbe1b9c125d1ad3c8a7d2789f70d6249dcd0 /src
parent2b0eb3fac319a17dd92903106d501f0f06df871f (diff)
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 <Friedemann.Kleint@qt.io> Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/sql/kernel/qsqldatabase.cpp6
1 files changed, 6 insertions, 0 deletions
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 <stdlib.h>
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();