From f0191d0b1373bb7b0c50a0103d63791f51ed3398 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 3 Jun 2021 09:09:19 +0200 Subject: [PATCH] Add the internal function ossl_method_store_do_all() It will simply call the given callback for every method found in the given store. Fixes #15538 Fixes #14837 Reviewed-by: Matt Caswell Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/15604) --- crypto/property/property.c | 36 ++++++++++++++++++++++++++++++++++++ include/internal/property.h | 3 +++ 2 files changed, 39 insertions(+) diff --git a/crypto/property/property.c b/crypto/property/property.c index a769a7307e3..535120b5812 100644 --- a/crypto/property/property.c +++ b/crypto/property/property.c @@ -362,6 +362,42 @@ int ossl_method_store_remove(OSSL_METHOD_STORE *store, int nid, return 0; } +static void alg_do_one(ALGORITHM *alg, IMPLEMENTATION *impl, + void (*fn)(int id, void *method, void *fnarg), + void *fnarg) +{ + fn(alg->nid, impl->method.method, fnarg); +} + +struct alg_do_each_data_st { + void (*fn)(int id, void *method, void *fnarg); + void *fnarg; +}; + +static void alg_do_each(ossl_uintmax_t idx, ALGORITHM *alg, void *arg) +{ + struct alg_do_each_data_st *data = arg; + int i, end = sk_IMPLEMENTATION_num(alg->impls); + + for (i = 0; i < end; i++) { + IMPLEMENTATION *impl = sk_IMPLEMENTATION_value(alg->impls, i); + + alg_do_one(alg, impl, data->fn, data->fnarg); + } +} + +void ossl_method_store_do_all(OSSL_METHOD_STORE *store, + void (*fn)(int id, void *method, void *fnarg), + void *fnarg) +{ + struct alg_do_each_data_st data; + + data.fn = fn; + data.fnarg = fnarg; + if (store != NULL) + ossl_sa_ALGORITHM_doall_arg(store->algs, alg_do_each, &data); +} + int ossl_method_store_fetch(OSSL_METHOD_STORE *store, int nid, const char *prop_query, void **method) diff --git a/include/internal/property.h b/include/internal/property.h index bcea21d80c2..dd9a2dc2d8f 100644 --- a/include/internal/property.h +++ b/include/internal/property.h @@ -58,6 +58,9 @@ int ossl_method_store_add(OSSL_METHOD_STORE *store, const OSSL_PROVIDER *prov, void (*method_destruct)(void *)); int ossl_method_store_remove(OSSL_METHOD_STORE *store, int nid, const void *method); +void ossl_method_store_do_all(OSSL_METHOD_STORE *store, + void (*fn)(int id, void *method, void *fnarg), + void *fnarg); int ossl_method_store_fetch(OSSL_METHOD_STORE *store, int nid, const char *prop_query, void **method); -- 2.47.2