[PATCH] ANSI terminal escape sequences do not affect processing of SSH escapes
Damien Miller
djm at mindrot.org
Tue Oct 13 06:28:29 AEDT 2015
Hi,
Thanks for this - could I ask you to create a bug at
https://bugzilla.mindrot.org for this and attach your patch? This will
make sure it doesn't get lost.
Thanks,
Damien
On Mon, 12 Oct 2015, Alex Dowad wrote:
> Even when the user has not pressed a key, ANSI-compatible terminal emulators
> can send escape sequences to ssh's stdin at any time. For example, any time that
> the server sends an "<ESC>[6n" (query cursor position) sequence, an
> ANSI-compatible terminal will send back "<ESC>[<ROW>;<COLUMN>R". ssh sees these
> escape sequences just as if they were characters typed in by the user. This
> causes problems if the user is attempting to type an SSH escape sequence,
> starting with "<ENTER>~".
>
> Therefore, when scanning user input for SSH escape sequences, skip over any
> ANSI terminal control sequences which appear in the input.
> ---
>
> Dear OpenSSH-Portable Devs,
>
> Please CC replies as I am not (yet) a subscriber!
>
> I should probably send this upstream, but I've been searching for the right
> mailing list and haven't found anything. Your feedback will be appreciated.
> I've read your style guidelines and attempted to follow them.
>
> This patch was prompted by the observation that SSH escapes (using ~) don't work
> at all when the remote shell is BusyBox ash (used by Alpine Linux and some
> other minimalist and/or embedded Linux distributions).
>
> This is because the BusyBox shell *always* sends a "query cursor position"
> terminal control escape sequence each time you press the <ENTER> key.
> Quick as a flash, as your pinky finger is descending towards the tilda key,
> the terminal sends back a "report cursor position" sequence. The result is
> that the SSH client *never* sees your tilda as immediately following the
> newline.
>
> Those ANSI terminal control sequences always begin with "<ESC>[" and end
> with an alphabetic character. Hence the call to isalpha() in my code.
> Can someone confirm that isalpha() *always* treats a-z and A-Z as alphabetic,
> no matter what the locale is?
>
> Thank you,
> Alex Dowad
>
> clientloop.c | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/clientloop.c b/clientloop.c
> index 87ceb3d..b15e470 100644
> --- a/clientloop.c
> +++ b/clientloop.c
> @@ -1096,7 +1096,17 @@ process_escapes(Channel *c, Buffer *bin, Buffer *bout, Buffer *berr,
> /* Get one character at a time. */
> ch = buf[i];
>
> - if (*escape_pendingp) {
> + /* ANSI terminal escape sequences may appear anywhere in input stream. */
> + /* They do not affect our processing of our own escapes. */
> + if (ch == 0x1B && buf[i+1] == '[') {
> + for (; i < (u_int)len; i++) {
> + ch = buf[i];
> + buffer_put_char(bin, ch);
> + if (isalpha(ch))
> + break;
> + }
> + continue;
> + } else if (*escape_pendingp) {
> /* We have previously seen an escape character. */
> /* Clear the flag now. */
> *escape_pendingp = 0;
> --
> 2.0.0.GIT
>
> _______________________________________________
> openssh-unix-dev mailing list
> openssh-unix-dev at mindrot.org
> https://lists.mindrot.org/mailman/listinfo/openssh-unix-dev
>
More information about the openssh-unix-dev
mailing list