summaryrefslogtreecommitdiff
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
parentfb7a7f099ecbabbf65c42856ec9fb9d898b15907 (diff)
downloadopenssl-new-07f9c81d20f2c972dd454e2343634586d3aa88a1.tar.gz
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)
-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);