From 16f994e7944a917fa81c8db11c56c594f4e78b40 Mon Sep 17 00:00:00 2001 From: Alexander Bokovoy Date: Tue, 31 Jul 2018 14:59:03 +0300 Subject: [PATCH] Reset mutex callbacks to the default version when finished If a PKCS11 API caller provided own mutex handling callbacks, we need to ensure they aren't used after C_Finalize is called and SoftHSM instance is recycled. Inability to do so may lead to a situation where callbacks might be provided by a different dynamically loaded object which is removed after C_Finalize() call. Thus, callback pointers become invalid and calling them leads to crashes. Fixes: https://github.com/opendnssec/SoftHSMv2/issues/408 Signed-off-by: Alexander Bokovoy --- src/lib/SoftHSM.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/lib/SoftHSM.cpp b/src/lib/SoftHSM.cpp index ee94d3f..e4cc044 100644 --- a/src/lib/SoftHSM.cpp +++ b/src/lib/SoftHSM.cpp @@ -314,6 +314,15 @@ static CK_ATTRIBUTE bsAttribute(CK_ATTRIBUTE_TYPE type, const ByteString &value) /***************************************************************************** Implementation of SoftHSM class specific functions *****************************************************************************/ +static void resetMutexFactoryCallbacks() +{ + // Reset MutexFactory callbacks to our versions + MutexFactory::i()->setCreateMutex(OSCreateMutex); + MutexFactory::i()->setDestroyMutex(OSDestroyMutex); + MutexFactory::i()->setLockMutex(OSLockMutex); + MutexFactory::i()->setUnlockMutex(OSUnlockMutex); +} + // Return the one-and-only instance SoftHSM* SoftHSM::i() @@ -342,6 +351,7 @@ SoftHSM::SoftHSM() slotManager = NULL; sessionManager = NULL; handleManager = NULL; + resetMutexFactoryCallbacks(); } // Destructor @@ -352,6 +362,7 @@ SoftHSM::~SoftHSM() if (slotManager != NULL) delete slotManager; if (objectStore != NULL) delete objectStore; if (sessionObjectStore != NULL) delete sessionObjectStore; + resetMutexFactoryCallbacks(); } /***************************************************************************** @@ -402,10 +413,7 @@ CK_RV SoftHSM::C_Initialize(CK_VOID_PTR pInitArgs) if (args->flags & CKF_OS_LOCKING_OK) { // Use our own mutex functions. - MutexFactory::i()->setCreateMutex(OSCreateMutex); - MutexFactory::i()->setDestroyMutex(OSDestroyMutex); - MutexFactory::i()->setLockMutex(OSLockMutex); - MutexFactory::i()->setUnlockMutex(OSUnlockMutex); + resetMutexFactoryCallbacks(); MutexFactory::i()->enable(); } else -- 2.17.1