* 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.
This commit is contained in:
Christopher Faylor 2011-11-04 17:07:21 +00:00
parent 705d704153
commit 26601df44c
3 changed files with 17 additions and 6 deletions

View File

@ -1,3 +1,10 @@
2011-11-04 Christopher Faylor <me.cygwin2011@cgf.cx>
* 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 <me.cygwin2011@cgf.cx>
* sigproc.cc (child_info_spawn::reattach_children): Clean up handle

View File

@ -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)
{

View File

@ -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);
}
}
}