Cygwin: pipe: Fix error handling in fhandler_pip::create().
- Currently, error handling in fhandler_pipe::create() is broken. This patch fixes that.
This commit is contained in:
parent
350806f882
commit
d8614e355d
|
@ -1206,7 +1206,6 @@ public:
|
||||||
fhandler_pipe ();
|
fhandler_pipe ();
|
||||||
|
|
||||||
bool ispipe() const { return true; }
|
bool ispipe() const { return true; }
|
||||||
void set_read_mutex (HANDLE mtx) { read_mtx = mtx; }
|
|
||||||
void set_pipe_buf_size ();
|
void set_pipe_buf_size ();
|
||||||
|
|
||||||
void set_popen_pid (pid_t pid) {popen_pid = pid;}
|
void set_popen_pid (pid_t pid) {popen_pid = pid;}
|
||||||
|
|
|
@ -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);
|
int ret = nt_create (sa, r, w, psize, &unique_id);
|
||||||
if (ret)
|
if (ret)
|
||||||
__seterrno_from_win_error (ret);
|
|
||||||
else if ((fhs[0] = (fhandler_pipe *) build_fh_dev (*piper_dev)) == NULL)
|
|
||||||
{
|
{
|
||||||
NtClose (r);
|
__seterrno_from_win_error (ret);
|
||||||
NtClose (w);
|
goto out;
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
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);
|
||||||
|
|
||||||
debug_printf ("%R = pipe([%p, %p], %d, %y)", res, fhs[0], fhs[1], psize, mode);
|
/* 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;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue