Bug#1117631: openssh: Connection sharing is very sluggish.
Sebastian Andrzej Siewior <[email protected]> Wed, 8 Oct 2025 23:11:06 +0200
| Newsgroups | gmane.linux.debian.devel.ssh |
|---|---|
| Message-ID | <20251008211106.ZY5hCdxu__23335.059014947$1759958011$gmane$org@breakpoint.cc> |
Package: src:openssh
Version: 1:10.1p1-1
Severity: serious
Tags: upstream fixed-upstream patch
control: forwarded -1 https://bugzilla.mindrot.org/show_bug.cgi?id=3872
Since the 10.1p1 connection sharing (ssh -M, ControlMaster yes) is very
sluggish. It turns to be a openssh regression that is already fixed as
of commit beae06f56e0d0 ("upstream: don't reuse c->isatty for signalling
that the remote channel") in the portable tree. Please find attached the
patch.
Since I have it almost always enabled, especially for long distance
connection, I can't use it. Hence the severity.
Sebastian
upstream-don-t-reuse-c-isatty-for-signalling-that-th.patch
(text/x-diff, 2.5 KB)
>From beae06f56e0d0a66ca535896149d5fb0b2e8a1b4 Mon Sep 17 00:00:00 2001 From: "[email protected]" <[email protected]> Date: Tue, 7 Oct 2025 08:02:32 +0000 Subject: [PATCH] upstream: don't reuse c->isatty for signalling that the remote channel has a tty attached as this causes side effects, e.g. in channel_handle_rfd(). bz3872 ok markus@ OpenBSD-Commit-ID: 4cd8a9f641498ca6089442e59bad0fd3dcbe85f8 --- channels.c | 9 +++++---- channels.h | 3 ++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/channels.c b/channels.c index f1d7bcf345b19..80014ff341fad 100644 --- a/channels.c +++ b/channels.c @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.c,v 1.451 2025/09/25 06:33:19 djm Exp $ */ +/* $OpenBSD: channels.c,v 1.452 2025/10/07 08:02:32 djm Exp $ */ /* * Author: Tatu Ylonen <[email protected]> * Copyright (c) 1995 Tatu Ylonen <[email protected]>, Espoo, Finland @@ -362,7 +362,7 @@ channel_classify(struct ssh *ssh, Channel *c) { struct ssh_channels *sc = ssh->chanctxt; const char *type = c->xctype == NULL ? c->ctype : c->xctype; - const char *classifier = c->isatty ? + const char *classifier = (c->isatty || c->remote_has_tty) ? sc->bulk_classifier_tty : sc->bulk_classifier_notty; c->bulk = type != NULL && match_pattern_list(type, classifier, 0) == 1; @@ -566,7 +566,7 @@ channel_new(struct ssh *ssh, char *ctype, int type, int rfd, int wfd, int efd, void channel_set_tty(struct ssh *ssh, Channel *c) { - c->isatty = 1; + c->remote_has_tty = 1; channel_classify(ssh, c); } @@ -1078,7 +1078,8 @@ channel_format_status(const Channel *c) c->rfd, c->wfd, c->efd, c->sock, c->ctl_chan, c->have_ctl_child_id ? "c" : "nc", c->ctl_child_id, c->io_want, c->io_ready, - c->isatty ? "T" : "", c->bulk ? "B" : "I"); + c->isatty ? "T" : (c->remote_has_tty ? "RT" : ""), + c->bulk ? "B" : "I"); return ret; } diff --git a/channels.h b/channels.h index df7c7f364d225..7456541f8ce3a 100644 --- a/channels.h +++ b/channels.h @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.h,v 1.161 2025/09/25 06:33:19 djm Exp $ */ +/* $OpenBSD: channels.h,v 1.162 2025/10/07 08:02:32 djm Exp $ */ /* * Author: Tatu Ylonen <[email protected]> @@ -145,6 +145,7 @@ struct Channel { int ctl_chan; /* control channel (multiplexed connections) */ uint32_t ctl_child_id; /* child session for mux controllers */ int have_ctl_child_id;/* non-zero if ctl_child_id is valid */ + int remote_has_tty; /* remote side has a tty */ int isatty; /* rfd is a tty */ #ifdef _AIX int wfd_isatty; /* wfd is a tty */