From 505f46602043c7c28884e4c13f3cfa9419ae2f15 Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Wed, 14 Aug 2019 15:00:35 +0100 Subject: [PATCH] Make sure we pre-initialise properties Simplify the initialisation of the core by pre-initialising properties. Reviewed-by: Paul Dale Reviewed-by: Richard Levitte (Merged from https://github.com/openssl/openssl/pull/9590) --- crypto/context.c | 10 ++++++++++ crypto/property/property.c | 11 ----------- crypto/property/property_lcl.h | 1 - include/internal/property.h | 3 +++ 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/crypto/context.c b/crypto/context.c index ad4e997a7c..a2e19bac54 100644 --- a/crypto/context.c +++ b/crypto/context.c @@ -9,6 +9,7 @@ #include "internal/cryptlib_int.h" #include "internal/thread_once.h" +#include "internal/property.h" struct openssl_ctx_onfree_list_st { openssl_ctx_onfree_fn *fn; @@ -47,6 +48,7 @@ static OPENSSL_CTX *default_context = NULL; static int context_init(OPENSSL_CTX *ctx) { size_t i; + int exdata_done = 0; ctx->lock = CRYPTO_THREAD_lock_new(); if (ctx->lock == NULL) @@ -63,8 +65,10 @@ static int context_init(OPENSSL_CTX *ctx) goto err; } + /* OPENSSL_CTX is built on top of ex_data so we initialise that directly */ if (!do_ex_data_init(ctx)) goto err; + exdata_done = 1; if (!crypto_new_ex_data_ex(ctx, CRYPTO_EX_INDEX_OPENSSL_CTX, NULL, &ctx->data)) { @@ -72,8 +76,14 @@ static int context_init(OPENSSL_CTX *ctx) goto err; } + /* Everything depends on properties, so we also pre-initialise that */ + if (!ossl_property_parse_init(ctx)) + goto err; + return 1; err: + if (exdata_done) + crypto_cleanup_all_ex_data_int(ctx); CRYPTO_THREAD_lock_free(ctx->oncelock); CRYPTO_THREAD_lock_free(ctx->lock); ctx->lock = NULL; diff --git a/crypto/property/property.c b/crypto/property/property.c index 182ea6454b..e94c5de87d 100644 --- a/crypto/property/property.c +++ b/crypto/property/property.c @@ -84,12 +84,6 @@ int ossl_property_unlock(OSSL_METHOD_STORE *p) return p != 0 ? CRYPTO_THREAD_unlock(p->lock) : 0; } -static openssl_ctx_run_once_fn do_method_store_init; -int do_method_store_init(OPENSSL_CTX *ctx) -{ - return ossl_property_parse_init(ctx); -} - static unsigned long query_hash(const QUERY *a) { return OPENSSL_LH_strhash(a->query); @@ -132,11 +126,6 @@ OSSL_METHOD_STORE *ossl_method_store_new(OPENSSL_CTX *ctx) { OSSL_METHOD_STORE *res; - if (!openssl_ctx_run_once(ctx, - OPENSSL_CTX_METHOD_STORE_RUN_ONCE_INDEX, - do_method_store_init)) - return NULL; - res = OPENSSL_zalloc(sizeof(*res)); if (res != NULL) { res->ctx = ctx; diff --git a/crypto/property/property_lcl.h b/crypto/property/property_lcl.h index 5fa34cea82..25cfde4649 100644 --- a/crypto/property/property_lcl.h +++ b/crypto/property/property_lcl.h @@ -21,7 +21,6 @@ OSSL_PROPERTY_IDX ossl_property_value(OPENSSL_CTX *ctx, const char *s, int create); /* Property list functions */ -int ossl_property_parse_init(OPENSSL_CTX *ctx); void ossl_property_free(OSSL_PROPERTY_LIST *p); int ossl_property_has_optional(const OSSL_PROPERTY_LIST *query); int ossl_property_match_count(const OSSL_PROPERTY_LIST *query, diff --git a/include/internal/property.h b/include/internal/property.h index 3c6d6a9002..842c7dea17 100644 --- a/include/internal/property.h +++ b/include/internal/property.h @@ -15,6 +15,9 @@ typedef struct ossl_method_store_st OSSL_METHOD_STORE; +/* Initialisation */ +int ossl_property_parse_init(OPENSSL_CTX *ctx); + /* Implementation store functions */ OSSL_METHOD_STORE *ossl_method_store_new(OPENSSL_CTX *ctx); void ossl_method_store_free(OSSL_METHOD_STORE *store); -- 2.25.1