#include <openssl/conf.h>
#include "internal/thread_once.h"
#include "internal/property.h"
+#include "internal/core.h"
struct ossl_lib_ctx_onfree_list_st {
ossl_lib_ctx_onfree_fn *fn;
struct ossl_lib_ctx_onfree_list_st *onfreelist;
};
+int ossl_lib_ctx_write_lock(OSSL_LIB_CTX *ctx)
+{
+ return CRYPTO_THREAD_write_lock(ossl_lib_ctx_get_concrete(ctx)->lock);
+}
+
+int ossl_lib_ctx_read_lock(OSSL_LIB_CTX *ctx)
+{
+ return CRYPTO_THREAD_read_lock(ossl_lib_ctx_get_concrete(ctx)->lock);
+}
+
+int ossl_lib_ctx_unlock(OSSL_LIB_CTX *ctx)
+{
+ return CRYPTO_THREAD_unlock(ossl_lib_ctx_get_concrete(ctx)->lock);
+}
+
static int context_init(OSSL_LIB_CTX *ctx)
{
size_t i;
#include <openssl/lhash.h>
#include "internal/propertyerr.h"
#include "internal/property.h"
+#include "internal/core.h"
#include "property_local.h"
/*
property_defns = ossl_lib_ctx_get_data(ctx,
OSSL_LIB_CTX_PROPERTY_DEFN_INDEX,
&property_defns_method);
- if (property_defns == NULL)
+ if (property_defns == NULL || !ossl_lib_ctx_read_lock(ctx))
return NULL;
elem.prop = prop;
r = lh_PROPERTY_DEFN_ELEM_retrieve(property_defns, &elem);
+ ossl_lib_ctx_unlock(ctx);
return r != NULL ? r->defn : NULL;
}
PROPERTY_DEFN_ELEM elem, *old, *p = NULL;
size_t len;
LHASH_OF(PROPERTY_DEFN_ELEM) *property_defns;
+ int res = 1;
property_defns = ossl_lib_ctx_get_data(ctx,
OSSL_LIB_CTX_PROPERTY_DEFN_INDEX,
if (prop == NULL)
return 1;
+ if (!ossl_lib_ctx_write_lock(ctx))
+ return 0;
if (pl == NULL) {
elem.prop = prop;
lh_PROPERTY_DEFN_ELEM_delete(property_defns, &elem);
- return 1;
+ goto end;
}
len = strlen(prop);
p = OPENSSL_malloc(sizeof(*p) + len);
old = lh_PROPERTY_DEFN_ELEM_insert(property_defns, p);
if (old != NULL) {
property_defn_free(old);
- return 1;
+ goto end;
}
if (!lh_PROPERTY_DEFN_ELEM_error(property_defns))
- return 1;
+ goto end;
}
OPENSSL_free(p);
- return 0;
+ res = 0;
+ end:
+ ossl_lib_ctx_unlock(ctx);
+ return res;
}
int no_store, void *data, int *result),
void *data);
+__owur int ossl_lib_ctx_write_lock(OSSL_LIB_CTX *ctx);
+__owur int ossl_lib_ctx_read_lock(OSSL_LIB_CTX *ctx);
+int ossl_lib_ctx_unlock(OSSL_LIB_CTX *ctx);
+
#endif