Mercurial > dropbear
changeset 896:a1a97e98b0c1
Read (and enqueue) packets from interactive input even when
we're waiting for a key exchange.
This should hopefully fix the situation where "~." doesn't work to terminate a
client session when a laptop wakes up. The client will be stuck waiting for a
key exchange on a dead connection, so won't have read the escape character
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Mon, 17 Feb 2014 21:41:06 +0800 |
parents | 5608a5a61c2a |
children | 5d3e917bb7a6 |
files | common-channel.c common-session.c |
diffstat | 2 files changed, 11 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/common-channel.c Sat Feb 15 21:42:35 2014 +0800 +++ b/common-channel.c Mon Feb 17 21:41:06 2014 +0800 @@ -474,8 +474,13 @@ continue; } - /* Stuff to put over the wire */ - if (channel->transwindow > 0) { + /* Stuff to put over the wire. + Avoid queueing data to send if we're in the middle of a + key re-exchange (!dataallowed), but still read from the + FD if there's the possibility of "~."" to kill an + interactive session (the read_mangler) */ + if (channel->transwindow > 0 + && (ses.dataallowed || channel->read_mangler)) { if (channel->readfd >= 0) { FD_SET(channel->readfd, readfds);
--- a/common-session.c Sat Feb 15 21:42:35 2014 +0800 +++ b/common-session.c Mon Feb 17 21:41:06 2014 +0800 @@ -153,10 +153,9 @@ SIGCHLD in svr-chansession is the only one currently. */ FD_SET(ses.signal_pipe[0], &readfd); - /* set up for channels which require reading/writing */ - if (ses.dataallowed) { - setchannelfds(&readfd, &writefd); - } + /* set up for channels which can be read/written */ + setchannelfds(&readfd, &writefd); + val = select(ses.maxfd+1, &readfd, &writefd, NULL, &timeout); if (exitflag) { @@ -217,9 +216,7 @@ /* process pipes etc for the channels, ses.dataallowed == 0 * during rekeying ) */ - if (ses.dataallowed) { - channelio(&readfd, &writefd); - } + channelio(&readfd, &writefd); if (loophandler) { loophandler();