diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc index 59b13806c..0119581df 100644 --- a/winsup/cygwin/fork.cc +++ b/winsup/cygwin/fork.cc @@ -421,6 +421,14 @@ frok::parent (volatile char * volatile stack_here) this_errno = EAGAIN; #ifdef DEBUGGING0 error ("child remember failed"); +#endif + goto cleanup; + } + if (!child.reattach ()) + { + this_errno = EAGAIN; +#ifdef DEBUGGING0 + error ("child reattach failed"); #endif goto cleanup; } diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index 900facd58..8003e2db6 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -216,9 +216,7 @@ proc_subproc (DWORD what, uintptr_t val) vchild->process_state |= PID_INITIALIZING; vchild->ppid = what == PROC_DETACHED_CHILD ? 1 : myself->pid; /* always set last */ } - if (what == PROC_DETACHED_CHILD) - break; - /* fall through intentionally */ + break; case PROC_REATTACH_CHILD: procs[nprocs] = vchild; @@ -873,7 +871,8 @@ void child_info_spawn::wait_for_myself () { postfork (myself); - myself.remember (false); + if (myself.remember (false)) + myself.reattach (); WaitForSingleObject (ev, INFINITE); } diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index 579b3c9c3..7f7af4449 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -779,7 +779,9 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv, child->start_time = time (NULL); /* Register child's starting time. */ child->nice = myself->nice; postfork (child); - if (!child.remember (mode == _P_DETACH)) + if (mode == _P_DETACH + ? !child.remember (true) + : !(child.remember (false) && child.reattach ())) { /* FIXME: Child in strange state now */ CloseHandle (pi.hProcess);