diff options
author | Pauli <pauli@openssl.org> | 2022-02-25 03:37:08 +0100 |
---|---|---|
committer | Pauli <pauli@openssl.org> | 2022-02-28 06:20:33 +0100 |
commit | af788ad6c3624ccc4b49778a9ded2487b9dbeedd (patch) | |
tree | b1ddb71a3efc8b6683affdb308b325c5b77b36a1 /crypto | |
parent | VMS: copy prologue/epilogue headers when header files are generated (diff) | |
download | openssl-af788ad6c3624ccc4b49778a9ded2487b9dbeedd.tar.xz openssl-af788ad6c3624ccc4b49778a9ded2487b9dbeedd.zip |
fetch: convert a NULL property query to ""
Previously, a NULL property query was never cached and this lead to a
performance degregation. Now, such a query is converted to an empty string
and cached.
Fixes #17752
Fixes https://github.openssl.org/openssl/openssl/issues/26
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/17769)
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/encode_decode/decoder_meth.c | 7 | ||||
-rw-r--r-- | crypto/encode_decode/encoder_meth.c | 7 | ||||
-rw-r--r-- | crypto/evp/evp_fetch.c | 8 | ||||
-rw-r--r-- | crypto/property/property.c | 8 | ||||
-rw-r--r-- | crypto/store/store_meth.c | 7 |
5 files changed, 19 insertions, 18 deletions
diff --git a/crypto/encode_decode/decoder_meth.c b/crypto/encode_decode/decoder_meth.c index 25407b8999..2bed9e1bb3 100644 --- a/crypto/encode_decode/decoder_meth.c +++ b/crypto/encode_decode/decoder_meth.c @@ -339,6 +339,7 @@ inner_ossl_decoder_fetch(struct decoder_data_st *methdata, int id, { OSSL_METHOD_STORE *store = get_decoder_store(methdata->libctx); OSSL_NAMEMAP *namemap = ossl_namemap_stored(methdata->libctx); + const char *const propq = properties != NULL ? properties : ""; void *method = NULL; int unsupported = 0; @@ -367,7 +368,7 @@ inner_ossl_decoder_fetch(struct decoder_data_st *methdata, int id, unsupported = 1; if (id == 0 - || !ossl_method_store_cache_get(store, NULL, id, properties, &method)) { + || !ossl_method_store_cache_get(store, NULL, id, propq, &method)) { OSSL_METHOD_CONSTRUCT_METHOD mcm = { get_tmp_decoder_store, get_decoder_from_store, @@ -379,7 +380,7 @@ inner_ossl_decoder_fetch(struct decoder_data_st *methdata, int id, methdata->id = id; methdata->names = name; - methdata->propquery = properties; + methdata->propquery = propq; methdata->flag_construct_error_occurred = 0; if ((method = ossl_method_construct(methdata->libctx, OSSL_OP_DECODER, &prov, 0 /* !force_cache */, @@ -393,7 +394,7 @@ inner_ossl_decoder_fetch(struct decoder_data_st *methdata, int id, if (id == 0 && name != NULL) id = ossl_namemap_name2num(namemap, name); if (id != 0) - ossl_method_store_cache_set(store, prov, id, properties, method, + ossl_method_store_cache_set(store, prov, id, propq, method, up_ref_decoder, free_decoder); } diff --git a/crypto/encode_decode/encoder_meth.c b/crypto/encode_decode/encoder_meth.c index 43eca755ac..57b2f998e2 100644 --- a/crypto/encode_decode/encoder_meth.c +++ b/crypto/encode_decode/encoder_meth.c @@ -349,6 +349,7 @@ inner_ossl_encoder_fetch(struct encoder_data_st *methdata, int id, { OSSL_METHOD_STORE *store = get_encoder_store(methdata->libctx); OSSL_NAMEMAP *namemap = ossl_namemap_stored(methdata->libctx); + const char *const propq = properties != NULL ? properties : ""; void *method = NULL; int unsupported = 0; @@ -377,7 +378,7 @@ inner_ossl_encoder_fetch(struct encoder_data_st *methdata, int id, unsupported = 1; if (id == 0 - || !ossl_method_store_cache_get(store, NULL, id, properties, &method)) { + || !ossl_method_store_cache_get(store, NULL, id, propq, &method)) { OSSL_METHOD_CONSTRUCT_METHOD mcm = { get_tmp_encoder_store, get_encoder_from_store, @@ -389,7 +390,7 @@ inner_ossl_encoder_fetch(struct encoder_data_st *methdata, int id, methdata->id = id; methdata->names = name; - methdata->propquery = properties; + methdata->propquery = propq; methdata->flag_construct_error_occurred = 0; if ((method = ossl_method_construct(methdata->libctx, OSSL_OP_ENCODER, &prov, 0 /* !force_cache */, @@ -402,7 +403,7 @@ inner_ossl_encoder_fetch(struct encoder_data_st *methdata, int id, */ if (id == 0) id = ossl_namemap_name2num(namemap, name); - ossl_method_store_cache_set(store, prov, id, properties, method, + ossl_method_store_cache_set(store, prov, id, propq, method, up_ref_encoder, free_encoder); } diff --git a/crypto/evp/evp_fetch.c b/crypto/evp/evp_fetch.c index 80da3fa4bf..ea32cd5dd2 100644 --- a/crypto/evp/evp_fetch.c +++ b/crypto/evp/evp_fetch.c @@ -247,6 +247,7 @@ inner_evp_generic_fetch(struct evp_method_data_st *methdata, { OSSL_METHOD_STORE *store = get_evp_method_store(methdata->libctx); OSSL_NAMEMAP *namemap = ossl_namemap_stored(methdata->libctx); + const char *const propq = properties != NULL ? properties : ""; uint32_t meth_id = 0; void *method = NULL; int unsupported = 0; @@ -299,8 +300,7 @@ inner_evp_generic_fetch(struct evp_method_data_st *methdata, unsupported = 1; if (meth_id == 0 - || !ossl_method_store_cache_get(store, prov, meth_id, properties, - &method)) { + || !ossl_method_store_cache_get(store, prov, meth_id, propq, &method)) { OSSL_METHOD_CONSTRUCT_METHOD mcm = { get_tmp_evp_method_store, get_evp_method_from_store, @@ -312,7 +312,7 @@ inner_evp_generic_fetch(struct evp_method_data_st *methdata, methdata->operation_id = operation_id; methdata->name_id = name_id; methdata->names = name; - methdata->propquery = properties; + methdata->propquery = propq; methdata->method_from_algorithm = new_method; methdata->refcnt_up_method = up_ref_method; methdata->destruct_method = free_method; @@ -330,7 +330,7 @@ inner_evp_generic_fetch(struct evp_method_data_st *methdata, name_id = ossl_namemap_name2num(namemap, name); meth_id = evp_method_id(name_id, operation_id); if (name_id != 0) - ossl_method_store_cache_set(store, prov, meth_id, properties, + ossl_method_store_cache_set(store, prov, meth_id, propq, method, up_ref_method, free_method); } diff --git a/crypto/property/property.c b/crypto/property/property.c index c087e741ed..2967b80a09 100644 --- a/crypto/property/property.c +++ b/crypto/property/property.c @@ -596,7 +596,7 @@ int ossl_method_store_cache_get(OSSL_METHOD_STORE *store, OSSL_PROVIDER *prov, QUERY elem, *r; int res = 0; - if (nid <= 0 || store == NULL) + if (nid <= 0 || store == NULL || prop_query == NULL) return 0; if (!ossl_property_read_lock(store)) @@ -605,7 +605,7 @@ int ossl_method_store_cache_get(OSSL_METHOD_STORE *store, OSSL_PROVIDER *prov, if (alg == NULL) goto err; - elem.query = prop_query != NULL ? prop_query : ""; + elem.query = prop_query; elem.provider = prov; r = lh_QUERY_retrieve(alg->cache, &elem); if (r == NULL) @@ -629,10 +629,8 @@ int ossl_method_store_cache_set(OSSL_METHOD_STORE *store, OSSL_PROVIDER *prov, size_t len; int res = 1; - if (nid <= 0 || store == NULL) + if (nid <= 0 || store == NULL || prop_query == NULL) return 0; - if (prop_query == NULL) - return 1; if (!ossl_assert(prov != NULL)) return 0; diff --git a/crypto/store/store_meth.c b/crypto/store/store_meth.c index 10b56bc685..4d18645b21 100644 --- a/crypto/store/store_meth.c +++ b/crypto/store/store_meth.c @@ -280,6 +280,7 @@ inner_loader_fetch(struct loader_data_st *methdata, int id, { OSSL_METHOD_STORE *store = get_loader_store(methdata->libctx); OSSL_NAMEMAP *namemap = ossl_namemap_stored(methdata->libctx); + const char *const propq = properties != NULL ? properties : ""; void *method = NULL; int unsupported = 0; @@ -309,7 +310,7 @@ inner_loader_fetch(struct loader_data_st *methdata, int id, unsupported = 1; if (id == 0 - || !ossl_method_store_cache_get(store, NULL, id, properties, &method)) { + || !ossl_method_store_cache_get(store, NULL, id, propq, &method)) { OSSL_METHOD_CONSTRUCT_METHOD mcm = { get_tmp_loader_store, get_loader_from_store, @@ -321,7 +322,7 @@ inner_loader_fetch(struct loader_data_st *methdata, int id, methdata->scheme_id = id; methdata->scheme = scheme; - methdata->propquery = properties; + methdata->propquery = propq; methdata->flag_construct_error_occurred = 0; if ((method = ossl_method_construct(methdata->libctx, OSSL_OP_STORE, &prov, 0 /* !force_cache */, @@ -333,7 +334,7 @@ inner_loader_fetch(struct loader_data_st *methdata, int id, */ if (id == 0) id = ossl_namemap_name2num(namemap, scheme); - ossl_method_store_cache_set(store, prov, id, properties, method, + ossl_method_store_cache_set(store, prov, id, propq, method, up_ref_loader, free_loader); } |