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  | 
