diff options
author | djm@openbsd.org <djm@openbsd.org> | 2022-04-20 06:19:11 +0200 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2022-04-20 07:08:54 +0200 |
commit | fec014785de198b9a325d1b94e324bb958c5fe7b (patch) | |
tree | ab60bc19e921a7ea0765abf6c55cdcf9a59a25fd /channels.c | |
parent | upstream: Import regenerated moduli (diff) | |
download | openssh-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.c | 11 |
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); |