https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=a9b6d328823abaea1b94af95866fbe4eccdd8960
commit a9b6d328823abaea1b94af95866fbe4eccdd8960 Author: Ken Brown <[email protected]> Date: Sat Jun 22 11:46:49 2019 -0400 Cygwin: FIFO: add some error checking Change the return type of fhandler_fifo::delete_client_handler from void to int so that we can report errors. Diff: --- winsup/cygwin/fhandler.h | 2 +- winsup/cygwin/fhandler_fifo.cc | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index f244f34..156baed 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -1271,7 +1271,7 @@ class fhandler_fifo: public fhandler_base HANDLE create_pipe_instance (bool); NTSTATUS open_pipe (HANDLE&); int add_client_handler (); - void delete_client_handler (int); + int delete_client_handler (int); bool listen_client (); int stop_listen_client (); int check_listen_client_thread (); diff --git a/winsup/cygwin/fhandler_fifo.cc b/winsup/cygwin/fhandler_fifo.cc index f63787f..4568ea0 100644 --- a/winsup/cygwin/fhandler_fifo.cc +++ b/winsup/cygwin/fhandler_fifo.cc @@ -257,13 +257,14 @@ out: return ret; } -void +int fhandler_fifo::delete_client_handler (int i) { - fc_handler[i].close (); + int ret = fc_handler[i].close (); if (i < --nhandlers) memmove (fc_handler + i, fc_handler + i + 1, (nhandlers - i) * sizeof (fc_handler[i])); + return ret; } /* Just hop to the listen_client_thread method. */ @@ -324,7 +325,13 @@ fhandler_fifo::listen_client_thread () while (i < nhandlers) { if (fc_handler[i].state == fc_invalid) - delete_client_handler (i); + { + if (delete_client_handler (i) < 0) + { + fifo_client_unlock (); + goto out; + } + } else i++; }
