From: simon Date: Tue, 13 Sep 2011 15:38:12 +0000 (+0000) Subject: Changed my mind about the EOF policy in SSH mode: I think the SSH X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/commitdiff_plain/4a202fc69e12e9699cd79de9f6457506c663bc07?ds=sidebyside Changed my mind about the EOF policy in SSH mode: I think the SSH backend should unilaterally assume outgoing EOF when it sees incoming EOF, if and only if the main session channel is talking to a pty. (Because ptys don't have a strong concept of EOF in the first place, that seems like a sensible place to draw the line.) This fixes a bug introduced by today's revamp in which if you used Unix Plink to run a console session it would hang after you hit ^D - because the server had sent EOF, but it was waiting for a client-side EOF too. git-svn-id: svn://svn.tartarus.org/sgt/putty@9282 cda61777-01e9-0310-a592-d414129be87e --- diff --git a/ssh.c b/ssh.c index 0f30fe01..a2112134 100644 --- a/ssh.c +++ b/ssh.c @@ -850,6 +850,7 @@ struct ssh_tag { int size_needed, eof_needed; int sent_console_eof; + int got_pty; /* affects EOF behaviour on main channel */ struct Packet **queue; int queuelen, queuesize; @@ -5181,9 +5182,11 @@ static void do_ssh1_connection(Ssh ssh, unsigned char *in, int inlen, } else if (pktin->type == SSH1_SMSG_FAILURE) { c_write_str(ssh, "Server refused to allocate pty\r\n"); ssh->editing = ssh->echoing = 1; - } - logeventf(ssh, "Allocated pty (ospeed %dbps, ispeed %dbps)", - ssh->ospeed, ssh->ispeed); + } else { + logeventf(ssh, "Allocated pty (ospeed %dbps, ispeed %dbps)", + ssh->ospeed, ssh->ispeed); + ssh->got_pty = TRUE; + } } else { ssh->editing = ssh->echoing = 1; } @@ -6932,10 +6935,15 @@ static void ssh2_channel_got_eof(struct ssh_channel *c) } else if (c->type == CHAN_MAINSESSION) { Ssh ssh = c->ssh; - if (!ssh->sent_console_eof && from_backend_eof(ssh->frontend)) { + if (!ssh->sent_console_eof && + (from_backend_eof(ssh->frontend) || ssh->got_pty)) { /* - * The front end wants us to close the outgoing side of the - * connection as soon as we see EOF from the far end. + * Either from_backend_eof told us that the front end + * wants us to close the outgoing side of the connection + * as soon as we see EOF from the far end, or else we've + * unilaterally decided to do that because we've allocated + * a remote pty and hence EOF isn't a particularly + * meaningful concept. */ sshfwd_write_eof(c); } @@ -9018,6 +9026,7 @@ static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen, } else { logeventf(ssh, "Allocated pty (ospeed %dbps, ispeed %dbps)", ssh->ospeed, ssh->ispeed); + ssh->got_pty = TRUE; } } else { ssh->editing = ssh->echoing = 1; @@ -9445,6 +9454,7 @@ static const char *ssh_init(void *frontend_handle, void **backend_handle, ssh->frozen = FALSE; ssh->username = NULL; ssh->sent_console_eof = FALSE; + ssh->got_pty = FALSE; *backend_handle = ssh;