From 09a4cb9ec7ea9ccb4885588ba3e138b9f5f606c7 Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Wed, 15 Jan 2020 18:11:04 +0000 Subject: [PATCH] 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 (Merged from https://github.com/openssl/openssl/pull/10862) --- crypto/rand/drbg_lib.c | 14 ++++++++++++-- 1 file 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); -- 2.25.1