diff options
author | Pauli <pauli@openssl.org> | 2023-04-27 10:57:12 +1000 |
---|---|---|
committer | Pauli <pauli@openssl.org> | 2023-05-01 17:14:42 +1000 |
commit | 07f9c81d20f2c972dd454e2343634586d3aa88a1 (patch) | |
tree | eb894baabe9a1a6160cfbac94ab4c8cb244207f8 /crypto/provider_core.c | |
parent | fb7a7f099ecbabbf65c42856ec9fb9d898b15907 (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.c | 5 |
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); |