Fix hang stracing forking processes but not following child
* ntdll.h (PROCESSINFOCLASS): Define ProcessDebugFlags. * sigproc.cc (child_info::child_info): Only propagate _CI_STRACED to child if strace is actually tracing child processes. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
parent
986069c7e3
commit
dbc1cae5c5
|
@ -1,3 +1,9 @@
|
||||||
|
2015-08-24 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* ntdll.h (PROCESSINFOCLASS): Define ProcessDebugFlags.
|
||||||
|
* sigproc.cc (child_info::child_info): Only propagate _CI_STRACED to
|
||||||
|
child if strace is actually tracing child processes.
|
||||||
|
|
||||||
2015-08-24 Corinna Vinschen <corinna@vinschen.de>
|
2015-08-24 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* include/cygwin/version.h (CYGWIN_VERSION_DLL_MINOR): Bump to 2.
|
* include/cygwin/version.h (CYGWIN_VERSION_DLL_MINOR): Bump to 2.
|
||||||
|
|
|
@ -532,7 +532,8 @@ typedef enum _PROCESSINFOCLASS
|
||||||
ProcessTimes = 4,
|
ProcessTimes = 4,
|
||||||
ProcessSessionInformation = 24,
|
ProcessSessionInformation = 24,
|
||||||
ProcessWow64Information = 26,
|
ProcessWow64Information = 26,
|
||||||
ProcessImageFileName = 27
|
ProcessImageFileName = 27,
|
||||||
|
ProcessDebugFlags = 31
|
||||||
} PROCESSINFOCLASS;
|
} PROCESSINFOCLASS;
|
||||||
|
|
||||||
/* Checked on 64 bit. */
|
/* Checked on 64 bit. */
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
What's new:
|
||||||
|
-----------
|
||||||
|
|
||||||
|
|
||||||
|
What changed:
|
||||||
|
-------------
|
||||||
|
|
||||||
|
|
||||||
|
Bug Fixes
|
||||||
|
---------
|
||||||
|
|
||||||
|
- Fix a hang when stracing a forking or spawning process without activating
|
||||||
|
stracing of child processes.
|
||||||
|
Addresses: https://cygwin.com/ml/cygwin/2015-08/msg00390.html
|
|
@ -772,7 +772,21 @@ child_info::child_info (unsigned in_cb, child_info_types chtype,
|
||||||
fhandler_union_cb = sizeof (fhandler_union);
|
fhandler_union_cb = sizeof (fhandler_union);
|
||||||
user_h = cygwin_user_h;
|
user_h = cygwin_user_h;
|
||||||
if (strace.active ())
|
if (strace.active ())
|
||||||
flag |= _CI_STRACED;
|
{
|
||||||
|
NTSTATUS status;
|
||||||
|
ULONG DebugFlags;
|
||||||
|
|
||||||
|
/* Only propagate _CI_STRACED to child if strace is actually tracing
|
||||||
|
child processes of this process. The undocumented ProcessDebugFlags
|
||||||
|
returns 0 if EPROCESS->NoDebugInherit is TRUE, 1 otherwise.
|
||||||
|
This avoids a hang when stracing a forking or spawning process
|
||||||
|
with the -f flag set to "don't follow fork". */
|
||||||
|
status = NtQueryInformationProcess (GetCurrentProcess (),
|
||||||
|
ProcessDebugFlags, &DebugFlags,
|
||||||
|
sizeof (DebugFlags), NULL);
|
||||||
|
if (NT_SUCCESS (status) && DebugFlags)
|
||||||
|
flag |= _CI_STRACED;
|
||||||
|
}
|
||||||
if (need_subproc_ready)
|
if (need_subproc_ready)
|
||||||
{
|
{
|
||||||
subproc_ready = CreateEvent (&sec_all, FALSE, FALSE, NULL);
|
subproc_ready = CreateEvent (&sec_all, FALSE, FALSE, NULL);
|
||||||
|
|
Loading…
Reference in New Issue