Commit c3cb4f142b for openssl.org
commit c3cb4f142bacab224c3a72489fc27ca608aa1ef7
Author: ndossche <niels.dossche@ugent.be>
Date: Wed Sep 9 22:50:53 2026 +0200
Fix memory leak on error on OSSL_PROVIDER_available()
`ossl_provider_free` must be called, but the `CRYPTO_THREAD_read_lock`
error path does not do this. By inverting the condition and
restructuring the code we can solve this cleanly without introducing a
goto.
Reviewed-by: Frederik Wedel-Heinen <fwh.openssl@gmail.com>
Reviewed-by: Todd Short <todd.short@me.com>
Merge-date: Wed Sep 16 13:40:31 2026
Merged-from: https://github.com/openssl/openssl/pull/32775
diff --git a/crypto/provider_core.c b/crypto/provider_core.c
index c3349881ef..127cb4a23c 100644
--- a/crypto/provider_core.c
+++ b/crypto/provider_core.c
@@ -1675,10 +1675,10 @@ int OSSL_PROVIDER_available(OSSL_LIB_CTX *libctx, const char *name)
prov = ossl_provider_find(libctx, name, 0);
if (prov != NULL) {
- if (!CRYPTO_THREAD_read_lock(prov->flag_lock))
- return 0;
- available = prov->flag_activated;
- CRYPTO_THREAD_unlock(prov->flag_lock);
+ if (CRYPTO_THREAD_read_lock(prov->flag_lock)) {
+ available = prov->flag_activated;
+ CRYPTO_THREAD_unlock(prov->flag_lock);
+ }
ossl_provider_free(prov);
}
return available;