From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2210) id F30C33857020; Thu, 16 Sep 2021 15:41:09 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F30C33857020 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Ken Brown To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: pipe: Fix error handling in fhandler_pip::create(). X-Act-Checkin: newlib-cygwin X-Git-Author: Takashi Yano X-Git-Refname: refs/heads/master X-Git-Oldrev: 350806f8825985d3a16b18c6f41476415f9dd7cf X-Git-Newrev: d8614e355da550b29fda52c6f59bc7a5e1798b09 Message-Id: <20210916154109.F30C33857020@sourceware.org> Date: Thu, 16 Sep 2021 15:41:09 +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: Thu, 16 Sep 2021 15:41:10 -0000 https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=d8614e355da550b29fda52c6f59bc7a5e1798b09 commit d8614e355da550b29fda52c6f59bc7a5e1798b09 Author: Takashi Yano Date: Thu Sep 16 23:15:17 2021 +0900 Cygwin: pipe: Fix error handling in fhandler_pip::create(). - Currently, error handling in fhandler_pipe::create() is broken. This patch fixes that. Diff: --- winsup/cygwin/fhandler.h | 1 - winsup/cygwin/fhandler_pipe.cc | 101 ++++++++++++++++++++--------------------- 2 files changed, 48 insertions(+), 54 deletions(-) diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 919655012..eb312ccb6 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -1206,7 +1206,6 @@ public: fhandler_pipe (); bool ispipe() const { return true; } - void set_read_mutex (HANDLE mtx) { read_mtx = mtx; } void set_pipe_buf_size (); void set_popen_pid (pid_t pid) {popen_pid = pid;} diff --git a/winsup/cygwin/fhandler_pipe.cc b/winsup/cygwin/fhandler_pipe.cc index c2f4353f6..582b4d564 100644 --- a/winsup/cygwin/fhandler_pipe.cc +++ b/winsup/cygwin/fhandler_pipe.cc @@ -803,61 +803,56 @@ fhandler_pipe::create (fhandler_pipe *fhs[2], unsigned psize, int mode) int ret = nt_create (sa, r, w, psize, &unique_id); if (ret) - __seterrno_from_win_error (ret); - else if ((fhs[0] = (fhandler_pipe *) build_fh_dev (*piper_dev)) == NULL) { - NtClose (r); - NtClose (w); - } - else if ((fhs[1] = (fhandler_pipe *) build_fh_dev (*pipew_dev)) == NULL) - { - delete fhs[0]; - NtClose (r); - NtClose (w); - } - else - { - mode |= mode & O_TEXT ?: O_BINARY; - fhs[0]->init (r, FILE_CREATE_PIPE_INSTANCE | GENERIC_READ, mode, - unique_id); - fhs[1]->init (w, FILE_CREATE_PIPE_INSTANCE | GENERIC_WRITE, mode, - unique_id); - /* For the read side of the pipe, add a mutex. See raw_read for the - usage. */ - HANDLE mtx = CreateMutexW (sa, FALSE, NULL); - if (!mtx) - { - delete fhs[0]; - NtClose (r); - delete fhs[1]; - NtClose (w); - } - else - { - fhs[0]->set_read_mutex (mtx); - res = 0; - } - fhs[0]->select_sem = CreateSemaphore (sa, 0, INT32_MAX, NULL); - if (fhs[0]->select_sem) - DuplicateHandle (GetCurrentProcess (), fhs[0]->select_sem, - GetCurrentProcess (), &fhs[1]->select_sem, - 0, sa->bInheritHandle, DUPLICATE_SAME_ACCESS); - if (!DuplicateHandle (GetCurrentProcess (), r, - GetCurrentProcess (), &fhs[1]->query_hdl, - FILE_READ_DATA, sa->bInheritHandle, 0)) - { - CloseHandle (fhs[0]->select_sem); - delete fhs[0]; - CloseHandle (r); - CloseHandle (fhs[1]->select_sem); - delete fhs[1]; - CloseHandle (w); - } - else - res = 0; + __seterrno_from_win_error (ret); + goto out; } - - debug_printf ("%R = pipe([%p, %p], %d, %y)", res, fhs[0], fhs[1], psize, mode); + if ((fhs[0] = (fhandler_pipe *) build_fh_dev (*piper_dev)) == NULL) + goto err_close_rw_handle; + if ((fhs[1] = (fhandler_pipe *) build_fh_dev (*pipew_dev)) == NULL) + goto err_delete_fhs0; + mode |= mode & O_TEXT ?: O_BINARY; + fhs[0]->init (r, FILE_CREATE_PIPE_INSTANCE | GENERIC_READ, mode, unique_id); + fhs[1]->init (w, FILE_CREATE_PIPE_INSTANCE | GENERIC_WRITE, mode, unique_id); + + /* For the read side of the pipe, add a mutex. See raw_read for the + usage. */ + fhs[0]->read_mtx = CreateMutexW (sa, FALSE, NULL); + if (!fhs[0]->read_mtx) + goto err_delete_fhs1; + + fhs[0]->select_sem = CreateSemaphore (sa, 0, INT32_MAX, NULL); + if (!fhs[0]->select_sem) + goto err_close_read_mtx; + if (!DuplicateHandle (GetCurrentProcess (), fhs[0]->select_sem, + GetCurrentProcess (), &fhs[1]->select_sem, + 0, sa->bInheritHandle, DUPLICATE_SAME_ACCESS)) + goto err_close_select_sem0; + + if (!DuplicateHandle (GetCurrentProcess (), r, + GetCurrentProcess (), &fhs[1]->query_hdl, + FILE_READ_DATA, sa->bInheritHandle, 0)) + goto err_close_select_sem1; + + res = 0; + goto out; + +err_close_select_sem1: + CloseHandle (fhs[1]->select_sem); +err_close_select_sem0: + CloseHandle (fhs[0]->select_sem); +err_close_read_mtx: + CloseHandle (fhs[0]->read_mtx); +err_delete_fhs1: + delete fhs[1]; +err_delete_fhs0: + delete fhs[0]; +err_close_rw_handle: + NtClose (r); + NtClose (w); +out: + debug_printf ("%R = pipe([%p, %p], %d, %y)", + res, fhs[0], fhs[1], psize, mode); return res; }