diff options
author | Matt Caswell <matt@openssl.org> | 2019-08-14 15:00:35 +0100 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2019-08-29 10:50:47 +0100 |
commit | 505f46602043c7c28884e4c13f3cfa9419ae2f15 (patch) | |
tree | 0c58220dd5f6b3f5d29e0a832b20dfa4a0e5872a /crypto | |
parent | 770de3462c0d655a6543a6c1a2c0bda7b57178f9 (diff) |
Make sure we pre-initialise properties
Simplify the initialisation of the core by pre-initialising properties.
Reviewed-by: Paul Dale <paul.dale@oracle.com>
Reviewed-by: Richard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/9590)
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/context.c | 10 | ||||
-rw-r--r-- | crypto/property/property.c | 11 | ||||
-rw-r--r-- | crypto/property/property_lcl.h | 1 |
3 files changed, 10 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, |