Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-66553

PSQL driver crashes when destroying QSqlQueryModel after removing db connection

    XMLWordPrintable

Details

    • Bug
    • Resolution: Done
    • P2: Important
    • None
    • 5.11.0 Alpha
    • SQL Support
    • None
    • 5f66486cc254e1483f776d3058f96db493fd26e5

    Description

      I have a login dialog where you can select a database server and a database.
      The database can be selected via a combobox displaying a QSqlQueryModel.
      In the destructor I remove all the connections used for listing the databases and the model gets destroyed by it's parent (the dialog).

      In short something like this (for a complete example see attachment):

      QSqlQueryModel *model = new QSqlQueryModel(this);
      fillModel(model, sServerKey);
      //model->clear(); // this prevents the crash
      QSqlDatabase::removeDatabase(sServerKey);
      // parent deletes model -> crash
      

      When the model gets deleted the program crashes in QPSQLResult::cleanup() while executing d->drv_d_func()->finishQuery(d->stmtId); because d->drv_d_func() returns a nullptr.

      #0 in QPSQLDriverPrivate::finishQuery(int) src/plugins/sqldrivers/psql/qsql_psql.cpp:282:48
      #1 in QPSQLResult::cleanup() src/plugins/sqldrivers/psql/qsql_psql.cpp:487:26
      #2 in QPSQLResult::~QPSQLResult() src/plugins/sqldrivers/psql/qsql_psql.cpp:466:5
      #3 in QPSQLResult::~QPSQLResult() src/plugins/sqldrivers/psql/qsql_psql.cpp:464:1
      #4 in QSqlQueryPrivate::~QSqlQueryPrivate() src/sql/kernel/qsqlquery.cpp:94:5
      #5 in QSqlQuery::~QSqlQuery() src/sql/kernel/qsqlquery.cpp:245:9
      #6 in QSqlQueryModelPrivate::~QSqlQueryModelPrivate() src/sql/models/qsqlquerymodel.cpp:88:1
      #7 in QSqlQueryModelPrivate::~QSqlQueryModelPrivate() src/sql/models/qsqlquerymodel.cpp:87:1
      #8 in QScopedPointerDeleter<QObjectData>::cleanup(QObjectData*) src/corelib/tools/qscopedpointer.h:60:9
      #9 in QScopedPointer<QObjectData, QScopedPointerDeleter<QObjectData> >::~QScopedPointer() src/corelib/tools/qscopedpointer.h:107:9
      #10 in QObject::~QObject() src/corelib/kernel/qobject.cpp:1033:1
      #11 in QAbstractItemModel::~QAbstractItemModel() src/corelib/itemmodels/qabstractitemmodel.cpp:1555:1
      #12 in QAbstractTableModel::~QAbstractTableModel() src/corelib/itemmodels/qabstractitemmodel.cpp:3573:1
      #13 in QSqlQueryModel::~QSqlQueryModel() src/sql/models/qsqlquerymodel.cpp:173:1
      #14 in QSqlQueryModel::~QSqlQueryModel() src/sql/models/qsqlquerymodel.cpp:172:1
      #15 in main psql_crash.cpp:51:2
      

      This worked before Qt 5.11 and was likely introduced by f99d2b21b8fc867f0ed21dcbfa47865ad013db97

      Attachments

        For Gerrit Dashboard: QTBUG-66553
        # Subject Branch Project Status CR V

        Activity

          People

            mkrems Marcel Krems
            mkrems Marcel Krems
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Gerrit Reviews

                There are no open Gerrit changes