diff options
author | Matt Caswell <matt@openssl.org> | 2020-01-15 18:11:04 +0000 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2020-01-20 14:48:15 +0000 |
commit | 09a4cb9ec7ea9ccb4885588ba3e138b9f5f606c7 (patch) | |
tree | e85df6eecd04e46363404545deed94e479f777a1 /crypto/rand | |
parent | 2dd04ca881414779e847a21e6be4e428257c25f1 (diff) |
Don't register drbg_delete_thread_state twice
drbg_delete_thread_state cleans up after both the public and the private
DRBG. It can be registered automtically by getting either of those DRBGs,
but it should not be registered twice.
Reviewed-by: Richard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/10862)
Diffstat (limited to 'crypto/rand')
-rw-r--r-- | crypto/rand/drbg_lib.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/crypto/rand/drbg_lib.c b/crypto/rand/drbg_lib.c index 2c9ed3fb6d..a695a5f7dd 100644 --- a/crypto/rand/drbg_lib.c +++ b/crypto/rand/drbg_lib.c @@ -1353,7 +1353,12 @@ RAND_DRBG *OPENSSL_CTX_get0_public_drbg(OPENSSL_CTX *ctx) drbg = CRYPTO_THREAD_get_local(&dgbl->public_drbg); if (drbg == NULL) { ctx = openssl_ctx_get_concrete(ctx); - if (!ossl_init_thread_start(NULL, ctx, drbg_delete_thread_state)) + /* + * If the private_drbg is also NULL then this is the first time we've + * used this thread. + */ + if (CRYPTO_THREAD_get_local(&dgbl->private_drbg) == NULL + && !ossl_init_thread_start(NULL, ctx, drbg_delete_thread_state)) return NULL; drbg = drbg_setup(ctx, dgbl->master_drbg, RAND_DRBG_TYPE_PUBLIC); CRYPTO_THREAD_set_local(&dgbl->public_drbg, drbg); @@ -1381,7 +1386,12 @@ RAND_DRBG *OPENSSL_CTX_get0_private_drbg(OPENSSL_CTX *ctx) drbg = CRYPTO_THREAD_get_local(&dgbl->private_drbg); if (drbg == NULL) { ctx = openssl_ctx_get_concrete(ctx); - if (!ossl_init_thread_start(NULL, ctx, drbg_delete_thread_state)) + /* + * If the public_drbg is also NULL then this is the first time we've + * used this thread. + */ + if (CRYPTO_THREAD_get_local(&dgbl->public_drbg) == NULL + && !ossl_init_thread_start(NULL, ctx, drbg_delete_thread_state)) return NULL; drbg = drbg_setup(ctx, dgbl->master_drbg, RAND_DRBG_TYPE_PRIVATE); CRYPTO_THREAD_set_local(&dgbl->private_drbg, drbg); |