]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
provider_core: sort provider stack on find
authorPauli <pauli@openssl.org>
Thu, 27 Apr 2023 00:57:12 +0000 (10:57 +1000)
committerPauli <pauli@openssl.org>
Mon, 1 May 2023 07:14:42 +0000 (17:14 +1000)
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)

crypto/provider_core.c

index 246667ecb218c2527538e3ec3f09da05f503b957..60a1efedfbeb4e3f57245c3918a0365f4feeecbf 100644 (file)
@@ -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);