* spawn.cc (child_info_spawn::worker): Save and restore my_wr_proc_pipe around

non-execing operations to avoid handle leak seen in
http://cygwin.com/ml/cygwin/2013-03/msg00152.html .
This commit is contained in:
Christopher Faylor 2013-03-09 00:11:31 +00:00
parent 735c1b8006
commit 6a375e0325
2 changed files with 20 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2013-03-08 Christopher Faylor <me.cygwin2013@cgf.cx>
* spawn.cc (child_info_spawn::worker): Save and restore my_wr_proc_pipe
around non-execing operations to avoid handle leak seen in
http://cygwin.com/ml/cygwin/2013-03/msg00152.html .
2013-03-07 Corinna Vinschen <corinna@vinschen.de>
* include/sys/un.h (UNIX_PATH_MAX): Rename from UNIX_PATH_LEN to

View File

@ -620,6 +620,9 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv,
SetHandleInformation (wr_proc_pipe, HANDLE_FLAG_INHERIT, 0);
SetHandleInformation (parent, HANDLE_FLAG_INHERIT, 0);
}
/* FIXME: racy */
if (mode != _P_OVERLAY)
SetHandleInformation (my_wr_proc_pipe, HANDLE_FLAG_INHERIT, 0);
parent_winpid = GetCurrentProcessId ();
/* When ruid != euid we create the new process under the current original
@ -724,10 +727,9 @@ loop:
}
}
/* Restore impersonation. In case of _P_OVERLAY this isn't
allowed since it would overwrite child data. */
if (mode != _P_OVERLAY || !rc)
::cygheap->user.reimpersonate ();
if (mode != _P_OVERLAY)
SetHandleInformation (my_wr_proc_pipe, HANDLE_FLAG_INHERIT,
HANDLE_FLAG_INHERIT);
/* Set errno now so that debugging messages from it appear before our
final debugging message [this is a general rule for debugging
@ -748,9 +750,16 @@ loop:
be closed otherwise. Don't need to do this for 'parent' since it will
be closed in every case. See FIXME above. */
if (!iscygwin () && mode == _P_OVERLAY)
SetHandleInformation (wr_proc_pipe, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
SetHandleInformation (wr_proc_pipe, HANDLE_FLAG_INHERIT,
HANDLE_FLAG_INHERIT);
if (wr_proc_pipe == my_wr_proc_pipe)
wr_proc_pipe = NULL; /* We still own it: don't nuke in destructor */
/* Restore impersonation. In case of _P_OVERLAY this isn't
allowed since it would overwrite child data. */
if (mode != _P_OVERLAY)
::cygheap->user.reimpersonate ();
res = -1;
goto out;
}