summaryrefslogtreecommitdiffstats
path: root/crypto/rand/rand_lib.c
diff options
context:
space:
mode:
authorBernd Edlinger <bernd.edlinger@hotmail.de>2018-04-28 20:35:54 +0200
committerBernd Edlinger <bernd.edlinger@hotmail.de>2018-05-01 17:33:59 +0200
commit0e5c1a66f7911352a4db3bda2293b91858b9f33c (patch)
treef7f3a78e116c5ca541be7265dbc164ca2a7ca170 /crypto/rand/rand_lib.c
parent5b748dea5dc6161d4a66d7804c580ec14e545ff7 (diff)
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/rand_lib.c')
-rw-r--r--crypto/rand/rand_lib.c27
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;
}
/*