diff options
author | Pauli <pauli@openssl.org> | 2021-04-27 15:17:25 +1000 |
---|---|---|
committer | Pauli <pauli@openssl.org> | 2021-05-07 23:53:18 +1000 |
commit | 0090e50890ce7691f7d6ba4a301b17c2ce58a204 (patch) | |
tree | 7287a15e7571560bca8c64660bb9ae9977fff36f /crypto/property | |
parent | 43d78564990a685f60e2fc0ab009735161d07434 (diff) | |
download | openssl-0090e50890ce7691f7d6ba4a301b17c2ce58a204.zip openssl-0090e50890ce7691f7d6ba4a301b17c2ce58a204.tar.gz openssl-0090e50890ce7691f7d6ba4a301b17c2ce58a204.tar.bz2 |
provider: flush the store cache when providers are loaded/unloaded.
When the providers change, the method cache needs to be flushed. This also
impacts the cache is full partial flushes and the algorithm flushing by ID.
A new function is introduced to clear all of the operation bits in all
providers in a library context.
Fixes #15032
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/15042)
Diffstat (limited to 'crypto/property')
-rw-r--r-- | crypto/property/property.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/crypto/property/property.c b/crypto/property/property.c index b120dbe..2b841a2 100644 --- a/crypto/property/property.c +++ b/crypto/property/property.c @@ -12,7 +12,9 @@ #include <stdio.h> #include <stdarg.h> #include <openssl/crypto.h> +#include "internal/core.h" #include "internal/property.h" +#include "internal/provider.h" #include "crypto/ctype.h" #include <openssl/lhash.h> #include <openssl/rand.h> @@ -425,6 +427,7 @@ static void ossl_method_cache_flush(OSSL_METHOD_STORE *store, int nid) ALGORITHM *alg = ossl_method_store_retrieve(store, nid); if (alg != NULL) { + ossl_provider_clear_all_operation_bits(store->ctx); store->nelem -= lh_QUERY_num_items(alg->cache); impl_cache_flush_alg(0, alg, NULL); } @@ -436,6 +439,7 @@ int ossl_method_store_flush_cache(OSSL_METHOD_STORE *store, int all) if (!ossl_property_write_lock(store)) return 0; + ossl_provider_clear_all_operation_bits(store->ctx); ossl_sa_ALGORITHM_doall_arg(store->algs, &impl_cache_flush_alg, arg); store->nelem = 0; ossl_property_unlock(store); @@ -500,6 +504,7 @@ static void ossl_method_cache_flush_some(OSSL_METHOD_STORE *store) state.nelem = 0; if ((state.seed = OPENSSL_rdtsc()) == 0) state.seed = 1; + ossl_provider_clear_all_operation_bits(store->ctx); store->need_flush = 0; ossl_sa_ALGORITHM_doall_arg(store->algs, &impl_cache_flush_one_alg, &state); store->nelem = state.nelem; |