summaryrefslogtreecommitdiffstats
path: root/crypto/provider_core.c
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2021-06-21 11:34:04 +0100
committerMatt Caswell <matt@openssl.org>2021-06-24 14:48:14 +0100
commiteb2263da9abf3676cbcac672eee8a26416a8c309 (patch)
treedeaa7046d31cd09982f119e39ff4a20dbd047891 /crypto/provider_core.c
parentd5fbd5b4eda592fd43e8688f69f3bac4ca5dd2da (diff)
Set use_fallbacks to zero when we add a provider to the store
Update use_fallbacks to zero when we add a provider to the store rather than when we activate it. Its only at the point that we add it to the store that it is actually usable and visible to other threads. Reviewed-by: Paul Dale <pauli@openssl.org> Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from https://github.com/openssl/openssl/pull/15854)
Diffstat (limited to 'crypto/provider_core.c')
-rw-r--r--crypto/provider_core.c25
1 files changed, 8 insertions, 17 deletions
diff --git a/crypto/provider_core.c b/crypto/provider_core.c
index 62fab92028..83c6bf28f0 100644
--- a/crypto/provider_core.c
+++ b/crypto/provider_core.c
@@ -431,7 +431,7 @@ int ossl_provider_up_ref(OSSL_PROVIDER *prov)
static int provider_up_ref_intern(OSSL_PROVIDER *prov, int activate)
{
if (activate)
- return ossl_provider_activate(prov, 0, 1);
+ return ossl_provider_activate(prov, 1);
return ossl_provider_up_ref(prov);
}
@@ -512,7 +512,7 @@ OSSL_PROVIDER *ossl_provider_new(OSSL_LIB_CTX *libctx, const char *name,
return prov;
}
-int ossl_provider_add_to_store(OSSL_PROVIDER *prov)
+int ossl_provider_add_to_store(OSSL_PROVIDER *prov, int retain_fallbacks)
{
struct provider_store_st *store = NULL;
int ret = 1;
@@ -530,6 +530,8 @@ int ossl_provider_add_to_store(OSSL_PROVIDER *prov)
ossl_provider_free(prov);
ret = 0;
}
+ if (!retain_fallbacks)
+ store->use_fallbacks = 0;
CRYPTO_THREAD_unlock(store->lock);
return ret;
@@ -1025,24 +1027,15 @@ static int provider_flush_store_cache(const OSSL_PROVIDER *prov)
return 1;
}
-int ossl_provider_activate(OSSL_PROVIDER *prov, int retain_fallbacks,
- int upcalls)
+int ossl_provider_activate(OSSL_PROVIDER *prov, int upcalls)
{
int count;
if (prov == NULL)
return 0;
- if ((count = provider_activate(prov, 1, upcalls)) > 0) {
- if (!retain_fallbacks) {
- if (!CRYPTO_THREAD_write_lock(prov->store->lock)) {
- provider_deactivate(prov);
- return 0;
- }
- prov->store->use_fallbacks = 0;
- CRYPTO_THREAD_unlock(prov->store->lock);
- }
+ if ((count = provider_activate(prov, 1, upcalls)) > 0)
return count == 1 ? provider_flush_store_cache(prov) : 1;
- }
+
return 0;
}
@@ -1485,10 +1478,8 @@ int ossl_provider_activate_child(OSSL_PROVIDER *prov,
* The provider could be in one of two states: (1) Already a child,
* (2) Not a child (not eligible to be one).
*/
- if (prov->ischild && provider_activate(prov, 0, 0)) {
+ if (prov->ischild && provider_activate(prov, 0, 0))
flush = 1;
- prov->store->use_fallbacks = 0;
- }
CRYPTO_THREAD_unlock(prov->flag_lock);
CRYPTO_THREAD_unlock(prov->store->lock);