* configure.in: Remove NEWVFORK default.

* configure: Regenerate.
* dcrt0.cc: Conditionalize vfork stuff throughout.
* dtable.cc: Ditto.
* perthread.h: Ditto.
* pipe.cc (fhandler_pipe::close): Ditto.
* spawn.cc (spawnve): Ditto.
* syscalls.cc (setsid): Ditto.
* exceptions.cc (sigpacket::process): Use macro to refer to vfork pid.
* debug.cc (verify_handle): Define new function.
* debug.h (VerifyHandle): Define new macro.
(verify_handle): Declare new function
* fhandler.cc (fhandler_base::dup): Verify that dup'ed handle is not supposed
to be in use.
(fhandler_base::set_inheritance): Ditto.
(fhandler_base::fork_fixup): Ditto.
* fhandler_socket.cc (fhandler_socket::dup): Ditto.
* fhandler_tty.cc (fhandler_tty_slave::open): Ditto.
* net.cc (set_socket_inheritance): Ditto.
* pinfo.cc (pinfo_fixup_after_exec): Ditto.
* sigproc.cc (proc_subproc): Ditto.
(sig_send): Ditto.
* spawn.cc (spawn_guts): Ditto.
* thread.cc (pthread::init_mainthread): Ditto.
* pipe.cc (fhandler_pipe::close): Close read_state with ForceCloseHandle since
it was protected.
(fhandler_pipe::fixup_after_exec): Protect read_state handle.
(fhandler_pipe::dup): Correctly close open handles on error condition.  Verify
that dup'ed handle is not supposed to be in use.
(fhandler_pipe::create): Protect read_state.
This commit is contained in:
Christopher Faylor
2004-01-23 23:05:33 +00:00
parent 7dddf53f5c
commit f723909038
22 changed files with 150 additions and 27 deletions

View File

@ -89,11 +89,15 @@ fhandler_pipe::close ()
CloseHandle (guard);
if (writepipe_exists)
CloseHandle (writepipe_exists);
#ifndef NEWVFORK
if (read_state)
#else
// FIXME is this vfork_cleanup test right? Is it responsible for some of
// the strange pipe behavior that has been reported in the cygwin mailing
// list?
if (read_state && !cygheap->fdtab.in_vfork_cleanup ())
CloseHandle (read_state);
#endif
ForceCloseHandle (read_state);
if (get_handle ())
{
CloseHandle (get_handle ());
@ -122,7 +126,10 @@ void
fhandler_pipe::fixup_after_exec (HANDLE parent)
{
if (read_state)
read_state = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL);
{
read_state = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL);
ProtectHandle (read_state);
}
}
void
@ -139,15 +146,17 @@ fhandler_pipe::fixup_after_fork (HANDLE parent)
int
fhandler_pipe::dup (fhandler_base *child)
{
int res = -1;
fhandler_pipe *ftp = (fhandler_pipe *) child;
ftp->guard = ftp->writepipe_exists = ftp->read_state = NULL;
if (get_handle ())
{
int res = fhandler_base::dup (child);
res = fhandler_base::dup (child);
if (res)
return res;
goto err;
}
fhandler_pipe *ftp = (fhandler_pipe *) child;
/* FIXME: This leaks handles in the failing condition */
if (guard == NULL)
ftp->guard = NULL;
@ -155,7 +164,7 @@ fhandler_pipe::dup (fhandler_base *child)
DUPLICATE_SAME_ACCESS))
{
debug_printf ("couldn't duplicate guard %p, %E", guard);
return -1;
goto err;
}
if (writepipe_exists == NULL)
@ -165,7 +174,7 @@ fhandler_pipe::dup (fhandler_base *child)
DUPLICATE_SAME_ACCESS))
{
debug_printf ("couldn't duplicate writepipe_exists %p, %E", writepipe_exists);
return -1;
goto err;
}
if (read_state == NULL)
@ -175,12 +184,31 @@ fhandler_pipe::dup (fhandler_base *child)
DUPLICATE_SAME_ACCESS))
{
debug_printf ("couldn't duplicate read_state %p, %E", writepipe_exists);
return -1;
goto err;
}
res = 0;
goto out;
err:
if (!ftp->guard)
CloseHandle (ftp->guard);
if (!ftp->writepipe_exists)
CloseHandle (ftp->writepipe_exists);
if (!ftp->read_state)
CloseHandle (ftp->read_state);
goto leave;
out:
ftp->id = id;
ftp->orig_pid = orig_pid;
return 0;
VerifyHandle (ftp->guard);
VerifyHandle (ftp->writepipe_exists);
VerifyHandle (ftp->read_state);
leave:
debug_printf ("res %d", res);
return res;
}
int
@ -208,6 +236,7 @@ fhandler_pipe::create (fhandler_pipe *fhs[2], unsigned psize, int mode, bool fif
fhs[0]->read_state = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL);
fhs[0]->set_need_fork_fixup ();
ProtectHandle1 (fhs[0]->read_state, read_state);
res = 0;
fhs[0]->create_guard (sa);