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:
parent
735c1b8006
commit
6a375e0325
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user