diff options
author | Pauli <pauli@openssl.org> | 2021-04-07 11:32:59 +1000 |
---|---|---|
committer | Pauli <pauli@openssl.org> | 2021-04-08 17:46:35 +1000 |
commit | 4b1f34f11ff94bc2d0169d6669bfc47f99bd93b3 (patch) | |
tree | 9fd4f62d675b6cf0d179ceb5256f367ab056f466 /crypto/property | |
parent | a135dea4e024ea6750be25859c1d613789a4d575 (diff) |
property: lock the lib ctx when updating the property definition cache
Although the store being used is adequately and properly locked, the library
context is not. Due to the mechanisms used for fetching, it is possible for
multiple stores to live within the same library context for short periods.
This fix prevents threading issues resulting from such coincidences.
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/14773)
Diffstat (limited to 'crypto/property')
-rw-r--r-- | crypto/property/defn_cache.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/crypto/property/defn_cache.c b/crypto/property/defn_cache.c index b3aefe8f8e..13b2d60770 100644 --- a/crypto/property/defn_cache.c +++ b/crypto/property/defn_cache.c @@ -13,6 +13,7 @@ #include <openssl/lhash.h> #include "internal/propertyerr.h" #include "internal/property.h" +#include "internal/core.h" #include "property_local.h" /* @@ -74,11 +75,12 @@ OSSL_PROPERTY_LIST *ossl_prop_defn_get(OSSL_LIB_CTX *ctx, const char *prop) 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; } @@ -88,6 +90,7 @@ int ossl_prop_defn_set(OSSL_LIB_CTX *ctx, const char *prop, 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, @@ -98,10 +101,12 @@ int ossl_prop_defn_set(OSSL_LIB_CTX *ctx, const char *prop, 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); @@ -112,11 +117,14 @@ int ossl_prop_defn_set(OSSL_LIB_CTX *ctx, const char *prop, 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; } |