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
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2004-01-23 18:23:41 +0300
committerChristopher Faylor <me@cgf.cx>2004-01-23 18:23:41 +0300
commit25063d73915e31e7c5d6ba8429cdfc15e0d21a4f (patch)
treec1691137e6b88d0c65efb2a45089dd54839c322e
parentf97a316f3fba5042e9b769ff394b3ec65665e25f (diff)
* fhandler_serial.cc (fhandler_serial::raw_write): Prevent a deadlock when the
input buffer overflows. (fhandler_serial::raw_read): Correct to print the actual error and only call PurgeComm when necessary.
-rw-r--r--winsup/cygwin/ChangeLog7
-rw-r--r--winsup/cygwin/fhandler_serial.cc13
2 files changed, 16 insertions, 4 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index d3eb606ff..e7e9414ef 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,10 @@
+2004-01-22 Brian Ford <ford@vss.fsi.com>
+
+ * fhandler_serial.cc (fhandler_serial::raw_write): Prevent a deadlock
+ when the input buffer overflows.
+ (fhandler_serial::raw_read): Correct to print the actual error and only
+ call PurgeComm when necessary.
+
2004-01-22 Christopher Faylor <cgf@redhat.com>
* dcrt0.cc (reent_data): Make global.
diff --git a/winsup/cygwin/fhandler_serial.cc b/winsup/cygwin/fhandler_serial.cc
index efb1af99b..c5e1f6d98 100644
--- a/winsup/cygwin/fhandler_serial.cc
+++ b/winsup/cygwin/fhandler_serial.cc
@@ -133,16 +133,16 @@ fhandler_serial::raw_read (void *ptr, size_t& ulen)
continue;
err:
- PurgeComm (get_handle (), PURGE_RXABORT);
debug_printf ("err %E");
- if (GetLastError () == ERROR_OPERATION_ABORTED)
- n = 0;
- else
+ if (GetLastError () != ERROR_OPERATION_ABORTED)
{
+ PurgeComm (get_handle (), PURGE_RXABORT);
tot = -1;
__seterrno ();
break;
}
+
+ n = 0;
}
out:
@@ -169,6 +169,11 @@ fhandler_serial::raw_write (const void *ptr, size_t len)
switch (GetLastError ())
{
case ERROR_OPERATION_ABORTED:
+ DWORD ev;
+ if (!ClearCommError (get_handle (), &ev, NULL))
+ goto err;
+ if (ev)
+ termios_printf ("error detected %x", ev);
continue;
case ERROR_IO_PENDING:
break;