From: Jean Flach Date: Tue, 22 May 2018 13:01:15 +0000 (+0200) Subject: Ensure that password hash generation from OpenSSL is atomic X-Git-Tag: v2.9.0~49^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=refs%2Fpull%2F6324%2Fhead;p=icinga2 Ensure that password hash generation from OpenSSL is atomic This is supposed to solve a problem with segfaults caused by race conditions withing the random byte generation of OpenSSL. fixes #6279 --- diff --git a/lib/base/tlsutility.cpp b/lib/base/tlsutility.cpp index 895582c62..9b3c33fb2 100644 --- a/lib/base/tlsutility.cpp +++ b/lib/base/tlsutility.cpp @@ -31,6 +31,7 @@ namespace icinga 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) @@ -718,6 +719,11 @@ String RandomString(int length) { 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; @@ -730,6 +736,8 @@ String RandomString(int length) << 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]);