summaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2021-03-16 12:03:08 +0000
committerMatt Caswell <matt@openssl.org>2021-03-18 12:00:42 +0000
commitee067bc066ccc21462a1a489f8f1314c7207c01f (patch)
tree1fc8686439cdfb6ac850992a4970457697fd71fc /crypto
parent7e7e034a10842dad3866c9447481b8527024bf44 (diff)
Ensure we deregister thread handlers even after a failed init
If we attempt to init a provider but that init fails, then we should still deregister any thread handlers. The provider may have failed after these were registered. Fixes #13338 Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Paul Dale <pauli@openssl.org> (Merged from https://github.com/openssl/openssl/pull/14576)
Diffstat (limited to 'crypto')
-rw-r--r--crypto/provider_core.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/crypto/provider_core.c b/crypto/provider_core.c
index 4d77108c33..632ea72a5d 100644
--- a/crypto/provider_core.c
+++ b/crypto/provider_core.c
@@ -359,9 +359,6 @@ void ossl_provider_free(OSSL_PROVIDER *prov)
*/
if (ref == 0) {
if (prov->flag_initialized) {
-#ifndef FIPS_MODULE
- ossl_init_thread_deregister(prov);
-#endif
if (prov->teardown != NULL)
prov->teardown(prov->provctx);
#ifndef OPENSSL_NO_ERR
@@ -380,6 +377,12 @@ void ossl_provider_free(OSSL_PROVIDER *prov)
}
#ifndef FIPS_MODULE
+ /*
+ * We deregister thread handling whether or not the provider was
+ * initialized. If init was attempted but was not successful then
+ * the provider may still have registered a thread handler.
+ */
+ ossl_init_thread_deregister(prov);
DSO_free(prov->module);
#endif
OPENSSL_free(prov->name);
@@ -561,10 +564,6 @@ static int provider_init(OSSL_PROVIDER *prov)
&provider_dispatch, &tmp_provctx)) {
ERR_raise_data(ERR_LIB_CRYPTO, ERR_R_INIT_FAIL,
"name=%s", prov->name);
-#ifndef FIPS_MODULE
- DSO_free(prov->module);
- prov->module = NULL;
-#endif
goto end;
}
prov->provctx = tmp_provctx;