Cygwin: pty: Fix error handling of master write().

- Currently, error handling of write() in pty master side is broken.
  This patch fixes that.
This commit is contained in:
Takashi Yano 2021-09-07 19:27:45 +09:00 committed by Corinna Vinschen
parent 522cdab541
commit b52f10c4ca
2 changed files with 18 additions and 17 deletions

View File

@ -308,12 +308,12 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti,
int input_done = 0; int input_done = 0;
bool sawsig = false; bool sawsig = false;
int iscanon = ti.c_lflag & ICANON; int iscanon = ti.c_lflag & ICANON;
size_t read_cnt = 0;
if (bytes_read) while (read_cnt < nread)
*bytes_read = nread;
while (nread-- > 0)
{ {
c = *rptr++; c = *rptr++;
read_cnt++;
paranoid_printf ("char %0o", c); paranoid_printf ("char %0o", c);
@ -453,7 +453,6 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti,
if (status != 1) if (status != 1)
{ {
ret = status ? line_edit_error : line_edit_pipe_full; ret = status ? line_edit_error : line_edit_pipe_full;
nread += ralen ();
break; break;
} }
ret = line_edit_input_done; 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 we didn't write all bytes in non-canonical mode, write them now. */
if (!iscanon && ralen () > 0 if ((input_done || !iscanon) && ralen () > 0 && ret != line_edit_error)
&& (ret == line_edit_ok || ret == line_edit_input_done))
{ {
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) if (status != 1)
{
ret = status ? line_edit_error : line_edit_pipe_full; ret = status ? line_edit_error : line_edit_pipe_full;
nread += ralen ();
}
else else
ret = line_edit_input_done; ret = line_edit_input_done;
} }
/* Adding one compensates for the postdecrement in the above loop. */
if (bytes_read) if (bytes_read)
*bytes_read -= (nread + 1); *bytes_read = read_cnt;
if (sawsig) if (sawsig)
ret = line_edit_signalled; ret = line_edit_signalled;

View File

@ -561,18 +561,21 @@ fhandler_pty_master::accept_input ()
{ {
n = p1 - p0 + 1; n = p1 - p0 + 1;
rc = WriteFile (write_to, p0, n, &n, NULL); rc = WriteFile (write_to, p0, n, &n, NULL);
if (rc)
written += n; written += n;
p0 = p1 + 1; p0 = p1 + 1;
} }
if ((n = bytes_left - (p0 - p))) if (rc && (n = bytes_left - (p0 - p)))
{ {
rc = WriteFile (write_to, p0, n, &n, NULL); rc = WriteFile (write_to, p0, n, &n, NULL);
if (rc)
written += n; written += n;
} }
if (!rc) if (!rc && written == 0)
{ {
debug_printf ("error writing to pipe %p %E", write_to); debug_printf ("error writing to pipe %p %E", write_to);
get_ttyp ()->read_retval = -1; get_ttyp ()->read_retval = -1;
puts_readahead (p, bytes_left);
ret = -1; ret = -1;
} }
else else