]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
upstream: Try to continue running local I/O for channels in state
authordjm@openbsd.org <djm@openbsd.org>
Wed, 20 Apr 2022 04:19:11 +0000 (04:19 +0000)
committerDamien Miller <djm@mindrot.org>
Wed, 20 Apr 2022 05:08:54 +0000 (15:08 +1000)
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

channels.c
clientloop.c
serverloop.c

index d47af7911f0432bac29745e556077df34b721138..12f765997c9b37d2dc26c2ecf9408f07cd0930fd 100644 (file)
@@ -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);
index f8350e67224bfe14bbd8ab179910e8bc84d35f8b..1d80683c0ca9026a12e7f3dd3a06433df29a2e5d 100644 (file)
@@ -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
@@ -1348,9 +1348,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)
index 0541f028a650e5986e11d39cc686d6eb570b2823..b4c0d82b242d5eee49fcd6bf1fee49aeab927a7c 100644 (file)
@@ -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
@@ -392,8 +392,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;