diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index ca1fc5314..1401a18fa 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +2011-11-04 Christopher Faylor + + * pinfo.h (pinfo::reattach): Only set destroy to false when + proc_subproc succeeds. Return true for success. + * sigproc.cc (child_info_spawn::reattach_children): Try harder to clean + up on error by detecting reattach failures too. + 2011-11-04 Christopher Faylor * sigproc.cc (child_info_spawn::reattach_children): Clean up handle diff --git a/winsup/cygwin/pinfo.h b/winsup/cygwin/pinfo.h index f9e859cde..a69316148 100644 --- a/winsup/cygwin/pinfo.h +++ b/winsup/cygwin/pinfo.h @@ -175,10 +175,11 @@ public: #ifndef _SIGPROC_H int remember () {system_printf ("remember is not here"); return 0;} #else - void reattach () + int reattach () { - proc_subproc (PROC_REATTACH_CHILD, (DWORD) this); - destroy = false; + int res = proc_subproc (PROC_REATTACH_CHILD, (DWORD) this); + destroy = res ? false : true; + return res; } int remember (bool detach) { diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index a3035d9ca..be570c496 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -866,10 +866,13 @@ child_info_spawn::reattach_children () false, DUPLICATE_SAME_ACCESS)) debug_printf ("couldn't duplicate parent %p handles for forked children after exec, %E", children[i].rd_proc_pipe); - else if ((p.hProcess = OpenProcess (PROCESS_QUERY_INFORMATION, false, p->pid))) - p.reattach (); - else + else if (!(p.hProcess = OpenProcess (PROCESS_QUERY_INFORMATION, false, p->pid))) CloseHandle (p.rd_proc_pipe); + else if (!p.reattach ()) + { + CloseHandle (p.hProcess); + CloseHandle (p.rd_proc_pipe); + } } }