From 3efd5a8cbff8d48b8cf9807070134bb79f591b7d Mon Sep 17 00:00:00 2001 From: Ken Brown Date: Thu, 26 Mar 2020 19:02:16 -0400 Subject: [PATCH] Cygwin: FIFO: fix a problem opening nonblocking writers Make read_ready a manual-reset event. Previously, when it was an auto-reset event, there was a brief period when read_ready was not set after a writer opened. An attempt to open a second writer during this period would fail with ENXIO if O_NONBLOCK was set, even if a reader was open. For the same reason, move ResetEvent(read_ready) from listen_client_thread() to close(). Addresses: https://sourceware.org/pipermail/cygwin/2020-March/244201.html --- winsup/cygwin/fhandler_fifo.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/winsup/cygwin/fhandler_fifo.cc b/winsup/cygwin/fhandler_fifo.cc index 19cd0e507..c7e27e883 100644 --- a/winsup/cygwin/fhandler_fifo.cc +++ b/winsup/cygwin/fhandler_fifo.cc @@ -463,7 +463,6 @@ fhandler_fifo::listen_client_thread () out: if (evt) CloseHandle (evt); - ResetEvent (read_ready); if (ret < 0) debug_printf ("exiting with error, %E"); else @@ -516,7 +515,7 @@ fhandler_fifo::open (int flags, mode_t) char npbuf[MAX_PATH]; __small_sprintf (npbuf, "r-event.%08x.%016X", get_dev (), get_ino ()); - if (!(read_ready = CreateEvent (sa_buf, false, false, npbuf))) + if (!(read_ready = CreateEvent (sa_buf, true, false, npbuf))) { debug_printf ("CreateEvent for %s failed, %E", npbuf); res = error_set_errno; @@ -1016,6 +1015,8 @@ fhandler_fifo::close () handler or another thread. */ fifo_client_unlock (); int ret = stop_listen_client (); + if (reader && read_ready) + ResetEvent (read_ready); if (read_ready) CloseHandle (read_ready); if (write_ready) -- 2.21.0