diff options
author | Takashi Yano <takashi.yano@nifty.ne.jp> | 2021-09-14 14:59:08 +0300 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2021-09-14 17:16:15 +0300 |
commit | a217fa98fda80a7b706e93b6a55a0a8b26f2d586 (patch) | |
tree | 9eb45dc0a90ad2b049a1c6034856dbc7fbdf4fde | |
parent | e4e45379796f999a07029df3bd15918105a751e3 (diff) |
Cygwin: pipe: Fix handling of EPIPE and SIGPIPE in raw_write().
-rw-r--r-- | winsup/cygwin/fhandler_pipe.cc | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/winsup/cygwin/fhandler_pipe.cc b/winsup/cygwin/fhandler_pipe.cc index 7e5ab328c..c2f4353f6 100644 --- a/winsup/cygwin/fhandler_pipe.cc +++ b/winsup/cygwin/fhandler_pipe.cc @@ -407,6 +407,13 @@ fhandler_pipe_fifo::raw_write (const void *ptr, size_t len) if (!len) return 0; + if (reader_closed ()) + { + set_errno (EPIPE); + raise (SIGPIPE); + return -1; + } + if (len <= pipe_buf_size) chunk = len; else if (is_nonblocking ()) @@ -475,7 +482,7 @@ fhandler_pipe_fifo::raw_write (const void *ptr, size_t len) CancelIo (get_handle ()); set_errno (EPIPE); raise (SIGPIPE); - break; + goto out; } else cygwait (select_sem, 10); @@ -527,6 +534,7 @@ fhandler_pipe_fifo::raw_write (const void *ptr, size_t len) if (nbytes_now == 0) break; } +out: if (evt) CloseHandle (evt); if (status == STATUS_THREAD_SIGNALED && nbytes == 0) |