]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
Avoid taking a write lock in RAND_get_rand_method()
authorMatt Caswell <matt@openssl.org>
Wed, 10 May 2023 13:44:17 +0000 (14:44 +0100)
committerMatt Caswell <matt@openssl.org>
Tue, 30 May 2023 16:19:11 +0000 (17:19 +0100)
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 <hlandau@openssl.org>
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/20929)

crypto/rand/rand_lib.c

index 0cdb9caa6ddc56e2dc950c675a6205a3e63830df..9b1b5999cf0499bdcd3bd435e35c386a4832c225 100644 (file)
@@ -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) {