X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/0df73905d1f5b678d5f6eac58712b6cce2f77434..a4fc0d745f93443ac24698c6bec5c6b5f5da2257:/ssh.c diff --git a/ssh.c b/ssh.c index 270d76b0..6a653e5e 100644 --- a/ssh.c +++ b/ssh.c @@ -19,9 +19,21 @@ if ((flags & FLAG_STDERR) && (flags & FLAG_VERBOSE)) \ { fprintf(stderr, "%s\n", s); fflush(stderr); } } +/* logevent, only printf-formatted. */ +void logeventf(char *fmt, ...) +{ + va_list ap; + char stuff[200]; + + va_start(ap, fmt); + vsprintf(stuff, fmt, ap); + va_end(ap); + logevent(stuff); +} + #define bombout(msg) ( ssh_state = SSH_STATE_CLOSED, \ (s ? sk_close(s), s = NULL : 0), \ - connection_fatal msg ) + logeventf msg, connection_fatal msg ) #define SSH1_MSG_DISCONNECT 1 /* 0x1 */ #define SSH1_SMSG_PUBLIC_KEY 2 /* 0x2 */ @@ -817,7 +829,7 @@ static int ssh1_rdpkt(unsigned char **data, int *datalen) msglen = sizeof(buf) - nowlen - 1; memcpy(buf + nowlen, pktin.body + 4, msglen); buf[nowlen + msglen] = '\0'; - logevent(buf); + /* logevent(buf); (this is now done within the bombout macro) */ bombout(("Server sent disconnect message:\n\"%s\"", buf+nowlen)); crReturn(0); } @@ -1779,6 +1791,7 @@ static int ssh_closing(Plug plug, char *error_msg, int error_code, } if (error_msg) { /* A socket error has occurred. */ + logevent(error_msg); connection_fatal(error_msg); } else { /* Otherwise, the remote side closed the connection normally. */ @@ -1872,9 +1885,11 @@ static char *connect_to_host(char *host, int port, char **realhost, int nodelay) sprintf(buf, "Connecting to %.100s port %d", addrbuf, port); logevent(buf); } - s = sk_new(addr, port, 0, 1, nodelay, &fn_table_ptr); - if ((err = sk_socket_error(s))) + s = new_connection(addr, *realhost, port, 0, 1, nodelay, &fn_table_ptr); + if ((err = sk_socket_error(s))) { + s = NULL; return err; + } #ifdef FWHACK sk_write(s, "connect ", 8); @@ -2166,8 +2181,7 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt) break; case 3: case 4: - random_save_seed(); - exit(0); + cleanup_exit(0); break; default: if (((c >= ' ' && c <= '~') || @@ -2442,6 +2456,7 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt) send_packet(SSH1_MSG_DISCONNECT, PKT_STR, "No more passwords available to try", PKT_END); + logevent("Unable to authenticate"); connection_fatal("Unable to authenticate"); ssh_state = SSH_STATE_CLOSED; crReturn(1); @@ -2472,8 +2487,7 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt) break; case 3: case 4: - random_save_seed(); - exit(0); + cleanup_exit(0); break; default: if (pos < sizeof(password)-1) @@ -2819,9 +2833,10 @@ static void ssh1_protocol(unsigned char *in, int inlen, int ispkt) { char type, *e; int n; - int sport,dport; + int sport,dport,sserv,dserv; char sports[256], dports[256], host[256]; char buf[1024]; + struct servent *se; ssh_rportfwds = newtree234(ssh_rportcmp_ssh1); /* Add port forwardings. */ @@ -2846,12 +2861,43 @@ static void ssh1_protocol(unsigned char *in, int inlen, int ispkt) dports[n] = 0; e++; dport = atoi(dports); + dserv = 0; + if (dport == 0) { + dserv = 1; + se = getservbyname(dports, NULL); + if (se != NULL) { + dport = ntohs(se->s_port); + } else { + sprintf(buf, + "Service lookup failed for destination port \"%s\"", + dports); + logevent(buf); + } + } sport = atoi(sports); + sserv = 0; + if (sport == 0) { + sserv = 1; + se = getservbyname(sports, NULL); + if (se != NULL) { + sport = ntohs(se->s_port); + } else { + sprintf(buf, + "Service lookup failed for source port \"%s\"", + sports); + logevent(buf); + } + } if (sport && dport) { if (type == 'L') { pfd_addforward(host, dport, sport); - sprintf(buf, "Local port %d forwarding to %s:%d", - sport, host, dport); + sprintf(buf, "Local port %.*s%.*s%d%.*s forwarding to" + " %s:%.*s%.*s%d%.*s", + sserv ? strlen(sports) : 0, sports, + sserv, "(", sport, sserv, ")", + host, + dserv ? strlen(dports) : 0, dports, + dserv, "(", dport, dserv, ")"); logevent(buf); } else { struct ssh_rportfwd *pf; @@ -2865,8 +2911,13 @@ static void ssh1_protocol(unsigned char *in, int inlen, int ispkt) logevent(buf); sfree(pf); } else { - sprintf(buf, "Requesting remote port %d forward to %s:%d", - sport, host, dport); + sprintf(buf, "Requesting remote port %.*s%.*s%d%.*s" + " forward to %s:%.*s%.*s%d%.*s", + sserv ? strlen(sports) : 0, sports, + sserv, "(", sport, sserv, ")", + host, + dserv ? strlen(dports) : 0, dports, + dserv, "(", dport, dserv, ")"); logevent(buf); send_packet(SSH1_CMSG_PORT_FORWARD_REQUEST, PKT_INT, sport, @@ -3873,6 +3924,7 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt) static int we_are_in; static int num_prompts, echo; static char username[100]; + static int got_username; static char pwprompt[200]; static char password[100]; static void *publickey_blob; @@ -3917,6 +3969,7 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt) * retype it! */ username[0] = '\0'; + got_username = FALSE; do { static int pos; static char c; @@ -3925,7 +3978,7 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt) * Get a username. */ pos = 0; - if (*username && !cfg.change_username) { + if (got_username && !cfg.change_username) { /* * We got a username last time round this loop, and * with change_username turned off we don't try to get @@ -3971,8 +4024,7 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt) break; case 3: case 4: - random_save_seed(); - exit(0); + cleanup_exit(0); break; default: if (((c >= ' ' && c <= '~') || @@ -3996,6 +4048,7 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt) c_write_str(stuff); } } + got_username = TRUE; /* * Send an authentication request using method "none": (a) @@ -4418,6 +4471,7 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt) ("No more passwords available to try"); ssh2_pkt_addstring("en"); /* language tag */ ssh2_pkt_send(); + logevent("Unable to authenticate"); connection_fatal("Unable to authenticate"); ssh_state = SSH_STATE_CLOSED; crReturnV; @@ -4450,8 +4504,7 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt) break; case 3: case 4: - random_save_seed(); - exit(0); + cleanup_exit(0); break; default: if (pos < sizeof(password)-1) @@ -4698,9 +4751,10 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt) static char *e; /* preserve across crReturn */ char type; int n; - int sport,dport; + int sport,dport,sserv,dserv; char sports[256], dports[256], host[256]; char buf[1024]; + struct servent *se; ssh_rportfwds = newtree234(ssh_rportcmp_ssh2); /* Add port forwardings. */ @@ -4725,12 +4779,43 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt) dports[n] = 0; e++; dport = atoi(dports); + dserv = 0; + if (dport == 0) { + dserv = 1; + se = getservbyname(dports, NULL); + if (se != NULL) { + dport = ntohs(se->s_port); + } else { + sprintf(buf, + "Service lookup failed for destination port \"%s\"", + dports); + logevent(buf); + } + } sport = atoi(sports); + sserv = 0; + if (sport == 0) { + sserv = 1; + se = getservbyname(sports, NULL); + if (se != NULL) { + sport = ntohs(se->s_port); + } else { + sprintf(buf, + "Service lookup failed for source port \"%s\"", + sports); + logevent(buf); + } + } if (sport && dport) { if (type == 'L') { pfd_addforward(host, dport, sport); - sprintf(buf, "Local port %d forwarding to %s:%d", - sport, host, dport); + sprintf(buf, "Local port %.*s%.*s%d%.*s forwarding to" + " %s:%.*s%.*s%d%.*s", + sserv ? strlen(sports) : 0, sports, + sserv, "(", sport, sserv, ")", + host, + dserv ? strlen(dports) : 0, dports, + dserv, "(", dport, dserv, ")"); logevent(buf); } else { struct ssh_rportfwd *pf; @@ -4745,8 +4830,13 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt) logevent(buf); sfree(pf); } else { - sprintf(buf, "Requesting remote port %d (forwarded to %s:%d)", - sport, host, dport); + sprintf(buf, "Requesting remote port %.*s%.*s%d%.*s" + " forward to %s:%.*s%.*s%d%.*s", + sserv ? strlen(sports) : 0, sports, + sserv, "(", sport, sserv, ")", + host, + dserv ? strlen(dports) : 0, dports, + dserv, "(", dport, dserv, ")"); logevent(buf); ssh2_pkt_init(SSH2_MSG_GLOBAL_REQUEST); ssh2_pkt_addstring("tcpip-forward"); @@ -5199,7 +5289,7 @@ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt) ssh2_pkt_addstring(buf); ssh2_pkt_addstring("en"); /* language tag */ ssh2_pkt_send(); - connection_fatal(buf); + connection_fatal("%s", buf); ssh_state = SSH_STATE_CLOSED; crReturnV; }