summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Yano via Cygwin-patches <cygwin-patches@cygwin.com>2021-03-05 18:01:50 +0900
committerCorinna Vinschen <corinna@vinschen.de>2021-03-08 10:33:30 +0100
commit4e16e575db04b2d1f8af215bff299339348016f4 (patch)
tree7ff854cd2927539dfc6a15ac142229f58b492f04
parent582628d551e46754dedb53480ff05217409b55d2 (diff)
downloadcygnal-4e16e575db04b2d1f8af215bff299339348016f4.tar.gz
cygnal-4e16e575db04b2d1f8af215bff299339348016f4.tar.bz2
cygnal-4e16e575db04b2d1f8af215bff299339348016f4.zip
Cygwin: pty: Discard input already accepted on interrupt.
- Currently, input already accepted is not discarded on interrupt by VINTR, VQUIT and VSUSP keys. This patch fixes the issue.
-rw-r--r--winsup/cygwin/fhandler.h2
-rw-r--r--winsup/cygwin/fhandler_termios.cc5
-rw-r--r--winsup/cygwin/fhandler_tty.cc23
-rw-r--r--winsup/cygwin/tty.cc1
-rw-r--r--winsup/cygwin/tty.h1
5 files changed, 31 insertions, 1 deletions
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index 9b85d1ee9..4da35b7f5 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -1921,6 +1921,7 @@ class fhandler_termios: public fhandler_base
int eat_readahead (int n);
virtual void acquire_input_mutex_if_necessary (DWORD ms) {};
virtual void release_input_mutex_if_necessary (void) {};
+ virtual void discard_input () {};
public:
tty_min*& tc () {return _tc;}
@@ -2451,6 +2452,7 @@ public:
void fixup_after_exec ();
int tcgetpgrp ();
void flush_to_slave ();
+ void discard_input ();
fhandler_pty_master (void *) {}
diff --git a/winsup/cygwin/fhandler_termios.cc b/winsup/cygwin/fhandler_termios.cc
index ae35fe894..b487acab3 100644
--- a/winsup/cygwin/fhandler_termios.cc
+++ b/winsup/cygwin/fhandler_termios.cc
@@ -333,7 +333,10 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti,
termios_printf ("got interrupt %d, sending signal %d", c, sig);
if (!(ti.c_lflag & NOFLSH))
- eat_readahead (-1);
+ {
+ eat_readahead (-1);
+ discard_input ();
+ }
release_input_mutex_if_necessary ();
tc ()->kill_pgrp (sig);
acquire_input_mutex_if_necessary (INFINITE);
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index 930501d01..244147a80 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -391,6 +391,21 @@ fhandler_pty_master::flush_to_slave ()
accept_input ();
}
+void
+fhandler_pty_master::discard_input ()
+{
+ DWORD bytes_in_pipe;
+ char buf[1024];
+ DWORD n;
+
+ WaitForSingleObject (input_mutex, INFINITE);
+ while (::bytes_available (bytes_in_pipe, from_master_cyg) && bytes_in_pipe)
+ ReadFile (from_master_cyg, buf, sizeof(buf), &n, NULL);
+ ResetEvent (input_available_event);
+ get_ttyp ()->discard_input = true;
+ ReleaseMutex (input_mutex);
+}
+
DWORD
fhandler_pty_common::__acquire_output_mutex (const char *fn, int ln,
DWORD ms)
@@ -2150,6 +2165,9 @@ fhandler_pty_master::write (const void *ptr, size_t len)
}
WaitForSingleObject (input_mutex, INFINITE);
+ if ((ti.c_lflag & ISIG) && !(ti.c_iflag & IGNBRK)
+ && !(ti.c_lflag & NOFLSH) && memchr (buf, '\003', nlen))
+ get_ttyp ()->discard_input = true;
DWORD n;
WriteFile (to_slave, buf, nlen, &n, NULL);
ReleaseMutex (input_mutex);
@@ -3709,6 +3727,8 @@ fhandler_pty_slave::transfer_input (tty::xfer_dir dir, HANDLE from, tty *ttyp,
while (PeekConsoleInputA (from, r, INREC_SIZE, &n) && n)
{
ReadConsoleInputA (from, r, n, &n);
+ if (ttyp->discard_input)
+ continue;
int len = 0;
char *ptr = buf;
for (DWORD i = 0; i < n; i++)
@@ -3773,6 +3793,8 @@ fhandler_pty_slave::transfer_input (tty::xfer_dir dir, HANDLE from, tty *ttyp,
{
DWORD n = MIN (bytes_in_pipe, NT_MAX_PATH);
ReadFile (from, buf, n, &n, NULL);
+ if (ttyp->discard_input)
+ continue;
char *ptr = buf;
if (dir == tty::to_nat)
{
@@ -3803,4 +3825,5 @@ fhandler_pty_slave::transfer_input (tty::xfer_dir dir, HANDLE from, tty *ttyp,
else if (transfered)
SetEvent (input_available_event);
ttyp->pcon_input_state = dir;
+ ttyp->discard_input = false;
}
diff --git a/winsup/cygwin/tty.cc b/winsup/cygwin/tty.cc
index eaab573e0..3c016315c 100644
--- a/winsup/cygwin/tty.cc
+++ b/winsup/cygwin/tty.cc
@@ -253,6 +253,7 @@ tty::init ()
pcon_input_state = to_cyg;
last_sig = 0;
mask_flusho = false;
+ discard_input = false;
}
HANDLE
diff --git a/winsup/cygwin/tty.h b/winsup/cygwin/tty.h
index b74120416..f041250a3 100644
--- a/winsup/cygwin/tty.h
+++ b/winsup/cygwin/tty.h
@@ -131,6 +131,7 @@ private:
bool req_xfer_input;
xfer_dir pcon_input_state;
bool mask_flusho;
+ bool discard_input;
public:
HANDLE from_master () const { return _from_master; }