Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorTakashi Yano via Cygwin-patches <cygwin-patches@cygwin.com>2020-05-31 08:53:17 +0300
committerCorinna Vinschen <corinna@vinschen.de>2020-05-31 11:33:55 +0300
commit0f7193f4fbbfdde52fe21639ca582a32a63eb851 (patch)
tree3d60b775f779db84e06de2c70aefa52df9bcaebb /winsup
parentd6242d87336d7f06691d1e1d9a3ce9324fd9903c (diff)
Cygwin: pty: Prevent garbage remained in read ahead buffer.
- After commit 29431fcb5b14d4c5ac3b3161a076eb1a208349d9, the issue reported in https://cygwin.com/pipermail/cygwin/2020-May/245057.html occurs. This is caused by the following mechanism. Cygwin less called from non-cygwin git is executed under /dev/cons* rather than /dev/pty* because parent git process only inherits pseudo console handle. Therefore, less sets ICANON flag for /dev/cons* rather than original /dev/pty*. When pty is switched to non-cygwin git process, line_edit() is used in fhandler_pty_master::write() only to set input_available_event and read ahead buffer is supposed to be flushed in accept_input(). However, ICANON flag is not set for /dev/pty*, so accept_input() is not called unless newline is entered. As a result, the input data remains in the read ahead buffer. This patch fixes the issue.
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/fhandler.h3
-rw-r--r--winsup/cygwin/fhandler_tty.cc14
2 files changed, 14 insertions, 3 deletions
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index b2957e4ee..4035c7e56 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -328,7 +328,7 @@ class fhandler_base
virtual bool get_readahead_valid () { return raixget () < ralen (); }
int puts_readahead (const char *s, size_t len = (size_t) -1);
- int put_readahead (char value);
+ virtual int put_readahead (char value);
int get_readahead ();
int peek_readahead (int queryput = 0);
@@ -2381,6 +2381,7 @@ public:
int process_slave_output (char *buf, size_t len, int pktmode_on);
void doecho (const void *str, DWORD len);
int accept_input ();
+ int put_readahead (char value);
int open (int flags, mode_t mode = 0);
void open_setup (int flags);
ssize_t __stdcall write (const void *ptr, size_t len);
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index b091765b3..d017cde38 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -533,6 +533,14 @@ fhandler_pty_master::doecho (const void *str, DWORD len)
}
int
+fhandler_pty_master::put_readahead (char value)
+{
+ if (to_be_read_from_pcon ())
+ return 1;
+ return fhandler_base::put_readahead (value);
+}
+
+int
fhandler_pty_master::accept_input ()
{
DWORD bytes_left;
@@ -542,12 +550,14 @@ fhandler_pty_master::accept_input ()
bytes_left = eat_readahead (-1);
- if (!bytes_left)
+ if (to_be_read_from_pcon ())
+ ; /* Do nothing */
+ else if (!bytes_left)
{
termios_printf ("sending EOF to slave");
get_ttyp ()->read_retval = 0;
}
- else if (!to_be_read_from_pcon ())
+ else
{
char *p = rabuf ();
DWORD rc;