diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index f244f3486..156baed9c 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 f63787f57..4568ea080 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++; }