[openssl] master update

Dr. Paul Dale pauli at openssl.org
Mon Mar 15 23:19:39 UTC 2021


The branch master has been updated
       via  1e08f3ba9ec495fbd4a4cd6a411dc4e052626eda (commit)
      from  bd55a0be1b5696f643863718e7aa916feccafdf4 (commit)


- Log -----------------------------------------------------------------
commit 1e08f3ba9ec495fbd4a4cd6a411dc4e052626eda
Author: Pauli <ppzgs1 at gmail.com>
Date:   Sat Mar 13 10:34:49 2021 +1000

    property: default queries create the property values.
    
    Without this, it is necessary to query an algorithm before setting the default
    property query.  With this, the value will be created and the default will
    work.
    
    Fixes #14516
    
    Reviewed-by: Shane Lontis <shane.lontis at oracle.com>
    (Merged from https://github.com/openssl/openssl/pull/14542)

-----------------------------------------------------------------------

Summary of changes:
 crypto/evp/evp_fetch.c           |  4 ++--
 crypto/property/property.c       |  2 +-
 crypto/property/property_parse.c |  5 +++--
 include/internal/property.h      |  3 ++-
 test/property_test.c             | 31 +++++++++++++++++++++++++++----
 5 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/crypto/evp/evp_fetch.c b/crypto/evp/evp_fetch.c
index d635db7c3e..701abfaaf5 100644
--- a/crypto/evp/evp_fetch.c
+++ b/crypto/evp/evp_fetch.c
@@ -403,7 +403,7 @@ int evp_set_default_properties_int(OSSL_LIB_CTX *libctx, const char *propq,
 {
     OSSL_PROPERTY_LIST *pl = NULL;
 
-    if (propq != NULL && (pl = ossl_parse_query(libctx, propq)) == NULL) {
+    if (propq != NULL && (pl = ossl_parse_query(libctx, propq, 1)) == NULL) {
         ERR_raise(ERR_LIB_EVP, EVP_R_DEFAULT_QUERY_PARSE_ERROR);
         return 0;
     }
@@ -424,7 +424,7 @@ static int evp_default_properties_merge(OSSL_LIB_CTX *libctx, const char *propq)
         return 1;
     if (plp == NULL || *plp == NULL)
         return EVP_set_default_properties(libctx, propq);
-    if ((pl1 = ossl_parse_query(libctx, propq)) == NULL) {
+    if ((pl1 = ossl_parse_query(libctx, propq, 1)) == NULL) {
         ERR_raise(ERR_LIB_EVP, EVP_R_DEFAULT_QUERY_PARSE_ERROR);
         return 0;
     }
diff --git a/crypto/property/property.c b/crypto/property/property.c
index 985709b204..b6e295e5cd 100644
--- a/crypto/property/property.c
+++ b/crypto/property/property.c
@@ -357,7 +357,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);
+        p2 = pq = ossl_parse_query(store->ctx, prop_query, 0);
     plp = ossl_ctx_global_properties(store->ctx, 0);
     if (plp != NULL && *plp != NULL) {
         if (pq == NULL) {
diff --git a/crypto/property/property_parse.c b/crypto/property/property_parse.c
index 9bc89f4d42..b182f00d0a 100644
--- a/crypto/property/property_parse.c
+++ b/crypto/property/property_parse.c
@@ -385,7 +385,8 @@ err:
     return res;
 }
 
-OSSL_PROPERTY_LIST *ossl_parse_query(OSSL_LIB_CTX *ctx, const char *s)
+OSSL_PROPERTY_LIST *ossl_parse_query(OSSL_LIB_CTX *ctx, const char *s,
+                                     int create_values)
 {
     STACK_OF(PROPERTY_DEFINITION) *sk;
     OSSL_PROPERTY_LIST *res = NULL;
@@ -425,7 +426,7 @@ OSSL_PROPERTY_LIST *ossl_parse_query(OSSL_LIB_CTX *ctx, const char *s)
             prop->v.str_val = ossl_property_true;
             goto skip_value;
         }
-        if (!parse_value(ctx, &s, prop, 0))
+        if (!parse_value(ctx, &s, prop, create_values))
             prop->type = PROPERTY_TYPE_VALUE_UNDEFINED;
 
 skip_value:
diff --git a/include/internal/property.h b/include/internal/property.h
index 6e8b1a8259..3d00e3cb66 100644
--- a/include/internal/property.h
+++ b/include/internal/property.h
@@ -23,7 +23,8 @@ int ossl_property_parse_init(OSSL_LIB_CTX *ctx);
 /* Property definition parser */
 OSSL_PROPERTY_LIST *ossl_parse_property(OSSL_LIB_CTX *ctx, const char *defn);
 /* Property query parser */
-OSSL_PROPERTY_LIST *ossl_parse_query(OSSL_LIB_CTX *ctx, const char *s);
+OSSL_PROPERTY_LIST *ossl_parse_query(OSSL_LIB_CTX *ctx, const char *s,
+                                     int create_values);
 /* Property checker of query vs definition */
 int ossl_property_match_count(const OSSL_PROPERTY_LIST *query,
                               const OSSL_PROPERTY_LIST *defn);
diff --git a/test/property_test.c b/test/property_test.c
index ab61d01107..add16ea629 100644
--- a/test/property_test.c
+++ b/test/property_test.c
@@ -114,7 +114,7 @@ static int test_property_parse(int n)
         && add_property_names("sky", "groan", "cold", "today", "tomorrow", "n",
                               NULL)
         && TEST_ptr(p = ossl_parse_property(NULL, parser_tests[n].defn))
-        && TEST_ptr(q = ossl_parse_query(NULL, parser_tests[n].query))
+        && TEST_ptr(q = ossl_parse_query(NULL, parser_tests[n].query, 0))
         && TEST_int_eq(ossl_property_match_count(q, p), parser_tests[n].e))
         r = 1;
     ossl_property_free(p);
@@ -123,6 +123,27 @@ static int test_property_parse(int n)
     return r;
 }
 
+static int test_property_query_value_create(void)
+{
+    OSSL_METHOD_STORE *store;
+    OSSL_PROPERTY_LIST *p = NULL, *q = NULL, *o = NULL;
+    int r = 0;
+
+    if (TEST_ptr(store = ossl_method_store_new(NULL))
+        && add_property_names("sky", NULL)
+        && TEST_ptr(p = ossl_parse_query(NULL, "sky=green", 0)) /* undefined */
+        && TEST_ptr(q = ossl_parse_query(NULL, "sky=green", 1)) /* creates */
+        && TEST_ptr(o = ossl_parse_query(NULL, "sky=green", 0)) /* defined */
+        && TEST_int_eq(ossl_property_match_count(q, p), -1)
+        && TEST_int_eq(ossl_property_match_count(q, o), 1))
+        r = 1;
+    ossl_property_free(o);
+    ossl_property_free(p);
+    ossl_property_free(q);
+    ossl_method_store_free(store);
+    return r;
+}
+
 static const struct {
     const char *q_global;
     const char *q_local;
@@ -160,8 +181,9 @@ static int test_property_merge(int n)
         && add_property_names("colour", "urn", "clouds", "pot", "day", "night",
                               NULL)
         && TEST_ptr(prop = ossl_parse_property(NULL, merge_tests[n].prop))
-        && TEST_ptr(q_global = ossl_parse_query(NULL, merge_tests[n].q_global))
-        && TEST_ptr(q_local = ossl_parse_query(NULL, merge_tests[n].q_local))
+        && TEST_ptr(q_global = ossl_parse_query(NULL, merge_tests[n].q_global,
+                                                0))
+        && TEST_ptr(q_local = ossl_parse_query(NULL, merge_tests[n].q_local, 0))
         && TEST_ptr(q_combined = ossl_property_merge(q_local, q_global))
         && TEST_int_ge(ossl_property_match_count(q_combined, prop), 0))
         r = 1;
@@ -220,7 +242,7 @@ static int test_definition_compares(int n)
     r = TEST_ptr(store = ossl_method_store_new(NULL))
         && add_property_names("alpha", "omega", NULL)
         && TEST_ptr(d = ossl_parse_property(NULL, definition_tests[n].defn))
-        && TEST_ptr(q = ossl_parse_query(NULL, definition_tests[n].query))
+        && TEST_ptr(q = ossl_parse_query(NULL, definition_tests[n].query, 0))
         && TEST_int_eq(ossl_property_match_count(q, d), definition_tests[n].e);
 
     ossl_property_free(d);
@@ -416,6 +438,7 @@ err:
 int setup_tests(void)
 {
     ADD_TEST(test_property_string);
+    ADD_TEST(test_property_query_value_create);
     ADD_ALL_TESTS(test_property_parse, OSSL_NELEM(parser_tests));
     ADD_ALL_TESTS(test_property_merge, OSSL_NELEM(merge_tests));
     ADD_TEST(test_property_defn_cache);


More information about the openssl-commits mailing list