summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Miller <djm@cvs.openbsd.org>2022-04-20 04:19:12 +0000
committerDamien Miller <djm@cvs.openbsd.org>2022-04-20 04:19:12 +0000
commit4510667dde54fcbd80b8fde10439cb056d78e70c (patch)
tree5faea335008328e81d95596bae19df94114d7c6d
parent160d34ec87acd69b9ec381f709a8161b48b4a62a (diff)
Try to continue running local I/O for channels in state OPEN during
SSH transport rekeying. The most visible benefit is that it should make ~-escapes work in the client (e.g. to exit) if the connection happened to have stalled during a rekey event. Based work by and ok dtucker@
-rw-r--r--usr.bin/ssh/channels.c11
-rw-r--r--usr.bin/ssh/clientloop.c7
-rw-r--r--usr.bin/ssh/serverloop.c5
3 files changed, 10 insertions, 13 deletions
diff --git a/usr.bin/ssh/channels.c b/usr.bin/ssh/channels.c
index 97d7178eef6..f2f6267cec9 100644
--- a/usr.bin/ssh/channels.c
+++ b/usr.bin/ssh/channels.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: channels.c,v 1.416 2022/04/11 22:52:08 djm Exp $ */
+/* $OpenBSD: channels.c,v 1.417 2022/04/20 04:19:11 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -2378,6 +2378,9 @@ channel_handler(struct ssh *ssh, int table, time_t *unpause_secs)
c = sc->channels[i];
if (c == NULL)
continue;
+ /* Try to keep IO going while rekeying */
+ if (ssh_packet_is_rekeying(ssh) && c->type != SSH_CHANNEL_OPEN)
+ continue;
if (c->delayed) {
if (table == CHAN_PRE)
c->delayed = 0;
@@ -2568,17 +2571,13 @@ channel_prepare_poll(struct ssh *ssh, struct pollfd **pfdp, u_int *npfd_allocp,
/* Allocate 4x pollfd for each channel (rfd, wfd, efd, sock) */
if (sc->channels_alloc >= (INT_MAX / 4) - npfd_reserved)
fatal_f("too many channels"); /* shouldn't happen */
- if (!ssh_packet_is_rekeying(ssh))
- npfd += sc->channels_alloc * 4;
+ npfd += sc->channels_alloc * 4;
if (npfd > *npfd_allocp) {
*pfdp = xrecallocarray(*pfdp, *npfd_allocp,
npfd, sizeof(**pfdp));
*npfd_allocp = npfd;
}
*npfd_activep = npfd_reserved;
- if (ssh_packet_is_rekeying(ssh))
- return;
-
oalloc = sc->channels_alloc;
channel_handler(ssh, CHAN_PRE, minwait_secs);
diff --git a/usr.bin/ssh/clientloop.c b/usr.bin/ssh/clientloop.c
index 6e799daa0d0..8807d230621 100644
--- a/usr.bin/ssh/clientloop.c
+++ b/usr.bin/ssh/clientloop.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: clientloop.c,v 1.378 2022/01/22 00:49:34 djm Exp $ */
+/* $OpenBSD: clientloop.c,v 1.379 2022/04/20 04:19:11 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -1339,9 +1339,8 @@ client_loop(struct ssh *ssh, int have_pty, int escape_char_arg,
if (quit_pending)
break;
- /* Do channel operations unless rekeying in progress. */
- if (!ssh_packet_is_rekeying(ssh))
- channel_after_poll(ssh, pfd, npfd_active);
+ /* Do channel operations. */
+ channel_after_poll(ssh, pfd, npfd_active);
/* Buffer input from the connection. */
if (conn_in_ready)
diff --git a/usr.bin/ssh/serverloop.c b/usr.bin/ssh/serverloop.c
index 3b49719824b..221043617d2 100644
--- a/usr.bin/ssh/serverloop.c
+++ b/usr.bin/ssh/serverloop.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: serverloop.c,v 1.231 2022/01/22 00:49:34 djm Exp $ */
+/* $OpenBSD: serverloop.c,v 1.232 2022/04/20 04:19:11 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -386,8 +386,7 @@ server_loop2(struct ssh *ssh, Authctxt *authctxt)
cleanup_exit(255);
}
- if (!ssh_packet_is_rekeying(ssh))
- channel_after_poll(ssh, pfd, npfd_active);
+ channel_after_poll(ssh, pfd, npfd_active);
if (conn_in_ready &&
process_input(ssh, connection_in) < 0)
break;