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
This commit is contained in:
parent
e68154b0d4
commit
fec014785d
11
channels.c
11
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>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
* 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];
|
c = sc->channels[i];
|
||||||
if (c == NULL)
|
if (c == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
/* Try to keep IO going while rekeying */
|
||||||
|
if (ssh_packet_is_rekeying(ssh) && c->type != SSH_CHANNEL_OPEN)
|
||||||
|
continue;
|
||||||
if (c->delayed) {
|
if (c->delayed) {
|
||||||
if (table == CHAN_PRE)
|
if (table == CHAN_PRE)
|
||||||
c->delayed = 0;
|
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) */
|
/* Allocate 4x pollfd for each channel (rfd, wfd, efd, sock) */
|
||||||
if (sc->channels_alloc >= (INT_MAX / 4) - npfd_reserved)
|
if (sc->channels_alloc >= (INT_MAX / 4) - npfd_reserved)
|
||||||
fatal_f("too many channels"); /* shouldn't happen */
|
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) {
|
if (npfd > *npfd_allocp) {
|
||||||
*pfdp = xrecallocarray(*pfdp, *npfd_allocp,
|
*pfdp = xrecallocarray(*pfdp, *npfd_allocp,
|
||||||
npfd, sizeof(**pfdp));
|
npfd, sizeof(**pfdp));
|
||||||
*npfd_allocp = npfd;
|
*npfd_allocp = npfd;
|
||||||
}
|
}
|
||||||
*npfd_activep = npfd_reserved;
|
*npfd_activep = npfd_reserved;
|
||||||
if (ssh_packet_is_rekeying(ssh))
|
|
||||||
return;
|
|
||||||
|
|
||||||
oalloc = sc->channels_alloc;
|
oalloc = sc->channels_alloc;
|
||||||
|
|
||||||
channel_handler(ssh, CHAN_PRE, minwait_secs);
|
channel_handler(ssh, CHAN_PRE, minwait_secs);
|
||||||
|
|
|
@ -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>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
|
@ -1348,9 +1348,8 @@ client_loop(struct ssh *ssh, int have_pty, int escape_char_arg,
|
||||||
if (quit_pending)
|
if (quit_pending)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Do channel operations unless rekeying in progress. */
|
/* Do channel operations. */
|
||||||
if (!ssh_packet_is_rekeying(ssh))
|
channel_after_poll(ssh, pfd, npfd_active);
|
||||||
channel_after_poll(ssh, pfd, npfd_active);
|
|
||||||
|
|
||||||
/* Buffer input from the connection. */
|
/* Buffer input from the connection. */
|
||||||
if (conn_in_ready)
|
if (conn_in_ready)
|
||||||
|
|
|
@ -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>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
|
@ -392,8 +392,7 @@ server_loop2(struct ssh *ssh, Authctxt *authctxt)
|
||||||
cleanup_exit(255);
|
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 &&
|
if (conn_in_ready &&
|
||||||
process_input(ssh, connection_in) < 0)
|
process_input(ssh, connection_in) < 0)
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue