diff options
author | Richard Levitte <levitte@openssl.org> | 2022-04-25 07:22:27 +0200 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2022-05-05 15:06:11 +0200 |
commit | 03454ba2a234197c961920f1bac37cc9f4cf3f54 (patch) | |
tree | 555b5b6dc0ec58446a4ef26ae579ea84b333452d /crypto/property | |
parent | Make it possible to remove methods by the provider that provides them (diff) | |
download | openssl-03454ba2a234197c961920f1bac37cc9f4cf3f54.tar.xz openssl-03454ba2a234197c961920f1bac37cc9f4cf3f54.zip |
Complete the cleanup of an algorithm in OSSL_METHOD_STORE
The `alg_cleanup` didn't properly clear the OPENSSL_SA leaf that it
had just freed the contents of. Fortunately, `ossl_sa_ALGORITHM_doall_arg()`
allows us to pass the store pointer itself as an extra argument, which
allows a modified `alg_cleanup` to complete the job.
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/18151)
Diffstat (limited to 'crypto/property')
-rw-r--r-- | crypto/property/property.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/crypto/property/property.c b/crypto/property/property.c index 4303b4b5c3..d209f2c79d 100644 --- a/crypto/property/property.c +++ b/crypto/property/property.c @@ -205,14 +205,18 @@ static void impl_cache_flush_alg(ossl_uintmax_t idx, ALGORITHM *alg) lh_QUERY_flush(alg->cache); } -static void alg_cleanup(ossl_uintmax_t idx, ALGORITHM *a) +static void alg_cleanup(ossl_uintmax_t idx, ALGORITHM *a, void *arg) { + OSSL_METHOD_STORE *store = arg; + if (a != NULL) { sk_IMPLEMENTATION_pop_free(a->impls, &impl_free); lh_QUERY_doall(a->cache, &impl_cache_free); lh_QUERY_free(a->cache); OPENSSL_free(a); } + if (store != NULL) + ossl_sa_ALGORITHM_set(store->algs, idx, NULL); } /* @@ -242,7 +246,7 @@ OSSL_METHOD_STORE *ossl_method_store_new(OSSL_LIB_CTX *ctx) void ossl_method_store_free(OSSL_METHOD_STORE *store) { if (store != NULL) { - ossl_sa_ALGORITHM_doall(store->algs, &alg_cleanup); + ossl_sa_ALGORITHM_doall_arg(store->algs, &alg_cleanup, store); ossl_sa_ALGORITHM_free(store->algs); CRYPTO_THREAD_lock_free(store->lock); OPENSSL_free(store); @@ -332,7 +336,7 @@ int ossl_method_store_add(OSSL_METHOD_STORE *store, const OSSL_PROVIDER *prov, err: ossl_property_unlock(store); - alg_cleanup(0, alg); + alg_cleanup(0, alg, NULL); impl_free(impl); return 0; } |