From: Richard Levitte Date: Wed, 20 Apr 2022 14:43:13 +0000 (+0200) Subject: Drop ossl_provider_clear_all_operation_bits() and all uses of it X-Git-Tag: openssl-3.2.0-alpha1~2706 X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff_plain;h=20b6d85ab2b9cfa4cd29d2422d69c3e3f4db0a41 Drop ossl_provider_clear_all_operation_bits() and all uses of it This is a misused function, as it was called during query cache flush, when the provider operation bits were meant to record if methods for a certain operation has already been added to the method store. Fixes #18150 Reviewed-by: Tomas Mraz Reviewed-by: Matt Caswell (Merged from https://github.com/openssl/openssl/pull/18151) --- diff --git a/crypto/property/property.c b/crypto/property/property.c index fd511d2e25..d0415a6c55 100644 --- a/crypto/property/property.c +++ b/crypto/property/property.c @@ -498,7 +498,6 @@ 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); } @@ -510,7 +509,6 @@ 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); @@ -575,7 +573,6 @@ 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; diff --git a/crypto/provider_core.c b/crypto/provider_core.c index 3767570032..c24cb65f51 100644 --- a/crypto/provider_core.c +++ b/crypto/provider_core.c @@ -1520,33 +1520,6 @@ void ossl_provider_unquery_operation(const OSSL_PROVIDER *prov, prov->unquery_operation(prov->provctx, operation_id, algs); } -int ossl_provider_clear_all_operation_bits(OSSL_LIB_CTX *libctx) -{ - struct provider_store_st *store; - OSSL_PROVIDER *provider; - int i, num, res = 1; - - if ((store = get_provider_store(libctx)) != NULL) { - if (!CRYPTO_THREAD_read_lock(store->lock)) - return 0; - num = sk_OSSL_PROVIDER_num(store->providers); - for (i = 0; i < num; i++) { - provider = sk_OSSL_PROVIDER_value(store->providers, i); - if (!CRYPTO_THREAD_write_lock(provider->opbits_lock)) { - res = 0; - continue; - } - if (provider->operation_bits != NULL) - memset(provider->operation_bits, 0, - provider->operation_bits_sz); - CRYPTO_THREAD_unlock(provider->opbits_lock); - } - CRYPTO_THREAD_unlock(store->lock); - return res; - } - return 0; -} - int ossl_provider_set_operation_bit(OSSL_PROVIDER *provider, size_t bitnum) { size_t byte = bitnum / 8; diff --git a/doc/internal/man3/ossl_provider_new.pod b/doc/internal/man3/ossl_provider_new.pod index 1dba1860f7..6ea298e0a9 100644 --- a/doc/internal/man3/ossl_provider_new.pod +++ b/doc/internal/man3/ossl_provider_new.pod @@ -16,7 +16,7 @@ ossl_provider_name, ossl_provider_dso, ossl_provider_module_name, ossl_provider_module_path, ossl_provider_libctx, ossl_provider_teardown, ossl_provider_gettable_params, -ossl_provider_get_params, ossl_provider_clear_all_operation_bits, +ossl_provider_get_params, ossl_provider_query_operation, ossl_provider_unquery_operation, ossl_provider_set_operation_bit, ossl_provider_test_operation_bit, ossl_provider_get_capabilities @@ -93,7 +93,6 @@ ossl_provider_get_capabilities int ossl_provider_set_operation_bit(OSSL_PROVIDER *provider, size_t bitnum); int ossl_provider_test_operation_bit(OSSL_PROVIDER *provider, size_t bitnum, int *result); - int ossl_provider_clear_all_operation_bits(OSSL_LIB_CTX *libctx); int ossl_provider_init_as_child(OSSL_LIB_CTX *ctx, const OSSL_CORE_HANDLE *handle, @@ -294,9 +293,6 @@ ossl_provider_test_operation_bit() checks if the bit operation I is set (1) or not (0) in the internal I bitstring, and sets I<*result> to 1 or 0 accorddingly. -ossl_provider_clear_all_operation_bits() clears all of the operation bits -to (0) for all providers in the library context I. - ossl_provider_init_as_child() stores in the library context I references to the necessary upcalls for managing child providers. The I and I parameters are the B and B pointers that were @@ -374,8 +370,6 @@ If this function isn't available in the provider, 0 is returned. ossl_provider_set_operation_bit() and ossl_provider_test_operation_bit() return 1 on success, or 0 on error. -ossl_provider_clear_all_operation_bits() returns 1 on success, or 0 on error. - ossl_provider_get_capabilities() returns 1 on success, or 0 on error. If this function isn't available in the provider or the provider does not support the requested capability then 0 is returned. diff --git a/include/internal/provider.h b/include/internal/provider.h index b8ba7f6892..33750eba9c 100644 --- a/include/internal/provider.h +++ b/include/internal/provider.h @@ -94,11 +94,14 @@ void ossl_provider_unquery_operation(const OSSL_PROVIDER *prov, int operation_id, const OSSL_ALGORITHM *algs); -/* Cache of bits to see if we already queried an operation */ +/* + * Cache of bits to see if we already added methods for an operation in + * the "permanent" method store. + * They should never be called for temporary method stores! + */ int ossl_provider_set_operation_bit(OSSL_PROVIDER *provider, size_t bitnum); int ossl_provider_test_operation_bit(OSSL_PROVIDER *provider, size_t bitnum, int *result); -int ossl_provider_clear_all_operation_bits(OSSL_LIB_CTX *libctx); /* Configuration */ void ossl_provider_add_conf_module(void);