X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fcore_fetch.c;h=7f815a50acb06106dd582b183d3aecb591d08394;hp=227f92071323d7cd36778d24a0a624280230cc0d;hb=0abae1636d7054266dd20724c0d5e06617d9f679;hpb=2e49c05472ab76cee4e30c2eaa4fa576b9ae92c6 diff --git a/crypto/core_fetch.c b/crypto/core_fetch.c index 227f920713..7f815a50ac 100644 --- a/crypto/core_fetch.c +++ b/crypto/core_fetch.c @@ -24,63 +24,53 @@ struct construct_data_st { void *mcm_data; }; -static int ossl_method_construct_this(OSSL_PROVIDER *provider, void *cbdata) +static void ossl_method_construct_this(OSSL_PROVIDER *provider, + const OSSL_ALGORITHM *algo, + int no_store, void *cbdata) { struct construct_data_st *data = cbdata; - int no_store = 0; /* Assume caching is ok */ - const OSSL_ALGORITHM *map = - ossl_provider_query_operation(provider, data->operation_id, &no_store); - - while (map->algorithm_name != NULL) { - const OSSL_ALGORITHM *thismap = map++; - void *method = NULL; - - if ((method = data->mcm->construct(thismap->algorithm_name, - thismap->implementation, provider, - data->mcm_data)) == NULL) - continue; + void *method = NULL; + if ((method = data->mcm->construct(algo, provider, data->mcm_data)) + == NULL) + return; + + /* + * Note regarding putting the method in stores: + * + * we don't need to care if it actually got in or not here. + * If it didn't get in, it will simply not be available when + * ossl_method_construct() tries to get it from the store. + * + * It is *expected* that the put function increments the refcnt + * of the passed method. + */ + + if (data->force_store || !no_store) { /* - * Note regarding putting the method in stores: - * - * we don't need to care if it actually got in or not here. - * If it didn't get in, it will simply not be available when - * ossl_method_construct() tries to get it from the store. - * - * It is *expected* that the put function increments the refcnt - * of the passed method. + * If we haven't been told not to store, + * add to the global store */ - - if (data->force_store || !no_store) { - /* - * If we haven't been told not to store, - * add to the global store - */ - data->mcm->put(data->libctx, NULL, method, - thismap->algorithm_name, - thismap->property_definition, data->mcm_data); - } - - data->mcm->put(data->libctx, data->store, method, - thismap->algorithm_name, thismap->property_definition, - data->mcm_data); - - /* refcnt-- because we're dropping the reference */ - data->mcm->destruct(method, data->mcm_data); + data->mcm->put(data->libctx, NULL, method, provider, + data->operation_id, algo->algorithm_names, + algo->property_definition, data->mcm_data); } - return 1; + data->mcm->put(data->libctx, data->store, method, provider, + data->operation_id, algo->algorithm_names, + algo->property_definition, data->mcm_data); + + /* refcnt-- because we're dropping the reference */ + data->mcm->destruct(method, data->mcm_data); } void *ossl_method_construct(OPENSSL_CTX *libctx, int operation_id, - const char *name, const char *propquery, int force_store, OSSL_METHOD_CONSTRUCT_METHOD *mcm, void *mcm_data) { void *method = NULL; - if ((method = - mcm->get(libctx, NULL, name, propquery, mcm_data)) == NULL) { + if ((method = mcm->get(libctx, NULL, mcm_data)) == NULL) { struct construct_data_st cbdata; /* @@ -95,10 +85,10 @@ void *ossl_method_construct(OPENSSL_CTX *libctx, int operation_id, cbdata.force_store = force_store; cbdata.mcm = mcm; cbdata.mcm_data = mcm_data; - ossl_provider_forall_loaded(libctx, ossl_method_construct_this, - &cbdata); + ossl_algorithm_do_all(libctx, operation_id, NULL, + ossl_method_construct_this, &cbdata); - method = mcm->get(libctx, cbdata.store, name, propquery, mcm_data); + method = mcm->get(libctx, cbdata.store, mcm_data); mcm->dealloc_tmp_store(cbdata.store); }