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>
|
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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user