From fb55e1e71e3c98aca880c23d97f9e811e2b406a0 Mon Sep 17 00:00:00 2001 From: Alexandru Croitor Date: Tue, 30 Jun 2020 18:49:57 +0200 Subject: 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 --- tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp | 4 +++- .../auto/sql/kernel/qsqlthread/tst_qsqlthread.cpp | 4 +++- tests/auto/sql/models/CMakeLists.txt | 4 +++- .../tst_qsqlrelationaldelegate.cpp | 13 ++++++++-- .../tst_qsqlrelationaltablemodel.cpp | 28 ++++++++++++++++++---- .../models/qsqltablemodel/tst_qsqltablemodel.cpp | 15 +++++++++--- 6 files changed, 55 insertions(+), 13 deletions(-) (limited to 'tests/auto/sql') 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 #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 #include -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()); } -- cgit v1.2.3