summaryrefslogtreecommitdiffstats
path: root/src/network/ssl/qsslsocket_openssl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/ssl/qsslsocket_openssl.cpp')
-rw-r--r--src/network/ssl/qsslsocket_openssl.cpp42
1 files changed, 20 insertions, 22 deletions
diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp
index b602b29..d7088ee 100644
--- a/src/network/ssl/qsslsocket_openssl.cpp
+++ b/src/network/ssl/qsslsocket_openssl.cpp
@@ -74,9 +74,8 @@
QT_BEGIN_NAMESPACE
-bool QSslSocketPrivate::s_initialized = false;
-QBasicAtomicInt QSslSocketPrivate::s_CertsAndCiphersLoaded;
-Q_GLOBAL_STATIC(QMutex, s_CertsAndCiphersLoadedMutex);
+bool QSslSocketPrivate::s_libraryLoaded = false;
+bool QSslSocketPrivate::s_loadedCiphersAndCerts = false;
// Useful defines
#define SSL_ERRORSTR() QString::fromLocal8Bit(q_ERR_error_string(q_ERR_get_error(), NULL))
@@ -171,7 +170,7 @@ QSslSocketBackendPrivate::QSslSocketBackendPrivate()
session(0)
{
// Calls SSL_library_init().
- ensureCertsAndCiphersLoaded();
+ ensureInitialized();
}
QSslSocketBackendPrivate::~QSslSocketBackendPrivate()
@@ -422,18 +421,18 @@ void QSslSocketPrivate::deinitialize()
bool QSslSocketPrivate::supportsSsl()
{
- return ensureInitialized();
+ return ensureLibraryLoaded();
}
-bool QSslSocketPrivate::ensureInitialized()
+bool QSslSocketPrivate::ensureLibraryLoaded()
{
if (!q_resolveOpenSslSymbols())
return false;
// Check if the library itself needs to be initialized.
QMutexLocker locker(openssl_locks()->initLock());
- if (!s_initialized) {
- s_initialized = true;
+ if (!s_libraryLoaded) {
+ s_libraryLoaded = true;
// Initialize OpenSSL.
q_CRYPTO_set_id_callback(id_function);
@@ -474,6 +473,16 @@ bool QSslSocketPrivate::ensureInitialized()
return true;
}
+void QSslSocketPrivate::ensureCiphersAndCertsLoaded()
+{
+ if (s_loadedCiphersAndCerts)
+ return;
+ s_loadedCiphersAndCerts = true;
+
+ resetDefaultCiphers();
+ setDefaultCaCertificates(systemCaCertificates());
+}
+
/*!
\internal
@@ -481,18 +490,13 @@ bool QSslSocketPrivate::ensureInitialized()
been initialized.
*/
-void QSslSocketPrivate::ensureCertsAndCiphersLoaded()
+void QSslSocketPrivate::ensureInitialized()
{
- // use double-checked locking to speed up this function
- if (s_CertsAndCiphersLoaded)
+ if (!supportsSsl())
return;
- QMutexLocker locker(s_CertsAndCiphersLoadedMutex());
- if (s_CertsAndCiphersLoaded)
- return;
+ ensureCiphersAndCertsLoaded();
- if (!supportsSsl())
- return;
//load symbols needed to receive certificates from system store
#if defined(Q_OS_MAC)
QLibrary securityLib("/System/Library/Frameworks/Security.framework/Versions/Current/Security");
@@ -528,12 +532,6 @@ void QSslSocketPrivate::ensureCertsAndCiphersLoaded()
qWarning("could not load crypt32 library"); // should never happen
}
#endif
- resetDefaultCiphers();
- setDefaultCaCertificates(systemCaCertificates());
- // we need to make sure that s_CertsAndCiphersLoaded is executed after the library loading above
- // (the compiler/processor might reorder instructions otherwise)
- if (!s_CertsAndCiphersLoaded.testAndSetRelease(0, 1))
- Q_ASSERT_X(false, "certificate store", "certificate store has already been initialized!");
}
/*!