Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:25
erlang
2732-crypto-Refactor-map-creation-with-enif_mak...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 2732-crypto-Refactor-map-creation-with-enif_make_map_from.patch of Package erlang
From 7c51c1e02d9e3ce3515e46b14842bc7baae9401f Mon Sep 17 00:00:00 2001 From: Sverker Eriksson <sverker@erlang.org> Date: Tue, 24 Oct 2023 20:16:41 +0200 Subject: [PATCH 2/3] crypto: Refactor map creation with enif_make_map_from_arrays instead of repeated calls to enif_make_map_put --- lib/crypto/c_src/api_ng.c | 28 +++++++++------------- lib/crypto/c_src/cipher.c | 36 +++++++++++++++------------- lib/crypto/c_src/common.c | 25 ++++++++++---------- lib/crypto/c_src/hash.c | 19 +++++++-------- lib/crypto/c_src/info.c | 50 ++++++++++++++++----------------------- 5 files changed, 72 insertions(+), 86 deletions(-) diff --git a/lib/crypto/c_src/api_ng.c b/lib/crypto/c_src/api_ng.c index cc9259c71c..2c792d65dc 100644 --- a/lib/crypto/c_src/api_ng.c +++ b/lib/crypto/c_src/api_ng.c @@ -986,28 +986,22 @@ ERL_NIF_TERM ng_crypto_one_time_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ERL_NIF_TERM ng_crypto_get_data_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {/* (Context) -> map */ struct evp_cipher_ctx *ctx_res; + ERL_NIF_TERM keys[4] = { + atom_size, atom_padding_size, atom_padding_type, atom_encrypt + }; + ERL_NIF_TERM values[4]; ERL_NIF_TERM ret; + int ok; if (!enif_get_resource(env, argv[0], (ErlNifResourceType*)evp_cipher_ctx_rtype, (void**)&ctx_res)) return EXCP_BADARG_N(env, 0, "Bad State"); - ret = enif_make_new_map(env); - - enif_make_map_put(env, ret, atom_size, - enif_make_int(env, ctx_res->size), - &ret); - - enif_make_map_put(env, ret, atom_padding_size, - enif_make_int(env, ctx_res->padded_size), - &ret); - - enif_make_map_put(env, ret, atom_padding_type, - ctx_res->padding, - &ret); - - enif_make_map_put(env, ret, atom_encrypt, - (ctx_res->encflag) ? atom_true : atom_false, - &ret); + values[0] = enif_make_int(env, ctx_res->size); + values[1] = enif_make_int(env, ctx_res->padded_size); + values[2] = ctx_res->padding; + values[3] = (ctx_res->encflag) ? atom_true : atom_false; + ok = enif_make_map_from_arrays(env, keys, values, 4, &ret); + ASSERT(ok); (void)ok; return ret; } diff --git a/lib/crypto/c_src/cipher.c b/lib/crypto/c_src/cipher.c index 30f4c595ff..4619a7700c 100644 --- a/lib/crypto/c_src/cipher.c +++ b/lib/crypto/c_src/cipher.c @@ -246,6 +246,9 @@ ERL_NIF_TERM cipher_info_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[] ERL_NIF_TERM ret, ret_mode; unsigned type; unsigned long mode; + ERL_NIF_TERM keys[6]; + ERL_NIF_TERM vals[6]; + int ok; if ((cipherp = get_cipher_type_no_key(argv[0])) == NULL) return enif_make_badarg(env); @@ -255,26 +258,22 @@ ERL_NIF_TERM cipher_info_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[] if ((cipher = cipherp->cipher.p) == NULL) return enif_raise_exception(env, atom_notsup); - ret = enif_make_new_map(env); - type = EVP_CIPHER_type(cipher); - enif_make_map_put(env, ret, atom_type, - type == NID_undef ? atom_undefined : enif_make_int(env, type), - &ret); - - enif_make_map_put(env, ret, atom_key_length, - enif_make_int(env, EVP_CIPHER_key_length(cipher)), &ret); - enif_make_map_put(env, ret, atom_iv_length, - enif_make_int(env, EVP_CIPHER_iv_length(cipher)), &ret); - enif_make_map_put(env, ret, atom_block_size, - enif_make_int(env, EVP_CIPHER_block_size(cipher)), &ret); - enif_make_map_put(env, ret, atom_prop_aead, + + keys[0] = atom_type; + vals[0] = (type == NID_undef ? atom_undefined : enif_make_int(env, type)); + keys[1] = atom_key_length; + vals[1] = enif_make_int(env, EVP_CIPHER_key_length(cipher)); + keys[2] = atom_iv_length; + vals[2] = enif_make_int(env, EVP_CIPHER_iv_length(cipher)); + keys[3] = atom_block_size; + vals[3] = enif_make_int(env, EVP_CIPHER_block_size(cipher)); + keys[4] = atom_prop_aead; #if defined(HAVE_AEAD) - (((EVP_CIPHER_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER) != 0) ? atom_true : atom_false), + vals[4] = (((EVP_CIPHER_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER) != 0) ? atom_true : atom_false); #else - atom_false, + vals[4] = atom_false; #endif - &ret); mode = EVP_CIPHER_mode(cipher); switch (mode) { @@ -338,8 +337,11 @@ ERL_NIF_TERM cipher_info_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[] ret_mode = atom_undefined; break; } + keys[5] = atom_mode; + vals[5] = ret_mode; - enif_make_map_put(env, ret, atom_mode, ret_mode, &ret); + ok = enif_make_map_from_arrays(env, keys, vals, 6, &ret); + ASSERT(ok); (void)ok; return ret; } diff --git a/lib/crypto/c_src/common.c b/lib/crypto/c_src/common.c index 7ce12682db..56595b10b5 100644 --- a/lib/crypto/c_src/common.c +++ b/lib/crypto/c_src/common.c @@ -61,19 +61,18 @@ ERL_NIF_TERM raise_exception(ErlNifEnv* env, ERL_NIF_TERM id, int arg_num, char* #endif /* Make the data for exception */ - file_info = enif_make_new_map(env); - enif_make_map_put(env, file_info, - enif_make_atom(env,"c_file_name"), - enif_make_string(env, file, (ERL_NIF_LATIN1)), - &file_info); - enif_make_map_put(env, file_info, - enif_make_atom(env,"c_file_line_num"), - enif_make_int(env, line), - &file_info); - enif_make_map_put(env, file_info, - enif_make_atom(env,"c_function_arg_num"), - enif_make_int(env, arg_num), - &file_info); + { + ERL_NIF_TERM keys[3], vals[3]; + int ok; + keys[0] = enif_make_atom(env,"c_file_name"); + vals[0] = enif_make_string(env, file, ERL_NIF_LATIN1); + keys[1] = enif_make_atom(env,"c_file_line_num"); + vals[1] = enif_make_int(env, line); + keys[2] = enif_make_atom(env,"c_function_arg_num"); + vals[2] = enif_make_int(env, arg_num); + ok = enif_make_map_from_arrays(env, keys, vals, 3, &file_info); + ASSERT(ok); (void)ok; + } exception = enif_make_tuple3(env, id, diff --git a/lib/crypto/c_src/hash.c b/lib/crypto/c_src/hash.c index e80f2a2522..b0c1a00fda 100644 --- a/lib/crypto/c_src/hash.c +++ b/lib/crypto/c_src/hash.c @@ -73,7 +73,10 @@ ERL_NIF_TERM hash_info_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {/* (Type) */ struct digest_type_t *digp = NULL; const EVP_MD *md; - ERL_NIF_TERM ret; + ERL_NIF_TERM keys[3] = { atom_type, atom_size, atom_block_size }; + ERL_NIF_TERM values[3]; + ERL_NIF_TERM ret; + int ok; ASSERT(argc == 1); @@ -85,15 +88,11 @@ ERL_NIF_TERM hash_info_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) if ((md = digp->md.p) == NULL) return atom_notsup; - ret = enif_make_new_map(env); - - enif_make_map_put(env, ret, atom_type, - enif_make_int(env, EVP_MD_type(md)), &ret); - enif_make_map_put(env, ret, atom_size, - enif_make_int(env, EVP_MD_size(md)), &ret); - enif_make_map_put(env, ret, atom_block_size, - enif_make_int(env, EVP_MD_block_size(md)), &ret); - + values[0] = enif_make_int(env, EVP_MD_type(md)); + values[1] = enif_make_int(env, EVP_MD_size(md)); + values[2] = enif_make_int(env, EVP_MD_block_size(md)); + ok = enif_make_map_from_arrays(env, keys, values, 3, &ret); + ASSERT(ok); (void)ok; return ret; } diff --git a/lib/crypto/c_src/info.c b/lib/crypto/c_src/info.c index f78984b7e6..ce764f0df5 100644 --- a/lib/crypto/c_src/info.c +++ b/lib/crypto/c_src/info.c @@ -107,41 +107,33 @@ const char* resource_name(const char *name, ErlNifBinary* buf) ERL_NIF_TERM info_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {/* () */ + ERL_NIF_TERM keys[5], vals[5]; ERL_NIF_TERM ret; - - ret = enif_make_new_map(env); - - enif_make_map_put(env, ret, - enif_make_atom(env,"compile_type"), - enif_make_atom(env, COMPILE_TYPE), - &ret); - - enif_make_map_put(env, ret, - enif_make_atom(env, "link_type"), - enif_make_atom(env, LINK_TYPE), - &ret); - - enif_make_map_put(env, ret, - enif_make_atom(env, "cryptolib_version_compiled"), + size_t cnt; + int ok; + + keys[0] = enif_make_atom(env,"compile_type"); + vals[0] = enif_make_atom(env, COMPILE_TYPE); + keys[1] = enif_make_atom(env, "link_type"); + vals[1] = enif_make_atom(env, LINK_TYPE); + keys[2] = enif_make_atom(env, "cryptolib_version_compiled"); #ifdef OPENSSL_VERSION_TEXT - enif_make_string(env, OPENSSL_VERSION_TEXT, ERL_NIF_LATIN1), + vals[2] = enif_make_string(env, OPENSSL_VERSION_TEXT, ERL_NIF_LATIN1); #else - /* Just to be really safe for versions/clones unknown to me lacking this macro */ - atom_undefined, + /* Just to be really safe for versions/clones unknown to me lacking this macro */ + vals[2] = atom_undefined; #endif - &ret); - - enif_make_map_put(env, ret, - enif_make_atom(env, "cryptolib_version_linked"), - enif_make_string(env, OpenSSL_version(OPENSSL_VERSION), ERL_NIF_LATIN1), - &ret); - + keys[3] = enif_make_atom(env, "cryptolib_version_linked"); + vals[3] = enif_make_string(env, OpenSSL_version(OPENSSL_VERSION), ERL_NIF_LATIN1); #ifdef HAS_3_0_API - enif_make_map_put(env, ret, - enif_make_atom(env, "fips_provider_available"), - OSSL_PROVIDER_available(NULL, "fips") ? atom_true : atom_false, - &ret); + keys[4] = enif_make_atom(env, "fips_provider_available"); + vals[4] = OSSL_PROVIDER_available(NULL, "fips") ? atom_true : atom_false; + cnt = 5; +#else + cnt = 4; #endif + ok = enif_make_map_from_arrays(env, keys, vals, cnt, &ret); + ASSERT(ok); (void)ok; return ret; } -- 2.35.3
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor