Skip to content
Permalink
Browse files

Disconnect any leftover connections when destroying auth manager

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 09cbc82 commit 24d93f547b551898d9af6439ab6c6dbea7514a6a
Showing with 15 additions and 2 deletions.
  1. +13 −2 src/core/auth/qgsauthmanager.cpp
  2. +2 −0 src/core/auth/qgsauthmanager.h
@@ -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.
// QSqlDatabase::removeDatabase is thread safe, so this is ok to do.
// 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 );
QgsDebugMsgLevel( QStringLiteral( "Removing outdated connection to %1 on thread exit" ).arg( connectionName ), 2 );
QSqlDatabase::removeDatabase( connectionName );
mConnectedThreads.remove( QThread::currentThread() );
}, Qt::DirectConnection );

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

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() )
{
delete QgsAuthMethodRegistry::instance();
@@ -900,6 +900,8 @@ class CORE_EXPORT QgsAuthManager : public QObject
//! password helper folder in the wallets
static const QLatin1String AUTH_PASSWORD_HELPER_FOLDER_NAME;

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

friend class QgsApplication;

};

0 comments on commit 24d93f5

Please sign in to comment.
You can’t perform that action at this time.