1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-10 09:58:01 +00:00

Nearly forgot noting this down in the 'half-closed' bug entry: don't

send CHANNEL_CLOSE until we have acks for all our winadj requests.
Should work around https://bugzilla.mindrot.org/show_bug.cgi?id=1818 .

[originally from svn r9280]
This commit is contained in:
Simon Tatham 2011-09-13 11:56:25 +00:00
parent 947962e0b9
commit 5848c8cc3d

14
ssh.c
View File

@ -473,6 +473,7 @@ static int do_ssh1_login(Ssh ssh, unsigned char *in, int inlen,
struct Packet *pktin); struct Packet *pktin);
static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen, static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen,
struct Packet *pktin); struct Packet *pktin);
static void ssh2_channel_check_close(struct ssh_channel *c);
static void ssh_channel_destroy(struct ssh_channel *c); static void ssh_channel_destroy(struct ssh_channel *c);
/* /*
@ -6667,6 +6668,11 @@ static int ssh2_handle_winadj_response(struct ssh_channel *c)
*/ */
if (c->v.v2.throttle_state == UNTHROTTLING) if (c->v.v2.throttle_state == UNTHROTTLING)
c->v.v2.throttle_state = UNTHROTTLED; c->v.v2.throttle_state = UNTHROTTLED;
/*
* We may now initiate channel-closing procedures, if that winadj
* was the last thing outstanding before we send CHANNEL_CLOSE.
*/
ssh2_channel_check_close(c);
return TRUE; return TRUE;
} }
@ -6888,10 +6894,12 @@ static void ssh2_channel_check_close(struct ssh_channel *c)
struct Packet *pktout; struct Packet *pktout;
if ((c->closes & (CLOSES_SENT_EOF | CLOSES_RCVD_EOF | CLOSES_SENT_CLOSE)) if ((c->closes & (CLOSES_SENT_EOF | CLOSES_RCVD_EOF | CLOSES_SENT_CLOSE))
== (CLOSES_SENT_EOF | CLOSES_RCVD_EOF)) { == (CLOSES_SENT_EOF | CLOSES_RCVD_EOF) && !c->v.v2.winadj_head) {
/* /*
* We have both sent and received EOF, which means the channel * We have both sent and received EOF, and we have no
* is in final wind-up. But we haven't sent CLOSE, so let's. * outstanding winadj channel requests, which means the
* channel is in final wind-up. But we haven't sent CLOSE, so
* let's do so now.
*/ */
pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE); pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE);
ssh2_pkt_adduint32(pktout, c->remoteid); ssh2_pkt_adduint32(pktout, c->remoteid);