public inbox for cygwin-patches@cygwin.com
 help / color / mirror / Atom feed
* [PATCH] Cygwin: pty: Fix error handling of master write().
@ 2021-09-07 10:27 Takashi Yano
  2021-09-07 18:22 ` Corinna Vinschen
  0 siblings, 1 reply; 2+ messages in thread
From: Takashi Yano @ 2021-09-07 10:27 UTC (permalink / raw)
  To: cygwin-patches

- Currently, error handling of write() in pty master side is broken.
  This patch fixes that.
---
 winsup/cygwin/fhandler_termios.cc | 24 +++++++++++-------------
 winsup/cygwin/fhandler_tty.cc     | 11 +++++++----
 2 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/winsup/cygwin/fhandler_termios.cc b/winsup/cygwin/fhandler_termios.cc
index b487acab3..012ecb356 100644
--- a/winsup/cygwin/fhandler_termios.cc
+++ b/winsup/cygwin/fhandler_termios.cc
@@ -308,12 +308,12 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti,
   int input_done = 0;
   bool sawsig = false;
   int iscanon = ti.c_lflag & ICANON;
+  size_t read_cnt = 0;
 
-  if (bytes_read)
-    *bytes_read = nread;
-  while (nread-- > 0)
+  while (read_cnt < nread)
     {
       c = *rptr++;
+      read_cnt++;
 
       paranoid_printf ("char %0o", c);
 
@@ -453,7 +453,6 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti,
 	  if (status != 1)
 	    {
 	      ret = status ? line_edit_error : line_edit_pipe_full;
-	      nread += ralen ();
 	      break;
 	    }
 	  ret = line_edit_input_done;
@@ -462,22 +461,21 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti,
     }
 
   /* If we didn't write all bytes in non-canonical mode, write them now. */
-  if (!iscanon && ralen () > 0
-      && (ret == line_edit_ok || ret == line_edit_input_done))
+  if ((input_done || !iscanon) && ralen () > 0 && ret != line_edit_error)
     {
-      int status = accept_input ();
+      int status;
+      int retry_count = 3;
+      while ((status = accept_input ()) != 1 &&
+	     ralen () > 0 && --retry_count > 0)
+	cygwait ((DWORD) 10);
       if (status != 1)
-	{
-	  ret = status ? line_edit_error : line_edit_pipe_full;
-	  nread += ralen ();
-	}
+	ret = status ? line_edit_error : line_edit_pipe_full;
       else
 	ret = line_edit_input_done;
     }
 
-  /* Adding one compensates for the postdecrement in the above loop. */
   if (bytes_read)
-    *bytes_read -= (nread + 1);
+    *bytes_read = read_cnt;
 
   if (sawsig)
     ret = line_edit_signalled;
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index f2ac26892..1ea9a47ac 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -561,18 +561,21 @@ fhandler_pty_master::accept_input ()
 	{
 	  n = p1 - p0 + 1;
 	  rc = WriteFile (write_to, p0, n, &n, NULL);
-	  written += n;
+	  if (rc)
+	    written += n;
 	  p0 = p1 + 1;
 	}
-      if ((n = bytes_left - (p0 - p)))
+      if (rc && (n = bytes_left - (p0 - p)))
 	{
 	  rc = WriteFile (write_to, p0, n, &n, NULL);
-	  written += n;
+	  if (rc)
+	    written += n;
 	}
-      if (!rc)
+      if (!rc && written == 0)
 	{
 	  debug_printf ("error writing to pipe %p %E", write_to);
 	  get_ttyp ()->read_retval = -1;
+	  puts_readahead (p, bytes_left);
 	  ret = -1;
 	}
       else
-- 
2.33.0


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] Cygwin: pty: Fix error handling of master write().
  2021-09-07 10:27 [PATCH] Cygwin: pty: Fix error handling of master write() Takashi Yano
@ 2021-09-07 18:22 ` Corinna Vinschen
  0 siblings, 0 replies; 2+ messages in thread
From: Corinna Vinschen @ 2021-09-07 18:22 UTC (permalink / raw)
  To: cygwin-patches

On Sep  7 19:27, Takashi Yano wrote:
> - Currently, error handling of write() in pty master side is broken.
>   This patch fixes that.
> ---
>  winsup/cygwin/fhandler_termios.cc | 24 +++++++++++-------------
>  winsup/cygwin/fhandler_tty.cc     | 11 +++++++----
>  2 files changed, 18 insertions(+), 17 deletions(-)

Pushed.


Thanks,
Corinna

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-09-07 18:22 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-07 10:27 [PATCH] Cygwin: pty: Fix error handling of master write() Takashi Yano
2021-09-07 18:22 ` Corinna Vinschen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).