]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
Change rsa and rsa_pub from static arrays in ssh_conn to be dynamically
authorJames Housley <jim@thehousleys.net>
Tue, 19 Jun 2007 11:31:33 +0000 (11:31 +0000)
committerJames Housley <jim@thehousleys.net>
Tue, 19 Jun 2007 11:31:33 +0000 (11:31 +0000)
allocated when needed

lib/ssh.c
lib/urldata.h

index 05f101411964c157f5e45fd7a18c8dae4265cabc..108c0156ac409859cd8f1556dd19419cea0ea9ce 100644 (file)
--- 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);
index d4d0bb05b5f2274381c56302a6dbb0e88fc6d1f4..f52f96fbdf89095814d4bdd05837cf94aaf38b57 100644 (file)
@@ -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 */