Fix issues with do_rand_init/rand_cleanup_int

Fixes #7022

Reviewed-by: Paul Dale <paul.dale@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/7588)
This commit is contained in:
Bernd Edlinger 2018-11-07 21:53:30 +01:00
parent e9994901f8
commit e2d227bb4a

View file

@ -31,7 +31,7 @@ int rand_fork_count;
static CRYPTO_RWLOCK *rand_nonce_lock; static CRYPTO_RWLOCK *rand_nonce_lock;
static int rand_nonce_count; static int rand_nonce_count;
static int rand_cleaning_up = 0; static int rand_inited = 0;
#ifdef OPENSSL_RAND_SEED_RDTSC #ifdef OPENSSL_RAND_SEED_RDTSC
/* /*
@ -319,13 +319,15 @@ DEFINE_RUN_ONCE_STATIC(do_rand_init)
if (rand_nonce_lock == NULL) if (rand_nonce_lock == NULL)
goto err2; goto err2;
if (!rand_cleaning_up && !rand_pool_init()) if (!rand_pool_init())
goto err3; goto err3;
rand_inited = 1;
return 1; return 1;
err3: err3:
rand_pool_cleanup(); CRYPTO_THREAD_lock_free(rand_nonce_lock);
rand_nonce_lock = NULL;
err2: err2:
CRYPTO_THREAD_lock_free(rand_meth_lock); CRYPTO_THREAD_lock_free(rand_meth_lock);
rand_meth_lock = NULL; rand_meth_lock = NULL;
@ -341,7 +343,8 @@ void rand_cleanup_int(void)
{ {
const RAND_METHOD *meth = default_RAND_meth; const RAND_METHOD *meth = default_RAND_meth;
rand_cleaning_up = 1; if (!rand_inited)
return;
if (meth != NULL && meth->cleanup != NULL) if (meth != NULL && meth->cleanup != NULL)
meth->cleanup(); meth->cleanup();
@ -355,6 +358,7 @@ void rand_cleanup_int(void)
rand_meth_lock = NULL; rand_meth_lock = NULL;
CRYPTO_THREAD_lock_free(rand_nonce_lock); CRYPTO_THREAD_lock_free(rand_nonce_lock);
rand_nonce_lock = NULL; rand_nonce_lock = NULL;
rand_inited = 0;
} }
/* /*