This should fix a lock-order-inversion
authorBernd Edlinger <bernd.edlinger@hotmail.de>
Wed, 4 Nov 2020 19:55:36 +0000 (20:55 +0100)
committerBernd Edlinger <bernd.edlinger@hotmail.de>
Sun, 8 Nov 2020 06:44:28 +0000 (07:44 +0100)
Calling OPENSSL_init_crypto before acquiring the
ossl_property_read_lock in ossl_method_store_fetch
makes the second call to OPENSSL_init_crypto
from ossl_ctx_global_properties unnecessary.

Fixes #12869

Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Paul Dale <paul.dale@oracle.com>
Reviewed-by: Matthias St. Pierre <Matthias.St.Pierre@ncp-e.com>
(Merged from https://github.com/openssl/openssl/pull/13321)

crypto/property/property.c

index 9cfca8119092b3a688499be8e859ce1ba39a3e55..985709b2047f6e20e748a6be31eb5e9e4ff3aad0 100644 (file)
@@ -338,7 +338,8 @@ int ossl_method_store_fetch(OSSL_METHOD_STORE *store, int nid,
     int j, best = -1, score, optional;
 
 #ifndef FIPS_MODULE
-    OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CONFIG, NULL);
+    if (!OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CONFIG, NULL))
+       return 0;
 #endif
 
     if (nid <= 0 || method == NULL || store == NULL)
@@ -357,7 +358,7 @@ int ossl_method_store_fetch(OSSL_METHOD_STORE *store, int nid,
 
     if (prop_query != NULL)
         p2 = pq = ossl_parse_query(store->ctx, prop_query);
-    plp = ossl_ctx_global_properties(store->ctx, 1);
+    plp = ossl_ctx_global_properties(store->ctx, 0);
     if (plp != NULL && *plp != NULL) {
         if (pq == NULL) {
             pq = *plp;