Cygwin: pty: Prevent garbage remained in read ahead buffer.
- After commit 29431fcb5b, 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.
			
			
This commit is contained in:
		
				
					committed by
					
						 Corinna Vinschen
						Corinna Vinschen
					
				
			
			
				
	
			
			
			
						parent
						
							d6242d8733
						
					
				
				
					commit
					0f7193f4fb
				
			| @@ -328,7 +328,7 @@ class fhandler_base | |||||||
|  |  | ||||||
|   virtual bool get_readahead_valid () { return raixget () < ralen (); } |   virtual bool get_readahead_valid () { return raixget () < ralen (); } | ||||||
|   int puts_readahead (const char *s, size_t len = (size_t) -1); |   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 get_readahead (); | ||||||
|   int peek_readahead (int queryput = 0); |   int peek_readahead (int queryput = 0); | ||||||
| @@ -2381,6 +2381,7 @@ public: | |||||||
|   int process_slave_output (char *buf, size_t len, int pktmode_on); |   int process_slave_output (char *buf, size_t len, int pktmode_on); | ||||||
|   void doecho (const void *str, DWORD len); |   void doecho (const void *str, DWORD len); | ||||||
|   int accept_input (); |   int accept_input (); | ||||||
|  |   int put_readahead (char value); | ||||||
|   int open (int flags, mode_t mode = 0); |   int open (int flags, mode_t mode = 0); | ||||||
|   void open_setup (int flags); |   void open_setup (int flags); | ||||||
|   ssize_t __stdcall write (const void *ptr, size_t len); |   ssize_t __stdcall write (const void *ptr, size_t len); | ||||||
|   | |||||||
| @@ -532,6 +532,14 @@ fhandler_pty_master::doecho (const void *str, DWORD len) | |||||||
|   release_output_mutex (); |   release_output_mutex (); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int | ||||||
|  | fhandler_pty_master::put_readahead (char value) | ||||||
|  | { | ||||||
|  |   if (to_be_read_from_pcon ()) | ||||||
|  |     return 1; | ||||||
|  |   return fhandler_base::put_readahead (value); | ||||||
|  | } | ||||||
|  |  | ||||||
| int | int | ||||||
| fhandler_pty_master::accept_input () | fhandler_pty_master::accept_input () | ||||||
| { | { | ||||||
| @@ -542,12 +550,14 @@ fhandler_pty_master::accept_input () | |||||||
|  |  | ||||||
|   bytes_left = eat_readahead (-1); |   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"); |       termios_printf ("sending EOF to slave"); | ||||||
|       get_ttyp ()->read_retval = 0; |       get_ttyp ()->read_retval = 0; | ||||||
|     } |     } | ||||||
|   else if (!to_be_read_from_pcon ()) |   else | ||||||
|     { |     { | ||||||
|       char *p = rabuf (); |       char *p = rabuf (); | ||||||
|       DWORD rc; |       DWORD rc; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user