]> asedeno.scripts.mit.edu Git - PuTTY.git/blobdiff - ssh.c
Simplifiy handling of stdin data in SSH-2.
[PuTTY.git] / ssh.c
diff --git a/ssh.c b/ssh.c
index ab1d78ab9567a0e205ed474d592411a09f874ce0..92dff019389d15f8abedfd765c0a6a41dfee4a2a 100644 (file)
--- a/ssh.c
+++ b/ssh.c
@@ -5751,6 +5751,48 @@ static void ssh1_msg_channel_close(Ssh ssh, struct Packet *pktin)
     }
 }
 
+/*
+ * Handle incoming data on an SSH-1 or SSH-2 agent-forwarding channel.
+ */
+static int ssh_agent_channel_data(struct ssh_channel *c, char *data,
+                                 int length)
+{
+    while (length > 0) {
+       if (c->u.a.lensofar < 4) {
+           unsigned int l = min(4 - c->u.a.lensofar, (unsigned)length);
+           memcpy(c->u.a.msglen + c->u.a.lensofar, data, l);
+           data += l;
+           length -= l;
+           c->u.a.lensofar += l;
+       }
+       if (c->u.a.lensofar == 4) {
+           c->u.a.totallen = 4 + GET_32BIT(c->u.a.msglen);
+           c->u.a.message = snewn(c->u.a.totallen, unsigned char);
+           memcpy(c->u.a.message, c->u.a.msglen, 4);
+       }
+       if (c->u.a.lensofar >= 4 && length > 0) {
+           unsigned int l = min(c->u.a.totallen - c->u.a.lensofar,
+                                (unsigned)length);
+           memcpy(c->u.a.message + c->u.a.lensofar, data, l);
+           data += l;
+           length -= l;
+           c->u.a.lensofar += l;
+       }
+       if (c->u.a.lensofar == c->u.a.totallen) {
+           void *reply;
+           int replylen;
+            c->u.a.outstanding_requests++;
+           if (agent_query(c->u.a.message, c->u.a.totallen, &reply, &replylen,
+                           ssh_agentf_callback, c))
+               ssh_agentf_callback(c, reply, replylen);
+           sfree(c->u.a.message);
+            c->u.a.message = NULL;
+           c->u.a.lensofar = 0;
+       }
+    }
+    return 0;   /* agent channels never back up */
+}
+
 static void ssh1_msg_channel_data(Ssh ssh, struct Packet *pktin)
 {
     /* Data sent down one of our channels. */
@@ -5772,47 +5814,7 @@ static void ssh1_msg_channel_data(Ssh ssh, struct Packet *pktin)
            bufsize = pfd_send(c->u.pfd.pf, p, len);
            break;
          case CHAN_AGENT:
-           /* Data for an agent message. Buffer it. */
-           while (len > 0) {
-               if (c->u.a.lensofar < 4) {
-                   unsigned int l = min(4 - c->u.a.lensofar, (unsigned)len);
-                   memcpy(c->u.a.msglen + c->u.a.lensofar, p,
-                          l);
-                   p += l;
-                   len -= l;
-                   c->u.a.lensofar += l;
-               }
-               if (c->u.a.lensofar == 4) {
-                   c->u.a.totallen =
-                       4 + GET_32BIT(c->u.a.msglen);
-                   c->u.a.message = snewn(c->u.a.totallen,
-                                          unsigned char);
-                   memcpy(c->u.a.message, c->u.a.msglen, 4);
-               }
-               if (c->u.a.lensofar >= 4 && len > 0) {
-                   unsigned int l =
-                       min(c->u.a.totallen - c->u.a.lensofar,
-                           (unsigned)len);
-                   memcpy(c->u.a.message + c->u.a.lensofar, p,
-                          l);
-                   p += l;
-                   len -= l;
-                   c->u.a.lensofar += l;
-               }
-               if (c->u.a.lensofar == c->u.a.totallen) {
-                   void *reply;
-                   int replylen;
-                    c->u.a.outstanding_requests++;
-                   if (agent_query(c->u.a.message,
-                                   c->u.a.totallen,
-                                   &reply, &replylen,
-                                   ssh_agentf_callback, c))
-                       ssh_agentf_callback(c, reply, replylen);
-                   sfree(c->u.a.message);
-                   c->u.a.lensofar = 0;
-               }
-           }
-           bufsize = 0;   /* agent channels never back up */
+           bufsize = ssh_agent_channel_data(c, p, len);
            break;
        }
        if (!c->throttling_conn && bufsize > SSH1_BUFFER_LIMIT) {
@@ -7309,7 +7311,7 @@ static void do_ssh2_transport(Ssh ssh, const void *vin, int inlen,
         * Make a note of any other host key formats that are available.
         */
        {
-           int i, j;
+           int i, j, nkeys = 0;
            char *list = NULL;
            for (i = 0; i < lenof(hostkey_algs); i++) {
                if (hostkey_algs[i].alg == ssh->hostkey)
@@ -7328,13 +7330,15 @@ static void do_ssh2_transport(Ssh ssh, const void *vin, int inlen,
                        newlist = dupprintf("%s", hostkey_algs[i].alg->name);
                    sfree(list);
                    list = newlist;
+                   nkeys++;
                }
            }
            if (list) {
                logeventf(ssh,
                          "Server also has %s host key%s, but we "
                          "don't know %s", list,
-                         j > 1 ? "s" : "", j > 1 ? "any of them" : "it");
+                         nkeys > 1 ? "s" : "",
+                         nkeys > 1 ? "any of them" : "it");
                sfree(list);
            }
        }
@@ -8077,48 +8081,7 @@ static void ssh2_msg_channel_data(Ssh ssh, struct Packet *pktin)
            bufsize = pfd_send(c->u.pfd.pf, data, length);
            break;
          case CHAN_AGENT:
-           while (length > 0) {
-               if (c->u.a.lensofar < 4) {
-                   unsigned int l = min(4 - c->u.a.lensofar,
-                                        (unsigned)length);
-                   memcpy(c->u.a.msglen + c->u.a.lensofar,
-                          data, l);
-                   data += l;
-                   length -= l;
-                   c->u.a.lensofar += l;
-               }
-               if (c->u.a.lensofar == 4) {
-                   c->u.a.totallen =
-                       4 + GET_32BIT(c->u.a.msglen);
-                   c->u.a.message = snewn(c->u.a.totallen,
-                                          unsigned char);
-                   memcpy(c->u.a.message, c->u.a.msglen, 4);
-               }
-               if (c->u.a.lensofar >= 4 && length > 0) {
-                   unsigned int l =
-                       min(c->u.a.totallen - c->u.a.lensofar,
-                           (unsigned)length);
-                   memcpy(c->u.a.message + c->u.a.lensofar,
-                          data, l);
-                   data += l;
-                   length -= l;
-                   c->u.a.lensofar += l;
-               }
-               if (c->u.a.lensofar == c->u.a.totallen) {
-                   void *reply;
-                   int replylen;
-                    c->u.a.outstanding_requests++;
-                   if (agent_query(c->u.a.message,
-                                   c->u.a.totallen,
-                                   &reply, &replylen,
-                                   ssh_agentf_callback, c))
-                       ssh_agentf_callback(c, reply, replylen);
-                   sfree(c->u.a.message);
-                    c->u.a.message = NULL;
-                   c->u.a.lensofar = 0;
-               }
-           }
-           bufsize = 0;
+           bufsize = ssh_agent_channel_data(c, data, length);
            break;
        }
        /*
@@ -9225,7 +9188,6 @@ static void do_ssh2_authconn(Ssh ssh, const unsigned char *in, int inlen,
        int pklen, alglen, commentlen;
        int siglen, retlen, len;
        char *q, *agentreq, *ret;
-       int try_send;
        struct Packet *pktout;
        Filename *keyfile;
 #ifndef NO_GSSAPI
@@ -10878,7 +10840,6 @@ static void do_ssh2_authconn(Ssh ssh, const unsigned char *in, int inlen,
        ssh->send_ok = 1;
     while (1) {
        crReturnV;
-       s->try_send = FALSE;
        if (pktin) {
 
            /*
@@ -10894,17 +10855,7 @@ static void do_ssh2_authconn(Ssh ssh, const unsigned char *in, int inlen,
             * We have spare data. Add it to the channel buffer.
             */
            ssh2_add_channel_data(ssh->mainchan, (char *)in, inlen);
-           s->try_send = TRUE;
-       }
-       if (s->try_send) {
-           int i;
-           struct ssh_channel *c;
-           /*
-            * Try to send data on all channels if we can.
-            */
-           for (i = 0; NULL != (c = index234(ssh->channels, i)); i++)
-                if (c->type != CHAN_SHARING)
-                    ssh2_try_send_and_unthrottle(ssh, c);
+           ssh2_try_send(ssh->mainchan);
        }
     }