From: Richard Levitte Date: Fri, 14 Jun 2019 09:41:32 +0000 (+0200) Subject: Replumbing: Adapt the default and legacy providers to use library context upcall X-Git-Tag: openssl-3.0.0-alpha1~1935 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fopenssl.git;a=commitdiff_plain;h=8013a933dacc80096e2bfca06c00f9ec29adb35b Replumbing: Adapt the default and legacy providers to use library context upcall Reviewed-by: Matt Caswell (Merged from https://github.com/openssl/openssl/pull/9160) --- diff --git a/providers/default/defltprov.c b/providers/default/defltprov.c index 98999405d6..b9c8c36ef0 100644 --- a/providers/default/defltprov.c +++ b/providers/default/defltprov.c @@ -144,6 +144,8 @@ int ossl_default_provider_init(const OSSL_PROVIDER *provider, const OSSL_DISPATCH **out, void **provctx) { + OSSL_core_get_library_context_fn *c_get_libctx = NULL; + for (; in->function_id != 0; in++) { switch (in->function_id) { case OSSL_FUNC_CORE_GET_PARAM_TYPES: @@ -152,12 +154,25 @@ int ossl_default_provider_init(const OSSL_PROVIDER *provider, case OSSL_FUNC_CORE_GET_PARAMS: c_get_params = OSSL_get_core_get_params(in); break; + case OSSL_FUNC_CORE_GET_LIBRARY_CONTEXT: + c_get_libctx = OSSL_get_core_get_library_context(in); + break; default: /* Just ignore anything we don't understand */ break; } } + if (c_get_libctx == NULL) + return 0; + *out = deflt_dispatch_table; + + /* + * We want to make sure that all calls from this provider that requires + * a library context use the same context as the one used to call our + * functions. We do that by passing it along as the provider context. + */ + *provctx = c_get_libctx(provider); return 1; } diff --git a/providers/legacy/legacyprov.c b/providers/legacy/legacyprov.c index 9ca4e14833..9b5533708f 100644 --- a/providers/legacy/legacyprov.c +++ b/providers/legacy/legacyprov.c @@ -99,6 +99,8 @@ int OSSL_provider_init(const OSSL_PROVIDER *provider, const OSSL_DISPATCH **out, void **provctx) { + OSSL_core_get_library_context_fn *c_get_libctx = NULL; + for (; in->function_id != 0; in++) { switch (in->function_id) { case OSSL_FUNC_CORE_GET_PARAM_TYPES: @@ -107,12 +109,25 @@ int OSSL_provider_init(const OSSL_PROVIDER *provider, case OSSL_FUNC_CORE_GET_PARAMS: c_get_params = OSSL_get_core_get_params(in); break; + case OSSL_FUNC_CORE_GET_LIBRARY_CONTEXT: + c_get_libctx = OSSL_get_core_get_library_context(in); + break; /* Just ignore anything we don't understand */ default: break; } } + if (c_get_libctx == NULL) + return 0; + *out = legacy_dispatch_table; + + /* + * We want to make sure that all calls from this provider that requires + * a library context use the same context as the one used to call our + * functions. We do that by passing it along as the provider context. + */ + *provctx = c_get_libctx(provider); return 1; }