X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/96621a840849b4afb6582424d2a1eea08a0be418..e571c4d7ffa1cf60330ac0c7e3fb8b62533ff60e:/ssh.c diff --git a/ssh.c b/ssh.c index fe5b05ef..8d310e1b 100644 --- a/ssh.c +++ b/ssh.c @@ -1128,7 +1128,9 @@ static void ssh_detect_bugs(char *vstring) { char *imp; /* pointer to implementation part */ imp = vstring; imp += strcspn(imp, "-"); + if (*imp) imp++; imp += strcspn(imp, "-"); + if (*imp) imp++; ssh_remote_bugs = 0; @@ -1156,10 +1158,11 @@ static void ssh_detect_bugs(char *vstring) { } static int do_ssh_init(unsigned char c) { - static char *vsp; + static char vslen; static char version[10]; - static char vstring[80]; - static char vlog[sizeof(vstring)+20]; + static char *vstring; + static int vstrsize; + static char *vlog; static int i; crBegin; @@ -1179,13 +1182,18 @@ static int do_ssh_init(unsigned char c) { crReturn(1); /* get another character */ } + vstring = smalloc(16); + vstrsize = 16; strcpy(vstring, "SSH-"); - vsp = vstring+4; + vslen = 4; i = 0; while (1) { crReturn(1); /* get another char */ - if (vsp < vstring+sizeof(vstring)-1) - *vsp++ = c; + if (vslen >= vstrsize-1) { + vstrsize += 16; + vstring = srealloc(vstring, vstrsize); + } + vstring[vslen++] = c; if (i >= 0) { if (c == '-') { version[i] = '\0'; @@ -1200,11 +1208,13 @@ static int do_ssh_init(unsigned char c) { ssh_agentfwd_enabled = FALSE; rdpkt2_state.incoming_sequence = 0; - *vsp = 0; + vstring[vslen] = 0; + vlog = smalloc(20 + vslen); sprintf(vlog, "Server version: %s", vstring); ssh_detect_bugs(vstring); vlog[strcspn(vlog, "\r\n")] = '\0'; logevent(vlog); + sfree(vlog); /* * Server version "1.99" means we can choose whether we use v1 @@ -1214,7 +1224,7 @@ static int do_ssh_init(unsigned char c) { /* * This is a v2 server. Begin v2 protocol. */ - char verstring[80]; + char verstring[80], vlog[100]; sprintf(verstring, "SSH-2.0-%s", sshver); SHA_Init(&exhashbase); /* @@ -1222,11 +1232,11 @@ static int do_ssh_init(unsigned char c) { */ sha_string(&exhashbase, verstring, strlen(verstring)); sha_string(&exhashbase, vstring, strcspn(vstring, "\r\n")); - sprintf(vstring, "%s\n", verstring); sprintf(vlog, "We claim version: %s", verstring); logevent(vlog); + strcat(verstring, "\n"); logevent("Using SSH protocol version 2"); - sk_write(s, vstring, strlen(vstring)); + sk_write(s, verstring, strlen(verstring)); ssh_protocol = ssh2_protocol; ssh_version = 2; s_rdpkt = ssh2_rdpkt; @@ -1234,20 +1244,23 @@ static int do_ssh_init(unsigned char c) { /* * This is a v1 server. Begin v1 protocol. */ - sprintf(vstring, "SSH-%s-%s\n", + char verstring[80], vlog[100]; + sprintf(verstring, "SSH-%s-%s", (ssh_versioncmp(version, "1.5") <= 0 ? version : "1.5"), sshver); - sprintf(vlog, "We claim version: %s", vstring); - vlog[strcspn(vlog, "\r\n")] = '\0'; + sprintf(vlog, "We claim version: %s", verstring); logevent(vlog); + strcat(verstring, "\n"); logevent("Using SSH protocol version 1"); - sk_write(s, vstring, strlen(vstring)); + sk_write(s, verstring, strlen(verstring)); ssh_protocol = ssh1_protocol; ssh_version = 1; s_rdpkt = ssh1_rdpkt; } ssh_state = SSH_STATE_BEFORE_SIZE; + sfree(vstring); + crFinish(0); } @@ -2234,7 +2247,8 @@ static void ssh1_protocol(unsigned char *in, int inlen, int ispkt) { if (c) { int closetype; closetype = (pktin.type == SSH1_MSG_CHANNEL_CLOSE ? 1 : 2); - send_packet(pktin.type, PKT_INT, c->remoteid, PKT_END); + if (!(c->closes & closetype)) + send_packet(pktin.type, PKT_INT, c->remoteid, PKT_END); if ((c->closes == 0) && (c->type == CHAN_X11)) { logevent("X11 connection closed"); assert(c->u.x11.s != NULL); @@ -2979,9 +2993,19 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt) while (pktin.type == SSH2_MSG_USERAUTH_BANNER) { char *banner; int size; - ssh2_pkt_getstring(&banner, &size); - if (banner) - c_write_untrusted(banner, size); + /* + * Don't show the banner if we're operating in + * non-verbose non-interactive mode. (It's probably + * a script, which means nobody will read the + * banner _anyway_, and moreover the printing of + * the banner will screw up processing on the + * output of (say) plink.) + */ + if (flags & (FLAG_VERBOSE | FLAG_INTERACTIVE)) { + ssh2_pkt_getstring(&banner, &size); + if (banner) + c_write_untrusted(banner, size); + } crWaitUntilV(ispkt); } if (pktin.type == SSH2_MSG_USERAUTH_SUCCESS) { @@ -3110,9 +3134,11 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt) continue; } - c_write_str("Authenticating with public key \""); - c_write(commentp, commentlen); - c_write_str("\" from agent\r\n"); + if (flags & FLAG_VERBOSE) { + c_write_str("Authenticating with public key \""); + c_write(commentp, commentlen); + c_write_str("\" from agent\r\n"); + } /* * Server is willing to accept the key.