From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2155) id 253443857404; Tue, 14 Sep 2021 15:08:20 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 253443857404 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Corinna Vinschen To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: pipe: Fix handling of EPIPE and SIGPIPE in raw_write(). X-Act-Checkin: newlib-cygwin X-Git-Author: Takashi Yano X-Git-Refname: refs/heads/master X-Git-Oldrev: e4e45379796f999a07029df3bd15918105a751e3 X-Git-Newrev: a217fa98fda80a7b706e93b6a55a0a8b26f2d586 Message-Id: <20210914150820.253443857404@sourceware.org> Date: Tue, 14 Sep 2021 15:08:20 +0000 (GMT) X-BeenThere: cygwin-cvs@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Cygwin core component git logs List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 14 Sep 2021 15:08:20 -0000 https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=a217fa98fda80a7b706e93b6a55a0a8b26f2d586 commit a217fa98fda80a7b706e93b6a55a0a8b26f2d586 Author: Takashi Yano Date: Tue Sep 14 20:59:08 2021 +0900 Cygwin: pipe: Fix handling of EPIPE and SIGPIPE in raw_write(). Diff: --- winsup/cygwin/fhandler_pipe.cc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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)