Skip to content

Commit

Permalink
Disconnect any leftover connections when destroying auth manager
Browse files Browse the repository at this point in the history
If one of these connections is triggered after destruction of auth manager, bad things happen because the slot tries to access the mutex which has gone for good along with the auth manager itself.
  • Loading branch information
m-kuhn committed Mar 3, 2019
1 parent 82d7df3 commit 3988a93
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
15 changes: 13 additions & 2 deletions src/core/auth/qgsauthmanager.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -140,12 +140,14 @@ QSqlDatabase QgsAuthManager::authDatabaseConnection() const
// triggers a condition in QSqlDatabase which detects the nullptr private thread data and returns an invalid database instead. // triggers a condition in QSqlDatabase which detects the nullptr private thread data and returns an invalid database instead.
// QSqlDatabase::removeDatabase is thread safe, so this is ok to do. // QSqlDatabase::removeDatabase is thread safe, so this is ok to do.
// Right about now is a good time to re-evaluate your selected career ;) // Right about now is a good time to re-evaluate your selected career ;)
connect( QThread::currentThread(), &QThread::finished, QThread::currentThread(), [connectionName, this ] QMetaObject::Connection connection = connect( QThread::currentThread(), &QThread::finished, QThread::currentThread(), [connectionName, this ]
{ {
QMutexLocker locker( mMutex ); QMutexLocker locker( mMutex );
QgsDebugMsgLevel( QStringLiteral( "Removing outdated connection to %1 on thread exit" ).arg( connectionName ), 2 );
QSqlDatabase::removeDatabase( connectionName ); QSqlDatabase::removeDatabase( connectionName );
mConnectedThreads.remove( QThread::currentThread() );
}, Qt::DirectConnection ); }, Qt::DirectConnection );

mConnectedThreads.insert( QThread::currentThread(), connection );
} }
} }
else else
Expand Down Expand Up @@ -2961,6 +2963,15 @@ void QgsAuthManager::tryToStartDbErase()


QgsAuthManager::~QgsAuthManager() QgsAuthManager::~QgsAuthManager()
{ {
QMutexLocker locker( mMutex );
QMapIterator<QThread *, QMetaObject::Connection> iterator( mConnectedThreads );
while ( iterator.hasNext() )
{
iterator.next();
iterator.key()->disconnect( iterator.value() );
}
locker.unlock();

if ( !isDisabled() ) if ( !isDisabled() )
{ {
delete QgsAuthMethodRegistry::instance(); delete QgsAuthMethodRegistry::instance();
Expand Down
2 changes: 2 additions & 0 deletions src/core/auth/qgsauthmanager.h
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -900,6 +900,8 @@ class CORE_EXPORT QgsAuthManager : public QObject
//! password helper folder in the wallets //! password helper folder in the wallets
static const QLatin1String AUTH_PASSWORD_HELPER_FOLDER_NAME; static const QLatin1String AUTH_PASSWORD_HELPER_FOLDER_NAME;


mutable QMap<QThread *, QMetaObject::Connection> mConnectedThreads;

friend class QgsApplication; friend class QgsApplication;


}; };
Expand Down

0 comments on commit 3988a93

Please sign in to comment.