4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-01-18 12:29:32 +08:00

* 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> 2013-03-07 Corinna Vinschen <corinna@vinschen.de>
* include/sys/un.h (UNIX_PATH_MAX): Rename from UNIX_PATH_LEN to * 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 (wr_proc_pipe, HANDLE_FLAG_INHERIT, 0);
SetHandleInformation (parent, 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 (); parent_winpid = GetCurrentProcessId ();
/* When ruid != euid we create the new process under the current original /* 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 if (mode != _P_OVERLAY)
allowed since it would overwrite child data. */ SetHandleInformation (my_wr_proc_pipe, HANDLE_FLAG_INHERIT,
if (mode != _P_OVERLAY || !rc) HANDLE_FLAG_INHERIT);
::cygheap->user.reimpersonate ();
/* Set errno now so that debugging messages from it appear before our /* Set errno now so that debugging messages from it appear before our
final debugging message [this is a general rule for debugging 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 otherwise. Don't need to do this for 'parent' since it will
be closed in every case. See FIXME above. */ be closed in every case. See FIXME above. */
if (!iscygwin () && mode == _P_OVERLAY) 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) if (wr_proc_pipe == my_wr_proc_pipe)
wr_proc_pipe = NULL; /* We still own it: don't nuke in destructor */ 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; res = -1;
goto out; goto out;
} }