mirror of https://github.com/Icinga/icinga2.git
Merge pull request #6324 from Icinga/fix/6279-api-user-crash
Ensure that password hash generation from OpenSSL is atomic
This commit is contained in:
commit
653a2b4e7d
|
@ -31,6 +31,7 @@ namespace icinga
|
||||||
|
|
||||||
static bool l_SSLInitialized = false;
|
static bool l_SSLInitialized = false;
|
||||||
static boost::mutex *l_Mutexes;
|
static boost::mutex *l_Mutexes;
|
||||||
|
static boost::mutex l_RandomMutex;
|
||||||
|
|
||||||
#ifdef CRYPTO_LOCK
|
#ifdef CRYPTO_LOCK
|
||||||
static void OpenSSLLockingCallback(int mode, int type, const char *, int)
|
static void OpenSSLLockingCallback(int mode, int type, const char *, int)
|
||||||
|
@ -718,6 +719,11 @@ String RandomString(int length)
|
||||||
{
|
{
|
||||||
auto *bytes = new unsigned char[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)) {
|
if (!RAND_bytes(bytes, length)) {
|
||||||
delete [] bytes;
|
delete [] bytes;
|
||||||
|
|
||||||
|
@ -730,6 +736,8 @@ String RandomString(int length)
|
||||||
<< errinfo_openssl_error(ERR_peek_error()));
|
<< errinfo_openssl_error(ERR_peek_error()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lock.unlock();
|
||||||
|
|
||||||
auto *output = new char[length * 2 + 1];
|
auto *output = new char[length * 2 + 1];
|
||||||
for (int i = 0; i < length; i++)
|
for (int i = 0; i < length; i++)
|
||||||
sprintf(output + 2 * i, "%02x", bytes[i]);
|
sprintf(output + 2 * i, "%02x", bytes[i]);
|
||||||
|
|
Loading…
Reference in New Issue