~mdw
/
sgt
/
putty
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Experimental checkin to see if we can prevent multiple closes ever
[sgt/putty]
/
ssh.c
diff --git
a/ssh.c
b/ssh.c
index
627a16f
..
8d310e1
100644
(file)
--- 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, "-");
char *imp; /* pointer to implementation part */
imp = vstring;
imp += strcspn(imp, "-");
+ if (*imp) imp++;
imp += strcspn(imp, "-");
imp += strcspn(imp, "-");
+ if (*imp) imp++;
ssh_remote_bugs = 0;
ssh_remote_bugs = 0;
@@
-1156,10
+1158,11
@@
static void ssh_detect_bugs(char *vstring) {
}
static int do_ssh_init(unsigned char c) {
}
static int do_ssh_init(unsigned char c) {
- static char
*vsp
;
+ static char
vslen
;
static char version[10];
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;
static int i;
crBegin;
@@
-1179,13
+1182,18
@@
static int do_ssh_init(unsigned char c) {
crReturn(1); /* get another character */
}
crReturn(1); /* get another character */
}
+ vstring = smalloc(16);
+ vstrsize = 16;
strcpy(vstring, "SSH-");
strcpy(vstring, "SSH-");
- vs
p = vstring+
4;
+ vs
len =
4;
i = 0;
while (1) {
crReturn(1); /* get another char */
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';
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;
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);
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
/*
* 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.
*/
/*
* 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);
/*
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"));
*/
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);
sprintf(vlog, "We claim version: %s", verstring);
logevent(vlog);
+ strcat(verstring, "\n");
logevent("Using SSH protocol version 2");
logevent("Using SSH protocol version 2");
- sk_write(s, v
string, strlen(v
string));
+ sk_write(s, v
erstring, strlen(ver
string));
ssh_protocol = ssh2_protocol;
ssh_version = 2;
s_rdpkt = ssh2_rdpkt;
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.
*/
/*
* 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);
(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);
logevent(vlog);
+ strcat(verstring, "\n");
logevent("Using SSH protocol version 1");
logevent("Using SSH protocol version 1");
- sk_write(s, v
string, strlen(v
string));
+ sk_write(s, v
erstring, strlen(ver
string));
ssh_protocol = ssh1_protocol;
ssh_version = 1;
s_rdpkt = ssh1_rdpkt;
}
ssh_state = SSH_STATE_BEFORE_SIZE;
ssh_protocol = ssh1_protocol;
ssh_version = 1;
s_rdpkt = ssh1_rdpkt;
}
ssh_state = SSH_STATE_BEFORE_SIZE;
+ sfree(vstring);
+
crFinish(0);
}
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);
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);
if ((c->closes == 0) && (c->type == CHAN_X11)) {
logevent("X11 connection closed");
assert(c->u.x11.s != NULL);