Fix OpenSSLInitialized thread safety (#1739) (#1740)

* Fix OpenSSLInitialized thread safety (#1739)

The init/uninit methods can be called from multiple threads, and thus need synchronization with a mutex.

* Renamed mutex variable and use ScopedLock.

* Change reference count variable to be an integer, since it’s protected by a mutex and no longer needs to be atomic.
This commit is contained in:
David Hedbor
2017-07-18 06:57:58 -07:00
committed by Aleksandar Fabijanic
parent b59d74cfb5
commit 40324cdcc0
2 changed files with 6 additions and 3 deletions

View File

@@ -84,8 +84,9 @@ protected:
static void dynlockDestroy(struct CRYPTO_dynlock_value* lock, const char* file, int line); static void dynlockDestroy(struct CRYPTO_dynlock_value* lock, const char* file, int line);
private: private:
static Poco::FastMutex _mutex;
static Poco::FastMutex* _mutexes; static Poco::FastMutex* _mutexes;
static Poco::AtomicCounter _rc; static int _rc;
static bool _disableSSLInitialization; static bool _disableSSLInitialization;
}; };

View File

@@ -33,9 +33,9 @@ using Poco::Thread;
namespace Poco { namespace Poco {
namespace Crypto { namespace Crypto {
Poco::FastMutex OpenSSLInitializer::_mutex;
Poco::FastMutex* OpenSSLInitializer::_mutexes(0); Poco::FastMutex* OpenSSLInitializer::_mutexes(0);
Poco::AtomicCounter OpenSSLInitializer::_rc; int OpenSSLInitializer::_rc(0);
bool OpenSSLInitializer::_disableSSLInitialization = false; bool OpenSSLInitializer::_disableSSLInitialization = false;
OpenSSLInitializer::OpenSSLInitializer() OpenSSLInitializer::OpenSSLInitializer()
@@ -59,6 +59,7 @@ OpenSSLInitializer::~OpenSSLInitializer()
void OpenSSLInitializer::initialize() void OpenSSLInitializer::initialize()
{ {
FastMutex::ScopedLock lock(_mutex);
if (++_rc == 1) if (++_rc == 1)
{ {
#if OPENSSL_VERSION_NUMBER >= 0x0907000L #if OPENSSL_VERSION_NUMBER >= 0x0907000L
@@ -104,6 +105,7 @@ void OpenSSLInitializer::initialize()
void OpenSSLInitializer::uninitialize() void OpenSSLInitializer::uninitialize()
{ {
FastMutex::ScopedLock lock(_mutex);
if (--_rc == 0) if (--_rc == 0)
{ {
if(_mutexes != NULL) { if(_mutexes != NULL) {