diff options
-rw-r--r-- | src/agent.c | 6 | ||||
-rw-r--r-- | src/pki.c | 20 |
2 files changed, 21 insertions, 5 deletions
diff --git a/src/agent.c b/src/agent.c index 2f03ce5..9566bdb 100644 --- a/src/agent.c +++ b/src/agent.c @@ -350,6 +350,7 @@ struct ssh_public_key_struct *agent_get_first_ident(struct ssh_session_struct *s struct ssh_public_key_struct *agent_get_next_ident(struct ssh_session_struct *session, char **comment) { struct ssh_key_struct *key; + struct ssh_public_key_struct *pkey; struct ssh_string_struct *blob = NULL; struct ssh_string_struct *tmp = NULL; int rc; @@ -397,7 +398,10 @@ struct ssh_public_key_struct *agent_get_next_ident(struct ssh_session_struct *se return NULL; } - return ssh_pki_convert_key_to_publickey(key); + pkey = ssh_pki_convert_key_to_publickey(key); + ssh_key_free(key); + + return pkey; } ssh_string agent_sign_data(struct ssh_session_struct *session, @@ -404,21 +404,33 @@ int ssh_pki_import_privkey_file(const char *filename, /* temporary function to migrate seemlessly to ssh_key */ ssh_public_key ssh_pki_convert_key_to_publickey(const ssh_key key) { ssh_public_key pub; + ssh_key tmp; if(key == NULL) { return NULL; } + tmp = ssh_key_dup(key); + if (tmp == NULL) { + return NULL; + } + pub = malloc(sizeof(struct ssh_public_key_struct)); if (pub == NULL) { + ssh_key_free(tmp); return NULL; } ZERO_STRUCTP(pub); - pub->dsa_pub = key->dsa; - pub->rsa_pub = key->rsa; - pub->type = key->type; - pub->type_c = key->type_c; + pub->type = tmp->type; + pub->type_c = tmp->type_c; + + pub->dsa_pub = tmp->dsa; + tmp->dsa = NULL; + pub->rsa_pub = tmp->rsa; + tmp->rsa = NULL; + + ssh_key_free(tmp); return pub; } |