diff options
author | Bernd Edlinger <bernd.edlinger@hotmail.de> | 2018-04-28 20:35:54 +0200 |
---|---|---|
committer | Bernd Edlinger <bernd.edlinger@hotmail.de> | 2018-05-01 17:33:59 +0200 |
commit | 0e5c1a66f7911352a4db3bda2293b91858b9f33c (patch) | |
tree | f7f3a78e116c5ca541be7265dbc164ca2a7ca170 /crypto/rand | |
parent | 5b748dea5dc6161d4a66d7804c580ec14e545ff7 (diff) | |
download | openssl-0e5c1a66f7911352a4db3bda2293b91858b9f33c.tar.gz |
Improve error handling in rand_init function
Reviewed-by: Rich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/6124)
Diffstat (limited to 'crypto/rand')
-rw-r--r-- | crypto/rand/rand_lib.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/crypto/rand/rand_lib.c b/crypto/rand/rand_lib.c index 5ae51a16a2..8a657c559d 100644 --- a/crypto/rand/rand_lib.c +++ b/crypto/rand/rand_lib.c @@ -310,19 +310,31 @@ void rand_fork() DEFINE_RUN_ONCE_STATIC(do_rand_init) { - int ret = 1; - #ifndef OPENSSL_NO_ENGINE rand_engine_lock = CRYPTO_THREAD_lock_new(); - ret &= rand_engine_lock != NULL; + if (rand_engine_lock == NULL) + return 0; #endif + rand_meth_lock = CRYPTO_THREAD_lock_new(); - ret &= rand_meth_lock != NULL; + if (rand_meth_lock == NULL) + goto err1; rand_nonce_lock = CRYPTO_THREAD_lock_new(); - ret &= rand_meth_lock != NULL; + if (rand_nonce_lock == NULL) + goto err2; - return ret; + return 1; + +err2: + CRYPTO_THREAD_lock_free(rand_meth_lock); + rand_meth_lock = NULL; +err1: +#ifndef OPENSSL_NO_ENGINE + CRYPTO_THREAD_lock_free(rand_engine_lock); + rand_engine_lock = NULL; +#endif + return 0; } void rand_cleanup_int(void) @@ -334,9 +346,12 @@ void rand_cleanup_int(void) RAND_set_rand_method(NULL); #ifndef OPENSSL_NO_ENGINE CRYPTO_THREAD_lock_free(rand_engine_lock); + rand_engine_lock = NULL; #endif CRYPTO_THREAD_lock_free(rand_meth_lock); + rand_meth_lock = NULL; CRYPTO_THREAD_lock_free(rand_nonce_lock); + rand_nonce_lock = NULL; } /* |