summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crypto/context.c10
-rw-r--r--crypto/property/property.c11
-rw-r--r--crypto/property/property_lcl.h1
-rw-r--r--include/internal/property.h3
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);