aboutsummaryrefslogtreecommitdiff
path: root/lib/ssh.c
diff options
context:
space:
mode:
authorJames Housley <jim@thehousleys.net>2007-06-19 11:31:33 +0000
committerJames Housley <jim@thehousleys.net>2007-06-19 11:31:33 +0000
commitf0b361ecc16b124813cb494e9d193abd442c1be0 (patch)
tree282b19c6edbb0bdc8f51c5f56a6cc4f2344ed826 /lib/ssh.c
parentdf7eed16ddc43255cc1e07dab81ec1e79a44e0fb (diff)
Change rsa and rsa_pub from static arrays in ssh_conn to be dynamically
allocated when needed
Diffstat (limited to 'lib/ssh.c')
-rw-r--r--lib/ssh.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/lib/ssh.c b/lib/ssh.c
index 05f101411..108c0156a 100644
--- a/lib/ssh.c
+++ b/lib/ssh.c
@@ -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);