From: Matt Caswell Date: Mon, 6 Jun 2022 09:06:57 +0000 (+0100) Subject: Assert that a property definition cache entry is the first X-Git-Tag: openssl-3.2.0-alpha1~2552 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5f4b3db624a83b812f23412e698ffd9c4284f87a;p=thirdparty%2Fopenssl.git Assert that a property definition cache entry is the first When adding a property definition cache entry for a given property query string we add an assert that we are not replacing an existing entry. If we are then that indicates a bug in the caller. Reviewed-by: Tomas Mraz Reviewed-by: Todd Short Reviewed-by: Hugo Landau Reviewed-by: Paul Dale (Merged from https://github.com/openssl/openssl/pull/18458) --- diff --git a/crypto/property/defn_cache.c b/crypto/property/defn_cache.c index 282d43c80ac..c697e6f474f 100644 --- a/crypto/property/defn_cache.c +++ b/crypto/property/defn_cache.c @@ -79,6 +79,11 @@ OSSL_PROPERTY_LIST *ossl_prop_defn_get(OSSL_LIB_CTX *ctx, const char *prop) return r != NULL ? r->defn : NULL; } +/* + * Cache the property list for a given property string. Callers of this function + * should call ossl_prop_defn_get first to ensure that there is no existing + * cache entry for this property string. + */ int ossl_prop_defn_set(OSSL_LIB_CTX *ctx, const char *prop, OSSL_PROPERTY_LIST *pl) { @@ -109,8 +114,14 @@ int ossl_prop_defn_set(OSSL_LIB_CTX *ctx, const char *prop, p->defn = pl; memcpy(p->body, prop, len + 1); old = lh_PROPERTY_DEFN_ELEM_insert(property_defns, p); - if (old != NULL) { - property_defn_free(old); + if (!ossl_assert(old == NULL)) { + /* + * This should not happen. Any caller of ossl_prop_defn_set should + * have called ossl_prop_defn_get first - so we should know that + * there is no existing entry. If we get here we have a bug. We + * deliberately leak the |old| reference in order to avoid a crash + * if there are any existing users of it. + */ goto end; } if (!lh_PROPERTY_DEFN_ELEM_error(property_defns))