Harvey Kwok observes that EnumPrinters() can sometimes fail to fill
[u/mdw/putty] / ssh.c
diff --git a/ssh.c b/ssh.c
index f78ffbe..38f1495 100644 (file)
--- a/ssh.c
+++ b/ssh.c
 #define SSH1_SMSG_AUTH_CCARD_CHALLENGE            71   /* 0x47 */
 #define SSH1_CMSG_AUTH_CCARD_RESPONSE             72   /* 0x48 */
 
+#define SSH1_AUTH_RHOSTS                          1    /* 0x1 */
+#define SSH1_AUTH_RSA                             2    /* 0x2 */
+#define SSH1_AUTH_PASSWORD                        3    /* 0x3 */
+#define SSH1_AUTH_RHOSTS_RSA                      4    /* 0x4 */
 #define SSH1_AUTH_TIS                             5    /* 0x5 */
 #define SSH1_AUTH_CCARD                           16   /* 0x10 */
 
@@ -3066,6 +3070,8 @@ static int do_ssh1_login(Ssh ssh, unsigned char *in, int inlen,
     ssh->v1_remote_protoflags = ssh_pkt_getuint32(pktin);
     s->supported_ciphers_mask = ssh_pkt_getuint32(pktin);
     s->supported_auths_mask = ssh_pkt_getuint32(pktin);
+    if ((ssh->remote_bugs & BUG_CHOKES_ON_RSA))
+       s->supported_auths_mask &= ~(1 << SSH1_AUTH_RSA);
 
     ssh->v1_local_protoflags =
        ssh->v1_remote_protoflags & SSH1_PROTOFLAGS_SUPPORTED;
@@ -3319,7 +3325,7 @@ static int do_ssh1_login(Ssh ssh, unsigned char *in, int inlen,
 
     crWaitUntil(pktin);
 
-    if ((ssh->remote_bugs & BUG_CHOKES_ON_RSA)) {
+    if ((s->supported_auths_mask & (1 << SSH1_AUTH_RSA)) == 0) {
        /* We must not attempt PK auth. Pretend we've already tried it. */
        s->tried_publickey = s->tried_agent = 1;
     } else {
@@ -3776,6 +3782,10 @@ static int do_ssh1_login(Ssh ssh, unsigned char *in, int inlen,
            }
        }
        if (s->pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) {
+           if ((s->supported_auths_mask & (1 << SSH1_AUTH_PASSWORD)) == 0) {
+               bombout(("No supported authentication methods available"));
+               crStop(0);
+           }
            s->cur_prompt->to_server = TRUE;
            s->cur_prompt->name = dupstr("SSH password");
            add_prompt(s->cur_prompt, dupprintf("%.90s@%.90s's password: ",
@@ -9082,8 +9092,9 @@ static void ssh_unthrottle(void *handle, int bufsize)
            ssh1_throttle(ssh, -1);
        }
     } else {
-       ssh2_set_window(ssh->mainchan,
-                       ssh->mainchan->v.v2.locmaxwin - bufsize);
+       if (ssh->mainchan)
+           ssh2_set_window(ssh->mainchan,
+                           ssh->mainchan->v.v2.locmaxwin - bufsize);
     }
 }