From 81fa8d5947467456bdaf2a2f81acd0892924a8e4 Mon Sep 17 00:00:00 2001 From: w15dev Date: Wed, 29 Jan 2025 02:23:15 +0300 Subject: [PATCH] Refactor YubiKey key to avoid deadlock - Add mutex to get m_connectedKeys - Fix deadlock when the app uses Quick Unlock and the YubiKey is unplugged --- src/keys/drivers/YubiKey.cpp | 16 +++++++++++++--- src/keys/drivers/YubiKey.h | 2 ++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/keys/drivers/YubiKey.cpp b/src/keys/drivers/YubiKey.cpp index 8d726727e8..c07bcc072a 100644 --- a/src/keys/drivers/YubiKey.cpp +++ b/src/keys/drivers/YubiKey.cpp @@ -75,11 +75,19 @@ bool YubiKey::findValidKeys() { QMutexLocker lock(&s_interfaceMutex); + findValidKeys(lock); + + return !m_usbKeys.isEmpty() || !m_pcscKeys.isEmpty(); +} + +void YubiKey::findValidKeys(const QMutexLocker& locker) +{ + // Check QMutexLocker since version 6.4 + Q_UNUSED(locker); + m_connectedKeys = 0; m_usbKeys = YubiKeyInterfaceUSB::instance()->findValidKeys(m_connectedKeys); m_pcscKeys = YubiKeyInterfacePCSC::instance()->findValidKeys(m_connectedKeys); - - return !m_usbKeys.isEmpty() || !m_pcscKeys.isEmpty(); } void YubiKey::findValidKeysAsync() @@ -98,6 +106,8 @@ YubiKey::KeyMap YubiKey::foundKeys() int YubiKey::connectedKeys() { + QMutexLocker lock(&s_interfaceMutex); + return m_connectedKeys; } @@ -171,7 +181,7 @@ YubiKey::challenge(YubiKeySlot slot, const QByteArray& challenge, Botan::secure_ // Make sure we tried to find available keys if (m_usbKeys.isEmpty() && m_pcscKeys.isEmpty()) { - findValidKeys(); + findValidKeys(lock); } if (m_usbKeys.contains(slot)) { diff --git a/src/keys/drivers/YubiKey.h b/src/keys/drivers/YubiKey.h index a36f8c30f7..5578fd8df8 100644 --- a/src/keys/drivers/YubiKey.h +++ b/src/keys/drivers/YubiKey.h @@ -84,6 +84,8 @@ class YubiKey : public QObject private: explicit YubiKey(); + void findValidKeys(const QMutexLocker& locker); + static YubiKey* m_instance; QTimer m_interactionTimer;