diff options
author | Hans Nilsson <[email protected]> | 2018-10-29 17:09:43 +0100 |
---|---|---|
committer | Hans Nilsson <[email protected]> | 2018-12-03 10:17:36 +0100 |
commit | ece23c90df4d1844ede7cb524efb4df0fabb3f48 (patch) | |
tree | 40e6dceb0f63b520d1d7b79c68d535dbb33b52e7 | |
parent | d5632bfb023ac2c0ae25783f7eae3b060164de0b (diff) | |
download | otp-ece23c90df4d1844ede7cb524efb4df0fabb3f48.tar.gz otp-ece23c90df4d1844ede7cb524efb4df0fabb3f48.tar.bz2 otp-ece23c90df4d1844ede7cb524efb4df0fabb3f48.zip |
crypto: Fix valgrind error for keys with passwords in Engines
-rw-r--r-- | lib/crypto/c_src/crypto.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/lib/crypto/c_src/crypto.c b/lib/crypto/c_src/crypto.c index ecb716c98c..3d16c776c0 100644 --- a/lib/crypto/c_src/crypto.c +++ b/lib/crypto/c_src/crypto.c @@ -4524,7 +4524,7 @@ static int get_engine_and_key_id(ErlNifEnv *env, ERL_NIF_TERM key, char ** id, E static char *get_key_password(ErlNifEnv *env, ERL_NIF_TERM key) { ERL_NIF_TERM tmp_term; ErlNifBinary pwd_bin; - char *pwd; + char *pwd = NULL; if (enif_get_map_value(env, key, atom_password, &tmp_term) && enif_inspect_binary(env, tmp_term, &pwd_bin) && zero_terminate(pwd_bin, &pwd) @@ -4549,16 +4549,17 @@ static int get_pkey_private_key(ErlNifEnv *env, ERL_NIF_TERM algorithm, ERL_NIF_ #ifdef HAS_ENGINE_SUPPORT /* Use key stored in engine */ ENGINE *e; - char *id; + char *id = NULL; char *password; if (!get_engine_and_key_id(env, key, &id, &e)) return PKEY_BADARG; password = get_key_password(env, key); *pkey = ENGINE_load_private_key(e, id, NULL, password); + if (password) enif_free(password); + enif_free(id); if (!*pkey) return PKEY_BADARG; - enif_free(id); #else return PKEY_BADARG; #endif @@ -4636,16 +4637,17 @@ static int get_pkey_public_key(ErlNifEnv *env, ERL_NIF_TERM algorithm, ERL_NIF_T #ifdef HAS_ENGINE_SUPPORT /* Use key stored in engine */ ENGINE *e; - char *id; + char *id = NULL; char *password; if (!get_engine_and_key_id(env, key, &id, &e)) return PKEY_BADARG; password = get_key_password(env, key); *pkey = ENGINE_load_public_key(e, id, NULL, password); + if (password) enif_free(password); + enif_free(id); if (!pkey) return PKEY_BADARG; - enif_free(id); #else return PKEY_BADARG; #endif |