summaryrefslogtreecommitdiffstats
path: root/crypto/provider_core.c
diff options
context:
space:
mode:
authorPauli <pauli@openssl.org>2023-04-27 10:57:12 +1000
committerPauli <pauli@openssl.org>2023-05-01 17:14:42 +1000
commit07f9c81d20f2c972dd454e2343634586d3aa88a1 (patch)
treeeb894baabe9a1a6160cfbac94ab4c8cb244207f8 /crypto/provider_core.c
parentfb7a7f099ecbabbf65c42856ec9fb9d898b15907 (diff)
provider_core: sort provider stack on find
Adding all providers is quadratic time because each provider is checked for being in the stack before adding it. However, this is an improvement over the older O(n^2 log n) code where each find also sorted the stack. Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Todd Short <todd.short@me.com> (Merged from https://github.com/openssl/openssl/pull/20842)
Diffstat (limited to 'crypto/provider_core.c')
-rw-r--r--crypto/provider_core.c5
1 files changed, 1 insertions, 4 deletions
diff --git a/crypto/provider_core.c b/crypto/provider_core.c
index 246667ecb2..60a1efedfb 100644
--- a/crypto/provider_core.c
+++ b/crypto/provider_core.c
@@ -417,12 +417,9 @@ OSSL_PROVIDER *ossl_provider_find(OSSL_LIB_CTX *libctx, const char *name,
#endif
tmpl.name = (char *)name;
- /*
- * A "find" operation can sort the stack, and therefore a write lock is
- * required.
- */
if (!CRYPTO_THREAD_write_lock(store->lock))
return NULL;
+ sk_OSSL_PROVIDER_sort(store->providers);
if ((i = sk_OSSL_PROVIDER_find(store->providers, &tmpl)) != -1)
prov = sk_OSSL_PROVIDER_value(store->providers, i);
CRYPTO_THREAD_unlock(store->lock);