summaryrefslogtreecommitdiffstats
path: root/crypto/provider_core.c
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2021-11-09 11:53:27 +0000
committerMatt Caswell <matt@openssl.org>2021-11-12 17:16:14 +0000
commite39bd6215123f375ddcfe92fa2b2550294da0b73 (patch)
treeee6cda641ae9d3fd6a7c83121b7218ae990dae3e /crypto/provider_core.c
parentdc6d9ede6241e6858f8fa78435d6c8eb9cf85aa1 (diff)
Don't bail out during provider deactivation if we don't have store
A provider may have been activated, but failed when being added to the store. At this point we still need to deactivate it. Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from https://github.com/openssl/openssl/pull/16980)
Diffstat (limited to 'crypto/provider_core.c')
-rw-r--r--crypto/provider_core.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/crypto/provider_core.c b/crypto/provider_core.c
index bdc1a54c65..c9dba6dd86 100644
--- a/crypto/provider_core.c
+++ b/crypto/provider_core.c
@@ -1015,17 +1015,22 @@ static int provider_deactivate(OSSL_PROVIDER *prov, int upcalls,
#ifndef FIPS_MODULE
int freeparent = 0;
#endif
+ int lock = 1;
if (!ossl_assert(prov != NULL))
return -1;
+ /*
+ * No need to lock if we've got no store because we've not been shared with
+ * other threads.
+ */
store = get_provider_store(prov->libctx);
if (store == NULL)
- return -1;
+ lock = 0;
- if (!CRYPTO_THREAD_read_lock(store->lock))
+ if (lock && !CRYPTO_THREAD_read_lock(store->lock))
return -1;
- if (!CRYPTO_THREAD_write_lock(prov->flag_lock)) {
+ if (lock && !CRYPTO_THREAD_write_lock(prov->flag_lock)) {
CRYPTO_THREAD_unlock(store->lock);
return -1;
}
@@ -1049,10 +1054,11 @@ static int provider_deactivate(OSSL_PROVIDER *prov, int upcalls,
removechildren = 0;
#endif
- CRYPTO_THREAD_unlock(prov->flag_lock);
+ if (lock)
+ CRYPTO_THREAD_unlock(prov->flag_lock);
#ifndef FIPS_MODULE
- if (removechildren) {
+ if (removechildren && store != NULL) {
int i, max = sk_OSSL_PROVIDER_CHILD_CB_num(store->child_cbs);
OSSL_PROVIDER_CHILD_CB *child_cb;
@@ -1062,7 +1068,8 @@ static int provider_deactivate(OSSL_PROVIDER *prov, int upcalls,
}
}
#endif
- CRYPTO_THREAD_unlock(store->lock);
+ if (lock)
+ CRYPTO_THREAD_unlock(store->lock);
#ifndef FIPS_MODULE
if (freeparent)
ossl_provider_free_parent(prov, 1);