diff options
author | Matt Caswell <matt@openssl.org> | 2021-11-09 11:53:27 +0000 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2021-11-12 17:16:14 +0000 |
commit | e39bd6215123f375ddcfe92fa2b2550294da0b73 (patch) | |
tree | ee6cda641ae9d3fd6a7c83121b7218ae990dae3e /crypto/provider_core.c | |
parent | dc6d9ede6241e6858f8fa78435d6c8eb9cf85aa1 (diff) | |
download | openssl-new-e39bd6215123f375ddcfe92fa2b2550294da0b73.tar.gz |
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.c | 19 |
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); |