~mdw
/
sgt
/
putty
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Additions to the Feedback page to emphasise that we can't answer all
[sgt/putty]
/
ssh.c
diff --git
a/ssh.c
b/ssh.c
index
d03de08
..
c05abe2
100644
(file)
--- a/
ssh.c
+++ b/
ssh.c
@@
-19,9
+19,21
@@
if ((flags & FLAG_STDERR) && (flags & FLAG_VERBOSE)) \
{ fprintf(stderr, "%s\n", s); fflush(stderr); } }
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), \
#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 */
#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';
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);
}
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. */
}
if (error_msg) {
/* A socket error has occurred. */
+ logevent(error_msg);
connection_fatal(error_msg);
} else {
/* Otherwise, the remote side closed the connection normally. */
connection_fatal(error_msg);
} else {
/* Otherwise, the remote side closed the connection normally. */
@@
-1872,7
+1885,7
@@
static char *connect_to_host(char *host, int port, char **realhost, int nodelay)
sprintf(buf, "Connecting to %.100s port %d", addrbuf, port);
logevent(buf);
}
sprintf(buf, "Connecting to %.100s port %d", addrbuf, port);
logevent(buf);
}
- s =
sk_new(addr
, port, 0, 1, nodelay, &fn_table_ptr);
+ s =
new_connection(addr, *realhost
, port, 0, 1, nodelay, &fn_table_ptr);
if ((err = sk_socket_error(s))) {
s = NULL;
return err;
if ((err = sk_socket_error(s))) {
s = NULL;
return err;
@@
-2443,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);
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);
connection_fatal("Unable to authenticate");
ssh_state = SSH_STATE_CLOSED;
crReturn(1);
@@
-2817,11
+2831,13
@@
static void ssh1_protocol(unsigned char *in, int inlen, int ispkt)
}
{
}
{
- char type, *e;
+ char type;
+ static char *e;
int n;
int n;
- int sport,dport;
+ int sport,dport
,sserv,dserv
;
char sports[256], dports[256], host[256];
char buf[1024];
char sports[256], dports[256], host[256];
char buf[1024];
+ struct servent *se;
ssh_rportfwds = newtree234(ssh_rportcmp_ssh1);
/* Add port forwardings. */
ssh_rportfwds = newtree234(ssh_rportcmp_ssh1);
/* Add port forwardings. */
@@
-2846,12
+2862,43
@@
static void ssh1_protocol(unsigned char *in, int inlen, int ispkt)
dports[n] = 0;
e++;
dport = atoi(dports);
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);
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);
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;
logevent(buf);
} else {
struct ssh_rportfwd *pf;
@@
-2865,14
+2912,31
@@
static void ssh1_protocol(unsigned char *in, int inlen, int ispkt)
logevent(buf);
sfree(pf);
} else {
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,
PKT_STR, host,
PKT_INT, dport,
PKT_END);
logevent(buf);
send_packet(SSH1_CMSG_PORT_FORWARD_REQUEST,
PKT_INT, sport,
PKT_STR, host,
PKT_INT, dport,
PKT_END);
+ do {
+ crReturnV;
+ } while (!ispkt);
+ if (pktin.type != SSH1_SMSG_SUCCESS
+ && pktin.type != SSH1_SMSG_FAILURE) {
+ bombout(("Protocol confusion"));
+ crReturnV;
+ } else if (pktin.type == SSH1_SMSG_FAILURE) {
+ c_write_str("Server refused port forwarding\r\n");
+ ssh_editing = ssh_echoing = 1;
+ }
+ logevent("Remote port forwarding enabled");
}
}
}
}
}
}
@@
-3873,6
+3937,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 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;
static char pwprompt[200];
static char password[100];
static void *publickey_blob;
@@
-3917,6
+3982,7
@@
static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
* retype it!
*/
username[0] = '\0';
* retype it!
*/
username[0] = '\0';
+ got_username = FALSE;
do {
static int pos;
static char c;
do {
static int pos;
static char c;
@@
-3925,7
+3991,7
@@
static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
* Get a username.
*/
pos = 0;
* 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
/*
* We got a username last time round this loop, and
* with change_username turned off we don't try to get
@@
-3995,6
+4061,7
@@
static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
c_write_str(stuff);
}
}
c_write_str(stuff);
}
}
+ got_username = TRUE;
/*
* Send an authentication request using method "none": (a)
/*
* Send an authentication request using method "none": (a)
@@
-4417,6
+4484,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();
("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;
connection_fatal("Unable to authenticate");
ssh_state = SSH_STATE_CLOSED;
crReturnV;
@@
-4696,9
+4764,10
@@
static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
static char *e; /* preserve across crReturn */
char type;
int n;
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];
char sports[256], dports[256], host[256];
char buf[1024];
+ struct servent *se;
ssh_rportfwds = newtree234(ssh_rportcmp_ssh2);
/* Add port forwardings. */
ssh_rportfwds = newtree234(ssh_rportcmp_ssh2);
/* Add port forwardings. */
@@
-4723,12
+4792,43
@@
static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
dports[n] = 0;
e++;
dport = atoi(dports);
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);
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);
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;
logevent(buf);
} else {
struct ssh_rportfwd *pf;
@@
-4743,8
+4843,13
@@
static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
logevent(buf);
sfree(pf);
} else {
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");
logevent(buf);
ssh2_pkt_init(SSH2_MSG_GLOBAL_REQUEST);
ssh2_pkt_addstring("tcpip-forward");
@@
-5197,7
+5302,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();
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;
}
ssh_state = SSH_STATE_CLOSED;
crReturnV;
}