File 3732-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