summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--common-channel.c9
-rw-r--r--common-session.c11
2 files changed, 11 insertions, 9 deletions
diff --git a/common-channel.c b/common-channel.c
index 2068904..4a6bdb4 100644
--- a/common-channel.c
+++ b/common-channel.c
@@ -474,8 +474,13 @@ void setchannelfds(fd_set *readfds, fd_set *writefds) {
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);
diff --git a/common-session.c b/common-session.c
index 6882dce..02eeaae 100644
--- a/common-session.c
+++ b/common-session.c
@@ -153,10 +153,9 @@ void session_loop(void(*loophandler)()) {
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 @@ void session_loop(void(*loophandler)()) {
/* process pipes etc for the channels, ses.dataallowed == 0
* during rekeying ) */
- if (ses.dataallowed) {
- channelio(&readfd, &writefd);
- }
+ channelio(&readfd, &writefd);
if (loophandler) {
loophandler();