Don't write to the globals ossl_property_true and ossl_property_false
authorMatt Caswell <matt@openssl.org>
Fri, 5 Nov 2021 13:29:41 +0000 (13:29 +0000)
committerMatt Caswell <matt@openssl.org>
Fri, 12 Nov 2021 17:16:01 +0000 (17:16 +0000)
These global variables were previously overwritten with the same value
every time we created a new OSSL_LIB_CTX. Instead we preinitialise them
with the correct values, and then confirm that settings for each
OSSL_LIB_CTX agree with the preinitialised values.

Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/16980)

crypto/property/property_local.h
crypto/property/property_parse.c
crypto/property/property_query.c

index 46c5dbe3cc39628437d2e87179b9f504f04e0837..6b85ce1586e80954934e59c1d5212cf6abb005c0 100644 (file)
@@ -34,7 +34,8 @@ struct ossl_property_list_st {
     OSSL_PROPERTY_DEFINITION properties[1];
 };
 
-extern OSSL_PROPERTY_IDX ossl_property_true, ossl_property_false;
+#define OSSL_PROPERTY_TRUE      1
+#define OSSL_PROPERTY_FALSE     2
 
 /* Property string functions */
 OSSL_PROPERTY_IDX ossl_property_name(OSSL_LIB_CTX *ctx, const char *s,
index 3c0a6ff79319eaedc1bf94d2258477d797a24f50..dc35646be2eaba59f23f2e87c3f378da9b3677c6 100644 (file)
@@ -19,8 +19,6 @@
 #include "property_local.h"
 #include "e_os.h"
 
-OSSL_PROPERTY_IDX ossl_property_true, ossl_property_false;
-
 DEFINE_STACK_OF(OSSL_PROPERTY_DEFINITION)
 
 static const char *skip_space(const char *s)
@@ -352,7 +350,7 @@ OSSL_PROPERTY_LIST *ossl_parse_property(OSSL_LIB_CTX *ctx, const char *defn)
         } else {
             /* A name alone means a true Boolean */
             prop->type = OSSL_PROPERTY_TYPE_STRING;
-            prop->v.str_val = ossl_property_true;
+            prop->v.str_val = OSSL_PROPERTY_TRUE;
         }
 
         if (!sk_OSSL_PROPERTY_DEFINITION_push(sk, prop))
@@ -411,7 +409,7 @@ OSSL_PROPERTY_LIST *ossl_parse_query(OSSL_LIB_CTX *ctx, const char *s,
             /* A name alone is a Boolean comparison for true */
             prop->oper = OSSL_PROPERTY_OPER_EQ;
             prop->type = OSSL_PROPERTY_TYPE_STRING;
-            prop->v.str_val = ossl_property_true;
+            prop->v.str_val = OSSL_PROPERTY_TRUE;
             goto skip_value;
         }
         if (!parse_value(ctx, &s, prop, create_values))
@@ -485,9 +483,9 @@ int ossl_property_match_count(const OSSL_PROPERTY_LIST *query,
                 return -1;
         } else if (q[i].type != OSSL_PROPERTY_TYPE_STRING
                    || (oper == OSSL_PROPERTY_OPER_EQ
-                       && q[i].v.str_val != ossl_property_false)
+                       && q[i].v.str_val != OSSL_PROPERTY_FALSE)
                    || (oper == OSSL_PROPERTY_OPER_NE
-                       && q[i].v.str_val == ossl_property_false)) {
+                       && q[i].v.str_val == OSSL_PROPERTY_FALSE)) {
             if (!q[i].optional)
                 return -1;
         } else {
@@ -560,9 +558,13 @@ int ossl_property_parse_init(OSSL_LIB_CTX *ctx)
         if (ossl_property_name(ctx, predefined_names[i], 1) == 0)
             goto err;
 
-    /* Pre-populate the two Boolean values */
-    if ((ossl_property_true = ossl_property_value(ctx, "yes", 1)) == 0
-        || (ossl_property_false = ossl_property_value(ctx, "no", 1)) == 0)
+    /*
+     * Pre-populate the two Boolean values. We must do them before any other
+     * values and in this order so that we get the same index as the global
+     * OSSL_PROPERTY_TRUE and OSSL_PROPERTY_FALSE values
+     */
+    if ((ossl_property_value(ctx, "yes", 1) != OSSL_PROPERTY_TRUE)
+        || (ossl_property_value(ctx, "no", 1) != OSSL_PROPERTY_FALSE))
         goto err;
 
     return 1;
index 1352bc009eee8bf22da9dade90006fe0c707042a..28cc704840a49cb17154e048375404031d4eee0f 100644 (file)
@@ -75,8 +75,8 @@ int ossl_property_is_enabled(OSSL_LIB_CTX *ctx,  const char *property_name,
         return 0;
     return (prop->type == OSSL_PROPERTY_TYPE_STRING
             && ((prop->oper == OSSL_PROPERTY_OPER_EQ
-                     && prop->v.str_val == ossl_property_true)
+                     && prop->v.str_val == OSSL_PROPERTY_TRUE)
                  || (prop->oper == OSSL_PROPERTY_OPER_NE
-                     && prop->v.str_val != ossl_property_true)));
+                     && prop->v.str_val != OSSL_PROPERTY_TRUE)));
 }