diff options
Diffstat (limited to 'crypto/rand/md_rand.c')
-rw-r--r-- | crypto/rand/md_rand.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/crypto/rand/md_rand.c b/crypto/rand/md_rand.c index 9d39831cf2..7924478e9e 100644 --- a/crypto/rand/md_rand.c +++ b/crypto/rand/md_rand.c @@ -27,6 +27,8 @@ #include <openssl/err.h> +#include <internal/thread_once.h> + #ifdef OPENSSL_FIPS # include <openssl/fips.h> #endif @@ -85,10 +87,11 @@ static RAND_METHOD rand_meth = { rand_status }; -static void do_rand_lock_init(void) +DEFINE_RUN_ONCE_STATIC(do_rand_lock_init) { rand_lock = CRYPTO_THREAD_lock_new(); rand_tmp_lock = CRYPTO_THREAD_lock_new(); + return rand_lock != NULL && rand_tmp_lock != NULL; } RAND_METHOD *RAND_OpenSSL(void) @@ -141,7 +144,8 @@ static int rand_add(const void *buf, int num, double add) if (m == NULL) goto err; - CRYPTO_THREAD_run_once(&rand_lock_init, do_rand_lock_init); + if (!RUN_ONCE(&rand_lock_init, do_rand_lock_init)) + goto err; /* check if we already have the lock */ if (crypto_lock_rand) { @@ -339,7 +343,9 @@ static int rand_bytes(unsigned char *buf, int num, int pseudo) * global 'md'. */ - CRYPTO_THREAD_run_once(&rand_lock_init, do_rand_lock_init); + if (!RUN_ONCE(&rand_lock_init, do_rand_lock_init)) + goto err_mem; + CRYPTO_THREAD_write_lock(rand_lock); /* * We could end up in an async engine while holding this lock so ensure @@ -534,7 +540,9 @@ static int rand_status(void) int ret; int do_not_lock; - CRYPTO_THREAD_run_once(&rand_lock_init, do_rand_lock_init); + if (!RUN_ONCE(&rand_lock_init, do_rand_lock_init)) + return 0; + cur = CRYPTO_THREAD_get_current_id(); /* * check if we already have the lock (could happen if a RAND_poll() |