summaryrefslogtreecommitdiffstats
path: root/tests/auto/sql
diff options
context:
space:
mode:
authorAlexandru Croitor <alexandru.croitor@qt.io>2020-06-30 18:49:57 +0200
committerAlexandru Croitor <alexandru.croitor@qt.io>2020-07-01 10:03:57 +0200
commitfb55e1e71e3c98aca880c23d97f9e811e2b406a0 (patch)
treee7543c1df9f17f59bc8430776ad35a454e52bb54 /tests/auto/sql
parenta0468331761b497992e9d554c210583781308272 (diff)
Sql: Fix heap-user-after-free for globally initialized db objects
Becaues the database objects were created as globals, there was a possible use-after-free issue when deleting the objects on application exit. Move the initialization of the database objects into static variables inside the test constructor. As a drive-by, also add one missing test to the CMake projects. Fixes: QTBUG-85357 Change-Id: I2c8f2c5daee96bb9d1d21dae37950a2da5ffdf27 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'tests/auto/sql')
-rw-r--r--tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp4
-rw-r--r--tests/auto/sql/kernel/qsqlthread/tst_qsqlthread.cpp4
-rw-r--r--tests/auto/sql/models/CMakeLists.txt4
-rw-r--r--tests/auto/sql/models/qsqlrelationaldelegate/tst_qsqlrelationaldelegate.cpp13
-rw-r--r--tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp28
-rw-r--r--tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp15
6 files changed, 55 insertions, 13 deletions
diff --git a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
index dae44c8ec0..54bdd52230 100644
--- a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
+++ b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
@@ -33,7 +33,7 @@
#include "../qsqldatabase/tst_databases.h"
-const QString qtest(qTableName("qtest", __FILE__, QSqlDatabase()));
+QString qtest;
class tst_QSqlQuery : public QObject
{
@@ -271,6 +271,8 @@ private:
tst_QSqlQuery::tst_QSqlQuery()
{
+ static QSqlDatabase static_qtest_db = QSqlDatabase();
+ qtest = qTableName("qtest", __FILE__, static_qtest_db);
}
tst_QSqlQuery::~tst_QSqlQuery()
diff --git a/tests/auto/sql/kernel/qsqlthread/tst_qsqlthread.cpp b/tests/auto/sql/kernel/qsqlthread/tst_qsqlthread.cpp
index aa2cc05b56..edee3bf790 100644
--- a/tests/auto/sql/kernel/qsqlthread/tst_qsqlthread.cpp
+++ b/tests/auto/sql/kernel/qsqlthread/tst_qsqlthread.cpp
@@ -36,7 +36,7 @@
#include <QtSql>
#include "qdebug.h"
-const QString qtest(qTableName("qtest", __FILE__, QSqlDatabase()));
+QString qtest;
// set this define if Oracle is built with threading support
//#define QOCI_THREADED
@@ -263,6 +263,8 @@ private:
tst_QSqlThread::tst_QSqlThread()
: threadFinishedCount(0)
{
+ static QSqlDatabase static_qtest_db = QSqlDatabase();
+ qtest = qTableName("qtest", __FILE__, static_qtest_db);
}
tst_QSqlThread::~tst_QSqlThread()
diff --git a/tests/auto/sql/models/CMakeLists.txt b/tests/auto/sql/models/CMakeLists.txt
index df530443c4..ce44f587de 100644
--- a/tests/auto/sql/models/CMakeLists.txt
+++ b/tests/auto/sql/models/CMakeLists.txt
@@ -1,6 +1,8 @@
+# Generated from models.pro.
+
add_subdirectory(qsqlrelationaltablemodel)
add_subdirectory(qsqltablemodel)
-
if(TARGET Qt::Widgets)
add_subdirectory(qsqlquerymodel)
+ add_subdirectory(qsqlrelationaldelegate)
endif()
diff --git a/tests/auto/sql/models/qsqlrelationaldelegate/tst_qsqlrelationaldelegate.cpp b/tests/auto/sql/models/qsqlrelationaldelegate/tst_qsqlrelationaldelegate.cpp
index a7089c06a1..9b00cda3dd 100644
--- a/tests/auto/sql/models/qsqlrelationaldelegate/tst_qsqlrelationaldelegate.cpp
+++ b/tests/auto/sql/models/qsqlrelationaldelegate/tst_qsqlrelationaldelegate.cpp
@@ -34,8 +34,8 @@
#include "../../kernel/qsqldatabase/tst_databases.h"
-const QString reltest1(qTableName("reltest1", __FILE__, QSqlDatabase())),
- reltest2(qTableName("reltest2", __FILE__, QSqlDatabase()));
+QString reltest1;
+QString reltest2;
class tst_QSqlRelationalDelegate : public QObject
{
@@ -45,6 +45,7 @@ public:
void recreateTestTables(QSqlDatabase);
tst_Databases dbs;
+ tst_QSqlRelationalDelegate();
public slots:
void initTestCase_data();
@@ -59,6 +60,14 @@ private:
void dropTestTables(QSqlDatabase db);
};
+tst_QSqlRelationalDelegate::tst_QSqlRelationalDelegate()
+{
+ static QSqlDatabase static_qtest_db_1 = QSqlDatabase();
+ reltest1 = qTableName("reltest1", __FILE__, static_qtest_db_1);
+
+ static QSqlDatabase static_qtest_db_2 = QSqlDatabase();
+ reltest2 = qTableName("reltest2", __FILE__, static_qtest_db_2);
+}
void tst_QSqlRelationalDelegate::initTestCase_data()
{
diff --git a/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp b/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp
index 722ef9c570..19d8430118 100644
--- a/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp
+++ b/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp
@@ -32,11 +32,11 @@
#include "../../kernel/qsqldatabase/tst_databases.h"
-const QString reltest1(qTableName("reltest1", __FILE__, QSqlDatabase())),
- reltest2(qTableName("reltest2", __FILE__, QSqlDatabase())),
- reltest3(qTableName("reltest3", __FILE__, QSqlDatabase())),
- reltest4(qTableName("reltest4", __FILE__, QSqlDatabase())),
- reltest5(qTableName("reltest5", __FILE__, QSqlDatabase()));
+QString reltest1;
+QString reltest2;
+QString reltest3;
+QString reltest4;
+QString reltest5;
class tst_QSqlRelationalTableModel : public QObject
{
@@ -44,6 +44,7 @@ class tst_QSqlRelationalTableModel : public QObject
public:
void recreateTestTables(QSqlDatabase);
+ tst_QSqlRelationalTableModel();
tst_Databases dbs;
@@ -83,6 +84,23 @@ private:
void dropTestTables( QSqlDatabase db );
};
+tst_QSqlRelationalTableModel::tst_QSqlRelationalTableModel()
+{
+ static QSqlDatabase static_qtest_db_1 = QSqlDatabase();
+ reltest1 = qTableName("reltest1", __FILE__, static_qtest_db_1);
+
+ static QSqlDatabase static_qtest_db_2 = QSqlDatabase();
+ reltest2 = qTableName("reltest2", __FILE__, static_qtest_db_2);
+
+ static QSqlDatabase static_qtest_db_3 = QSqlDatabase();
+ reltest3 = qTableName("reltest3", __FILE__, static_qtest_db_3);
+
+ static QSqlDatabase static_qtest_db_4 = QSqlDatabase();
+ reltest4 = qTableName("reltest4", __FILE__, static_qtest_db_4);
+
+ static QSqlDatabase static_qtest_db_5 = QSqlDatabase();
+ reltest5 = qTableName("reltest5", __FILE__, static_qtest_db_5);
+}
void tst_QSqlRelationalTableModel::initTestCase_data()
{
diff --git a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
index 44dd4a74cf..81dcaa0975 100644
--- a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
+++ b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
@@ -34,9 +34,9 @@
#include <QThread>
#include <QElapsedTimer>
-const QString test(qTableName("test", __FILE__, QSqlDatabase())),
- test2(qTableName("test2", __FILE__, QSqlDatabase())),
- test3(qTableName("test3", __FILE__, QSqlDatabase()));
+QString test;
+QString test2;
+QString test3;
// In order to catch when the warning message occurs, indicating that the database belongs to another
// thread, we have to install our own message handler. To ensure that the test reporting still happens
@@ -164,6 +164,15 @@ private:
tst_QSqlTableModel::tst_QSqlTableModel()
{
+ static QSqlDatabase static_qtest_db_1 = QSqlDatabase();
+ test = qTableName("test1", __FILE__, static_qtest_db_1);
+
+ static QSqlDatabase static_qtest_db_2 = QSqlDatabase();
+ test2 = qTableName("test2", __FILE__, static_qtest_db_2);
+
+ static QSqlDatabase static_qtest_db_3 = QSqlDatabase();
+ test3 = qTableName("test3", __FILE__, static_qtest_db_3);
+
QVERIFY(dbs.open());
}