From 36a89c04390f2d98e740b9c53a1eead9dcb5f188 Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Thu, 13 May 2021 15:35:42 +0100 Subject: [PATCH] Init the child providers immediately on creation of the child libctx We were deferring the initial creation of the child providers until the first fetch. This is a carry over from an earlier iteration of the child lib ctx development and is no longer necessary. In fact we need to init the child providers immediately otherwise not all providers quite init correctly. Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/15270) --- crypto/provider_child.c | 46 +++++-------------------- crypto/provider_core.c | 6 ---- doc/internal/man3/ossl_provider_new.pod | 7 +--- include/internal/provider.h | 1 - 4 files changed, 9 insertions(+), 51 deletions(-) diff --git a/crypto/provider_child.c b/crypto/provider_child.c index 0ca61c0686..2487d43fd7 100644 --- a/crypto/provider_child.c +++ b/crypto/provider_child.c @@ -198,44 +198,6 @@ static int provider_remove_child_cb(const OSSL_CORE_HANDLE *prov, void *cbdata) return 1; } -int ossl_provider_init_child_providers(OSSL_LIB_CTX *ctx) -{ - struct child_prov_globals *gbl; - - /* Should never happen */ - if (ctx == NULL) - return 0; - - gbl = ossl_lib_ctx_get_data(ctx, OSSL_LIB_CTX_CHILD_PROVIDER_INDEX, - &child_prov_ossl_ctx_method); - if (gbl == NULL) - return 0; - - if (!CRYPTO_THREAD_read_lock(gbl->lock)) - return 0; - if (gbl->isinited) { - CRYPTO_THREAD_unlock(gbl->lock); - return 1; - } - CRYPTO_THREAD_unlock(gbl->lock); - - if (!CRYPTO_THREAD_write_lock(gbl->lock)) - return 0; - if (!gbl->isinited) { - if (!gbl->c_provider_register_child_cb(gbl->handle, - provider_create_child_cb, - provider_remove_child_cb, - ctx)) { - CRYPTO_THREAD_unlock(gbl->lock); - return 0; - } - gbl->isinited = 1; - } - CRYPTO_THREAD_unlock(gbl->lock); - - return 1; -} - int ossl_provider_init_as_child(OSSL_LIB_CTX *ctx, const OSSL_CORE_HANDLE *handle, const OSSL_DISPATCH *in) @@ -300,6 +262,14 @@ int ossl_provider_init_as_child(OSSL_LIB_CTX *ctx, if (gbl->lock == NULL) return 0; + if (!gbl->c_provider_register_child_cb(gbl->handle, + provider_create_child_cb, + provider_remove_child_cb, + ctx)) + return 0; + + gbl->isinited = 1; + return 1; } diff --git a/crypto/provider_core.c b/crypto/provider_core.c index f0b429d986..b384f74fd2 100644 --- a/crypto/provider_core.c +++ b/crypto/provider_core.c @@ -276,9 +276,6 @@ OSSL_PROVIDER *ossl_provider_find(OSSL_LIB_CTX *libctx, const char *name, if (!noconfig) { if (ossl_lib_ctx_is_default(libctx)) OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CONFIG, NULL); - if (ossl_lib_ctx_is_child(libctx) - && !ossl_provider_init_child_providers(libctx)) - return NULL; } #endif @@ -1007,9 +1004,6 @@ int ossl_provider_doall_activated(OSSL_LIB_CTX *ctx, */ if (ossl_lib_ctx_is_default(ctx)) OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CONFIG, NULL); - if (ossl_lib_ctx_is_child(ctx) - && !ossl_provider_init_child_providers(ctx)) - return 0; #endif if (store == NULL) diff --git a/doc/internal/man3/ossl_provider_new.pod b/doc/internal/man3/ossl_provider_new.pod index ff347bad3f..7ab60eb3a5 100644 --- a/doc/internal/man3/ossl_provider_new.pod +++ b/doc/internal/man3/ossl_provider_new.pod @@ -7,7 +7,7 @@ ossl_provider_free, ossl_provider_set_fallback, ossl_provider_set_module_path, ossl_provider_add_parameter, ossl_provider_set_child, ossl_provider_get_parent, ossl_provider_up_ref_parent, ossl_provider_free_parent, -ossl_provider_get0_dispatch, ossl_provider_init_child_providers, +ossl_provider_get0_dispatch, ossl_provider_init_as_child, ossl_provider_activate, ossl_provider_deactivate, ossl_provider_available, ossl_provider_ctx, @@ -95,7 +95,6 @@ ossl_provider_get_capabilities int *result); int ossl_provider_clear_all_operation_bits(OSSL_LIB_CTX *libctx); - int ossl_provider_init_child_providers(OSSL_LIB_CTX *ctx); int ossl_provider_init_as_child(OSSL_LIB_CTX *ctx, const OSSL_CORE_HANDLE *handle, const OSSL_DISPATCH *in); @@ -291,10 +290,6 @@ 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_child_providers() registers the callbacks required to -receive notifications about loading and unloading of providers in the parent -library context. - 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 diff --git a/include/internal/provider.h b/include/internal/provider.h index 5b0af7a335..020cbc8a9e 100644 --- a/include/internal/provider.h +++ b/include/internal/provider.h @@ -108,7 +108,6 @@ int ossl_provider_clear_all_operation_bits(OSSL_LIB_CTX *libctx); void ossl_provider_add_conf_module(void); /* Child providers */ -int ossl_provider_init_child_providers(OSSL_LIB_CTX *ctx); int ossl_provider_init_as_child(OSSL_LIB_CTX *ctx, const OSSL_CORE_HANDLE *handle, const OSSL_DISPATCH *in);