]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
Restore use of crypto_thread_default_context
authorNeil Horman <nhorman@openssl.org>
Wed, 18 Jun 2025 11:33:47 +0000 (07:33 -0400)
committerNeil Horman <nhorman@openssl.org>
Fri, 20 Jun 2025 17:01:39 +0000 (13:01 -0400)
This thread-local key isn't per thread*context, and is potentially in a
hot path for users of openssl that switch their default contexts
regularly, so lets leave it as an OS level key, rather than a library
managed key.

Reviewed-by: Saša Nedvědický <sashan@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/27794)

crypto/context.c
include/internal/threads_common.h

index 32f80cf5220bbb5a11284d97bf61c8438a5a5cb1..80a87562cd86930b53c5b81aee9a0085c902ae99 100644 (file)
@@ -378,15 +378,24 @@ static int context_deinit(OSSL_LIB_CTX *ctx)
 static OSSL_LIB_CTX default_context_int;
 
 static CRYPTO_ONCE default_context_init = CRYPTO_ONCE_STATIC_INIT;
+static CRYPTO_THREAD_LOCAL default_context_thread_local;
 static int default_context_inited = 0;
 
 DEFINE_RUN_ONCE_STATIC(default_context_do_init)
 {
+    if (!CRYPTO_THREAD_init_local(&default_context_thread_local, NULL))
+        goto err;
+
     if (!context_init(&default_context_int))
-        return 0;
+        goto deinit_thread;
 
     default_context_inited = 1;
     return 1;
+
+deinit_thread:
+    CRYPTO_THREAD_cleanup_local(&default_context_thread_local);
+err:
+    return 0;
 }
 
 void ossl_lib_ctx_default_deinit(void)
@@ -394,6 +403,7 @@ void ossl_lib_ctx_default_deinit(void)
     if (!default_context_inited)
         return;
     context_deinit(&default_context_int);
+    CRYPTO_THREAD_cleanup_local(&default_context_thread_local);
     default_context_inited = 0;
 }
 
@@ -402,8 +412,7 @@ static OSSL_LIB_CTX *get_thread_default_context(void)
     if (!RUN_ONCE(&default_context_init, default_context_do_init))
         return NULL;
 
-    return CRYPTO_THREAD_get_local_ex(CRYPTO_THREAD_LOCAL_DEF_CTX_KEY,
-                                      CRYPTO_THREAD_NO_CONTEXT);
+    return CRYPTO_THREAD_get_local(&default_context_thread_local);
 }
 
 static OSSL_LIB_CTX *get_default_context(void)
@@ -420,8 +429,7 @@ static int set_default_context(OSSL_LIB_CTX *defctx)
     if (defctx == &default_context_int)
         defctx = NULL;
 
-    return CRYPTO_THREAD_set_local_ex(CRYPTO_THREAD_LOCAL_DEF_CTX_KEY,
-                                      CRYPTO_THREAD_NO_CONTEXT, defctx);
+    return CRYPTO_THREAD_set_local(&default_context_thread_local, defctx);
 }
 #endif
 
index 4b949fe956c2d42e075e68cd32251eba03d72527..5992d65add260a1aa01a7596f265280ab136e4e5 100644 (file)
@@ -14,7 +14,6 @@ typedef enum {
     CRYPTO_THREAD_LOCAL_RCU_KEY = 0,
     CRYPTO_THREAD_LOCAL_DRBG_PRIV_KEY,
     CRYPTO_THREAD_LOCAL_DRBG_PUB_KEY,
-    CRYPTO_THREAD_LOCAL_DEF_CTX_KEY,
     CRYPTO_THREAD_LOCAL_ERR_KEY,
     CRYPTO_THREAD_LOCAL_ASYNC_CTX_KEY,
     CRYPTO_THREAD_LOCAL_ASYNC_POOL_KEY,