diff options
author | Pauli <paul.dale@oracle.com> | 2020-09-25 10:19:19 +1000 |
---|---|---|
committer | Pauli <ppzgs1@gmail.com> | 2021-02-24 21:24:36 +1000 |
commit | b0001d0cf2539b9309712e3e04f407dcbb04352c (patch) | |
tree | fb7e81074c5d0ca84b3ae37f47bc612eb608b26e /crypto | |
parent | 8b3facd7324b6c2f36f6414c0552da26378aae4a (diff) |
provider: add an unquery function to allow providers to clean up.
Without this, a provider has no way to know that an application
has finished with the array it returned earlier. A non-caching provider
requires this information.
Fixes #12974
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/12974)
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/core_algorithm.c | 1 | ||||
-rw-r--r-- | crypto/provider.c | 7 | ||||
-rw-r--r-- | crypto/provider_core.c | 13 |
3 files changed, 21 insertions, 0 deletions
diff --git a/crypto/core_algorithm.c b/crypto/core_algorithm.c index ddb9e5ae43..59f6dddb14 100644 --- a/crypto/core_algorithm.c +++ b/crypto/core_algorithm.c @@ -65,6 +65,7 @@ static int algorithm_do_this(OSSL_PROVIDER *provider, void *cbdata) data->fn(provider, thismap, no_store, data->data); } } + ossl_provider_unquery_operation(provider, cur_operation, map); /* Do we fulfill post-conditions? */ if (data->post == NULL) { diff --git a/crypto/provider.c b/crypto/provider.c index 90c31f3ac5..8eca9d3581 100644 --- a/crypto/provider.c +++ b/crypto/provider.c @@ -76,6 +76,13 @@ const OSSL_ALGORITHM *OSSL_PROVIDER_query_operation(const OSSL_PROVIDER *prov, return ossl_provider_query_operation(prov, operation_id, no_cache); } +void OSSL_PROVIDER_unquery_operation(const OSSL_PROVIDER *prov, + int operation_id, + const OSSL_ALGORITHM *algs) +{ + ossl_provider_unquery_operation(prov, operation_id, algs); +} + void *OSSL_PROVIDER_get0_provider_ctx(const OSSL_PROVIDER *prov) { return ossl_provider_prov_ctx(prov); diff --git a/crypto/provider_core.c b/crypto/provider_core.c index da751e60ce..d210026e25 100644 --- a/crypto/provider_core.c +++ b/crypto/provider_core.c @@ -78,6 +78,7 @@ struct ossl_provider_st { OSSL_FUNC_provider_get_capabilities_fn *get_capabilities; OSSL_FUNC_provider_self_test_fn *self_test; OSSL_FUNC_provider_query_operation_fn *query_operation; + OSSL_FUNC_provider_unquery_operation_fn *unquery_operation; /* * Cache of bit to indicate of query_operation() has been called on @@ -571,6 +572,10 @@ static int provider_init(OSSL_PROVIDER *prov) prov->query_operation = OSSL_FUNC_provider_query_operation(provider_dispatch); break; + case OSSL_FUNC_PROVIDER_UNQUERY_OPERATION: + prov->unquery_operation = + OSSL_FUNC_provider_unquery_operation(provider_dispatch); + break; #ifndef OPENSSL_NO_ERR # ifndef FIPS_MODULE case OSSL_FUNC_PROVIDER_GET_REASON_STRINGS: @@ -929,6 +934,14 @@ const OSSL_ALGORITHM *ossl_provider_query_operation(const OSSL_PROVIDER *prov, return res; } +void ossl_provider_unquery_operation(const OSSL_PROVIDER *prov, + int operation_id, + const OSSL_ALGORITHM *algs) +{ + if (prov->unquery_operation != NULL) + prov->unquery_operation(prov->provctx, operation_id, algs); +} + int ossl_provider_set_operation_bit(OSSL_PROVIDER *provider, size_t bitnum) { size_t byte = bitnum / 8; |