[PATCH] Cygwin: pty: Disable clear screen for ssh sessions with -t option.
Corinna Vinschen
corinna-cygwin@cygwin.com
Wed Oct 23 12:05:00 GMT 2019
Hi Takashi,
On Oct 23 12:27, Takashi Yano wrote:
> On Tue, 22 Oct 2019 15:40:48 +0200
> Corinna Vinschen wrote:
> > Am I doing something wrong? This code crashes mintty on my
> > installation. At start, a string of "6n6n6n6n..." appears and then
> > mintty exits.
>
> I cannot reproduce that.... How about this one?
In my limited testing it seems to work nicely.
> diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
> index da6119dfb2cf..26f99669f4fc 100644
> --- a/winsup/cygwin/fhandler_tty.cc
> +++ b/winsup/cygwin/fhandler_tty.cc
> @@ -1296,6 +1296,30 @@ detach:
> restore_reattach_pcon ();
> }
>
> +/* If master process is running as service, attaching to
> + pseudo console should be done in fork. If attaching
> + is done in spawn for inetd or sshd, it fails because
> + the helper process is running as privileged user while
> + slave process is not. This function is used to determine
> + if the process is running as a srvice or not. */
> +static bool
> +is_running_as_service (void)
This function should probably use check_token_membership(PSID).
I'm also not quite sure if checking for mandatory_system_integrity_sid
makes sense. Are there examples where the service SID is missing
but the integrity is set to system integrity level?
> ssize_t __stdcall
> fhandler_pty_slave::write (const void *ptr, size_t len)
> {
> @@ -1305,6 +1329,30 @@ fhandler_pty_slave::write (const void *ptr, size_t len)
> if (bg <= bg_eof)
> return (ssize_t) bg;
>
> + if (get_ttyp ()->need_clear_screen_on_write)
> + {
> + if (is_running_as_service ())
This check is redundant. The only way to set need_clear_screen_on_write
to true is if is_running_as_service() was already checked for below.
> + {
> + struct termios ti, ti_new;
> + tcgetattr (&ti);
> + ti_new = ti;
> + ti_new.c_lflag &= (~ICANON | ECHO);
> + tcsetattr (TCSANOW, &ti_new);
> + char buf[32];
> + DWORD n;
> + WriteFile (get_output_handle_cyg (), "\033[6n", 4, &n, NULL);
> + ReadFile (get_handle_cyg (), buf, sizeof(buf)-1, &n, NULL);
> + ResetEvent (input_available_event);
> + tcsetattr (TCSANOW, &ti);
> + buf[n] = '\0';
> + int rows, cols;
> + sscanf (buf, "\033[%d;%dR", &rows, &cols);
Wouldn't it be safer to initialize rows and cols to 0 and to check the
result of sscanf?
> HANDLE
> diff --git a/winsup/cygwin/tty.h b/winsup/cygwin/tty.h
> index 927d7afd9384..c7aeef85b482 100644
> --- a/winsup/cygwin/tty.h
> +++ b/winsup/cygwin/tty.h
> @@ -106,6 +106,7 @@ private:
> int num_pcon_attached_slaves;
> UINT term_code_page;
> bool need_clear_screen;
> + bool need_clear_screen_on_write;
Maybe the name should be aligned to the fact that it doesn't clear the
screen anymore?
Thanks,
Corinna
--
Corinna Vinschen
Cygwin Maintainer
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://cygwin.com/pipermail/cygwin-patches/attachments/20191023/7ac049ae/attachment.sig>
More information about the Cygwin-patches
mailing list