X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/c6b4179107355f38804d343201876bde9181c990..7b56a33fca0f6c9130188db0d2eb475de9380b02:/ssh.c diff --git a/ssh.c b/ssh.c index b4c634d3..ef503bf5 100644 --- a/ssh.c +++ b/ssh.c @@ -4266,13 +4266,13 @@ void sshfwd_unclean_close(struct ssh_channel *c) if (ssh->state == SSH_STATE_CLOSED) return; - if (c->closes & CLOSES_SENT_CLOSE) - return; + if (!(c->closes & CLOSES_SENT_CLOSE)) { + pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE); + ssh2_pkt_adduint32(pktout, c->remoteid); + ssh2_pkt_send(ssh, pktout); + c->closes |= CLOSES_SENT_EOF | CLOSES_SENT_CLOSE; + } - pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE); - ssh2_pkt_adduint32(pktout, c->remoteid); - ssh2_pkt_send(ssh, pktout); - c->closes |= CLOSES_SENT_EOF | CLOSES_SENT_CLOSE; switch (c->type) { case CHAN_X11: x11_close(c->u.x11.s); @@ -4283,6 +4283,7 @@ void sshfwd_unclean_close(struct ssh_channel *c) break; } c->type = CHAN_ZOMBIE; + ssh2_channel_check_close(c); } @@ -5777,6 +5778,12 @@ static int do_ssh2_transport(Ssh ssh, void *vin, int inlen, break; } } + if (!ssh->hostkey) { + bombout(("Couldn't agree a host key algorithm (available: %s)", + str ? str : "(null)")); + crStop(0); + } + s->guessok = s->guessok && first_in_commasep_string(hostkey_algs[0]->name, str, len); ssh_pkt_getstring(pktin, &str, &len); /* client->server cipher */ @@ -10036,6 +10043,12 @@ static void ssh_unthrottle(void *handle, int bufsize) } } } + + /* + * Now process any SSH connection data that was stashed in our + * queue while we were frozen. + */ + ssh_process_queued_incoming_data(ssh); } void ssh_send_port_open(void *channel, char *hostname, int port, char *org)