static bool l_SSLInitialized = false;
static boost::mutex *l_Mutexes;
+static boost::mutex l_RandomMutex;
#ifdef CRYPTO_LOCK
static void OpenSSLLockingCallback(int mode, int type, const char *, int)
{
auto *bytes = new unsigned char[length];
+ /* Ensure that password generation is atomic. RAND_bytes is not thread-safe
+ * in OpenSSL < 1.1.0.
+ */
+ boost::mutex::scoped_lock lock(l_RandomMutex);
+
if (!RAND_bytes(bytes, length)) {
delete [] bytes;
<< errinfo_openssl_error(ERR_peek_error()));
}
+ lock.unlock();
+
auto *output = new char[length * 2 + 1];
for (int i = 0; i < length; i++)
sprintf(output + 2 * i, "%02x", bytes[i]);