X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/42fee8d6548876e6d055d057c38f9227f9e000fc..8d90b8b27bf086da6245030459ab3e5977313eb0:/ssh.c diff --git a/ssh.c b/ssh.c index ea2ad974..9eed54dc 100644 --- a/ssh.c +++ b/ssh.c @@ -460,14 +460,14 @@ struct Packet; static struct Packet *ssh1_pkt_init(int pkt_type); static struct Packet *ssh2_pkt_init(int pkt_type); static void ssh_pkt_ensure(struct Packet *, int length); -static void ssh_pkt_adddata(struct Packet *, void *data, int len); +static void ssh_pkt_adddata(struct Packet *, const void *data, int len); static void ssh_pkt_addbyte(struct Packet *, unsigned char value); static void ssh2_pkt_addbool(struct Packet *, unsigned char value); static void ssh_pkt_adduint32(struct Packet *, unsigned long value); static void ssh_pkt_addstring_start(struct Packet *); -static void ssh_pkt_addstring_str(struct Packet *, char *data); -static void ssh_pkt_addstring_data(struct Packet *, char *data, int len); -static void ssh_pkt_addstring(struct Packet *, char *data); +static void ssh_pkt_addstring_str(struct Packet *, const char *data); +static void ssh_pkt_addstring_data(struct Packet *, const char *data, int len); +static void ssh_pkt_addstring(struct Packet *, const char *data); static unsigned char *ssh2_mpint_fmt(Bignum b, int *len); static void ssh1_pkt_addmp(struct Packet *, Bignum b); static void ssh2_pkt_addmp(struct Packet *, Bignum b); @@ -1829,7 +1829,7 @@ static void ssh_pkt_ensure(struct Packet *pkt, int length) if (body) pkt->body = pkt->data + offset; } } -static void ssh_pkt_adddata(struct Packet *pkt, void *data, int len) +static void ssh_pkt_adddata(struct Packet *pkt, const void *data, int len) { if (pkt->logmode != PKTLOG_EMIT) { pkt->nblanks++; @@ -1863,17 +1863,18 @@ static void ssh_pkt_addstring_start(struct Packet *pkt) ssh_pkt_adduint32(pkt, 0); pkt->savedpos = pkt->length; } -static void ssh_pkt_addstring_str(struct Packet *pkt, char *data) +static void ssh_pkt_addstring_str(struct Packet *pkt, const char *data) { ssh_pkt_adddata(pkt, data, strlen(data)); PUT_32BIT(pkt->data + pkt->savedpos - 4, pkt->length - pkt->savedpos); } -static void ssh_pkt_addstring_data(struct Packet *pkt, char *data, int len) +static void ssh_pkt_addstring_data(struct Packet *pkt, const char *data, + int len) { ssh_pkt_adddata(pkt, data, len); PUT_32BIT(pkt->data + pkt->savedpos - 4, pkt->length - pkt->savedpos); } -static void ssh_pkt_addstring(struct Packet *pkt, char *data) +static void ssh_pkt_addstring(struct Packet *pkt, const char *data) { ssh_pkt_addstring_start(pkt); ssh_pkt_addstring_str(pkt, data); @@ -7094,6 +7095,15 @@ static void ssh2_msg_channel_close(Ssh ssh, struct Packet *pktin) } /* + * Abandon any buffered data we still wanted to send to this + * channel. Receiving a CHANNEL_CLOSE is an indication that + * the server really wants to get on and _destroy_ this + * channel, and it isn't going to send us any further + * WINDOW_ADJUSTs to permit us to send pending stuff. + */ + bufchain_clear(&c->v.v2.outbuffer); + + /* * Send outgoing EOF. */ sshfwd_write_eof(c); @@ -7543,7 +7553,9 @@ static void ssh2_setup_x11(struct ssh_channel *c, struct Packet *pktin, ssh2_pkt_adduint32(pktout, ssh->x11disp->screennum); ssh2_pkt_send(ssh, pktout); - crWaitUntilV(pktin); + /* Wait to be called back with either a response packet, or NULL + * meaning clean up and free our data */ + crReturnV; if (pktin) { if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS) { @@ -7573,7 +7585,9 @@ static void ssh2_setup_agent(struct ssh_channel *c, struct Packet *pktin, ssh2_setup_agent, s); ssh2_pkt_send(ssh, pktout); - crWaitUntilV(pktin); + /* Wait to be called back with either a response packet, or NULL + * meaning clean up and free our data */ + crReturnV; if (pktin) { if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS) { @@ -7620,7 +7634,9 @@ static void ssh2_setup_pty(struct ssh_channel *c, struct Packet *pktin, ssh2_pkt_send(ssh, pktout); ssh->state = SSH_STATE_INTERMED; - crWaitUntilV(pktin); + /* Wait to be called back with either a response packet, or NULL + * meaning clean up and free our data */ + crReturnV; if (pktin) { if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS) { @@ -7678,7 +7694,9 @@ static void ssh2_setup_env(struct ssh_channel *c, struct Packet *pktin, s->env_left = s->num_env; while (s->env_left > 0) { - crWaitUntilV(pktin); + /* Wait to be called back with either a response packet, + * or NULL meaning clean up and free our data */ + crReturnV; if (!pktin) goto out; if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS) s->env_ok++;