From 7f2c22c1b9ec46070aa588d7f4a5ad5fe4a60bf4 Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Wed, 10 May 2023 14:44:17 +0100 Subject: Avoid taking a write lock in RAND_get_rand_method() The function RAND_get_rand_method() is called every time RAND_bytes() or RAND_priv_bytes() is called. We were obtaining a write lock in order to find the default random method - even though we rarely write. We change this to a read lock and only fallback to a write lock if we need to. Partial fix for #20286 Reviewed-by: Hugo Landau Reviewed-by: Paul Dale (Merged from https://github.com/openssl/openssl/pull/20929) --- crypto/rand/rand_lib.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'crypto/rand') diff --git a/crypto/rand/rand_lib.c b/crypto/rand/rand_lib.c index 0cdb9caa6d..9b1b5999cf 100644 --- a/crypto/rand/rand_lib.c +++ b/crypto/rand/rand_lib.c @@ -189,6 +189,13 @@ const RAND_METHOD *RAND_get_rand_method(void) if (!RUN_ONCE(&rand_init, do_rand_init)) return NULL; + if (!CRYPTO_THREAD_read_lock(rand_meth_lock)) + return NULL; + tmp_meth = default_RAND_meth; + CRYPTO_THREAD_unlock(rand_meth_lock); + if (tmp_meth != NULL) + return tmp_meth; + if (!CRYPTO_THREAD_write_lock(rand_meth_lock)) return NULL; if (default_RAND_meth == NULL) { -- cgit v1.2.3