Tiny tinkerings with FAQ
[u/mdw/putty] / ssh.c
diff --git a/ssh.c b/ssh.c
index 27b7216..e913571 100644 (file)
--- a/ssh.c
+++ b/ssh.c
@@ -607,12 +607,6 @@ static int ssh1_rdpkt(unsigned char **data, int *datalen)
        (*data)++, (*datalen)--;
     }
 
-#ifdef FWHACK
-    if (st->len == 0x52656d6f) {       /* "Remo"te server has closed ... */
-       st->len = 0x300;               /* big enough to carry to end */
-    }
-#endif
-
     st->pad = 8 - (st->len % 8);
     st->biglen = st->len + st->pad;
     pktin.length = st->len - 5;
@@ -770,11 +764,7 @@ static int ssh2_rdpkt(unsigned char **data, int *datalen)
        pktin.data[st->i] = *(*data)++;
        (*datalen)--;
     }
-#ifdef FWHACK
-    if (!memcmp(pktin.data, "Remo", 4)) {      /* "Remo"te server has closed ... */
-       /* FIXME */
-    }
-#endif
+
     if (sccipher)
        sccipher->decrypt(pktin.data, st->cipherblk);
 
@@ -2735,7 +2725,7 @@ static void ssh1_protocol(unsigned char *in, int inlen, int ispkt)
     if (eof_needed)
        ssh_special(TS_EOF);
 
-    ldisc_send(NULL, 0);              /* cause ldisc to notice changes */
+    ldisc_send(NULL, 0, 0);           /* cause ldisc to notice changes */
     ssh_send_ok = 1;
     ssh_channels = newtree234(ssh_channelcmp);
     while (1) {
@@ -3005,6 +2995,15 @@ static void ssh1_protocol(unsigned char *in, int inlen, int ispkt)
                 * if no pty is available or in other odd cases. Ignore */
            } else if (pktin.type == SSH1_SMSG_EXIT_STATUS) {
                send_packet(SSH1_CMSG_EXIT_CONFIRMATION, PKT_END);
+                /*
+                 * In case `helpful' firewalls or proxies tack
+                 * extra human-readable text on the end of the
+                 * session which we might mistake for another
+                 * encrypted packet, we close the session once
+                 * we've sent EXIT_CONFIRMATION.
+                 */
+                ssh_state = SSH_STATE_CLOSED;
+                crReturnV;
            } else {
                bombout(("Strange packet received: type %d", pktin.type));
                crReturnV;
@@ -4380,7 +4379,8 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
 
        if (pktin.type != SSH2_MSG_CHANNEL_SUCCESS) {
            if (pktin.type != SSH2_MSG_CHANNEL_FAILURE) {
-               bombout(("Server got confused by X11 forwarding request"));
+               bombout(("Unexpected response to X11 forwarding request:"
+                        " packet type %d", pktin.type));
                crReturnV;
            }
            logevent("X11 forwarding refused");
@@ -4468,7 +4468,9 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
 
                        if (pktin.type != SSH2_MSG_REQUEST_SUCCESS) {
                            if (pktin.type != SSH2_MSG_REQUEST_FAILURE) {
-                               bombout(("Server got confused by port forwarding request"));
+                               bombout(("Unexpected response to port "
+                                        "forwarding request: packet type %d",
+                                        pktin.type));
                                crReturnV;
                            }
                            logevent("Server refused this port forwarding");
@@ -4506,8 +4508,8 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
 
        if (pktin.type != SSH2_MSG_CHANNEL_SUCCESS) {
            if (pktin.type != SSH2_MSG_CHANNEL_FAILURE) {
-               bombout(
-                       ("Server got confused by agent forwarding request"));
+               bombout(("Unexpected response to agent forwarding request:"
+                        " packet type %d", pktin.type));
                crReturnV;
            }
            logevent("Agent forwarding refused");
@@ -4549,7 +4551,8 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
 
        if (pktin.type != SSH2_MSG_CHANNEL_SUCCESS) {
            if (pktin.type != SSH2_MSG_CHANNEL_FAILURE) {
-               bombout(("Server got confused by pty request"));
+               bombout(("Unexpected response to pty request:"
+                        " packet type %d", pktin.type));
                crReturnV;
            }
            c_write_str("Server refused to allocate pty\r\n");
@@ -4606,7 +4609,8 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
        } while (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST);
        if (pktin.type != SSH2_MSG_CHANNEL_SUCCESS) {
            if (pktin.type != SSH2_MSG_CHANNEL_FAILURE) {
-               bombout(("Server got confused by shell/command request"));
+               bombout(("Unexpected response to shell/command request:"
+                        " packet type %d", pktin.type));
                crReturnV;
            }
            /*
@@ -4637,7 +4641,7 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
     /*
      * Transfer data!
      */
-    ldisc_send(NULL, 0);              /* cause ldisc to notice changes */
+    ldisc_send(NULL, 0, 0);           /* cause ldisc to notice changes */
     ssh_send_ok = 1;
     while (1) {
        static int try_send;