summaryrefslogtreecommitdiffstats
path: root/channels.c
diff options
context:
space:
mode:
authordjm@openbsd.org <djm@openbsd.org>2022-04-20 06:19:11 +0200
committerDamien Miller <djm@mindrot.org>2022-04-20 07:08:54 +0200
commitfec014785de198b9a325d1b94e324bb958c5fe7b (patch)
treeab60bc19e921a7ea0765abf6c55cdcf9a59a25fd /channels.c
parentupstream: Import regenerated moduli (diff)
downloadopenssh-fec014785de198b9a325d1b94e324bb958c5fe7b.tar.xz
openssh-fec014785de198b9a325d1b94e324bb958c5fe7b.zip
upstream: 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@ OpenBSD-Commit-ID: a66e8f254e92edd4ce09c9f750883ec8f1ea5f45
Diffstat (limited to 'channels.c')
-rw-r--r--channels.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/channels.c b/channels.c
index d47af7911..12f765997 100644
--- a/channels.c
+++ b/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
@@ -2420,6 +2420,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;
@@ -2610,17 +2613,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);