diff options
author | James Housley <jim@thehousleys.net> | 2007-06-19 11:31:33 +0000 |
---|---|---|
committer | James Housley <jim@thehousleys.net> | 2007-06-19 11:31:33 +0000 |
commit | f0b361ecc16b124813cb494e9d193abd442c1be0 (patch) | |
tree | 282b19c6edbb0bdc8f51c5f56a6cc4f2344ed826 /lib | |
parent | df7eed16ddc43255cc1e07dab81ec1e79a44e0fb (diff) |
Change rsa and rsa_pub from static arrays in ssh_conn to be dynamically
allocated when needed
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ssh.c | 34 | ||||
-rw-r--r-- | lib/urldata.h | 4 |
2 files changed, 24 insertions, 14 deletions
@@ -369,24 +369,21 @@ static CURLcode ssh_statemach_act(struct connectdata *conn) (strstr(sshc->authlist, "publickey") != NULL)) { char *home; - sshc->rsa_pub[0] = sshc->rsa[0] = '\0'; + sshc->rsa_pub = sshc->rsa = NULL; /* To ponder about: should really the lib be messing about with the HOME environment variable etc? */ home = curl_getenv("HOME"); if (data->set.ssh_public_key) - snprintf(sshc->rsa_pub, sizeof(sshc->rsa_pub), "%s", - data->set.ssh_public_key); + sshc->rsa_pub = aprintf("%s", data->set.ssh_public_key); else if (home) - snprintf(sshc->rsa_pub, sizeof(sshc->rsa_pub), "%s/.ssh/id_dsa.pub", - home); + sshc->rsa_pub = aprintf("%s/.ssh/id_dsa.pub", home); if (data->set.ssh_private_key) - snprintf(sshc->rsa, sizeof(sshc->rsa), "%s", - data->set.ssh_private_key); + sshc->rsa = aprintf("%s", data->set.ssh_private_key); else if (home) - snprintf(sshc->rsa, sizeof(sshc->rsa), "%s/.ssh/id_dsa", home); + sshc->rsa = aprintf("%s/.ssh/id_dsa", home); sshc->passphrase = data->set.key_passwd; if (!sshc->passphrase) @@ -394,12 +391,21 @@ static CURLcode ssh_statemach_act(struct connectdata *conn) curl_free(home); - infof(conn->data, "Using ssh public key file %s\n", sshc->rsa_pub); - infof(conn->data, "Using ssh private key file %s\n", sshc->rsa); + if (sshc->rsa_pub) { + infof(conn->data, "Using ssh public key file %s\n", sshc->rsa_pub); + } + if (sshc->rsa) { + infof(conn->data, "Using ssh private key file %s\n", sshc->rsa); + } - if (sshc->rsa_pub[0]) { + if (sshc->rsa_pub && sshc->rsa_pub) { state(conn, SSH_AUTH_PKEY); } else { + /* One or both aprint()'s might have failed, + move on to password authentication */ + curl_free(sshc->rsa_pub); + curl_free(sshc->rsa); + state(conn, SSH_AUTH_PASS_INIT); } } else { @@ -416,7 +422,11 @@ static CURLcode ssh_statemach_act(struct connectdata *conn) if (rc == LIBSSH2_ERROR_EAGAIN) { break; } - else if (rc == 0) { + + curl_free(sshc->rsa_pub); + curl_free(sshc->rsa); + + if (rc == 0) { sshc->authed = TRUE; infof(conn->data, "Initialized SSH public key authentication\n"); state(conn, SSH_AUTH_DONE); diff --git a/lib/urldata.h b/lib/urldata.h index d4d0bb05b..f52f96fbd 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -451,8 +451,8 @@ struct SSHPROTO { struct ssh_conn { const char *authlist; /* List of auth. methods, managed by libssh2 */ const char *passphrase; - char rsa_pub[PATH_MAX]; - char rsa[PATH_MAX]; + char *rsa_pub; + char *rsa; bool authed; sshstate state; /* always use ssh.c:state() to change state! */ CURLcode actualCode; /* the actual error code */ |