* ChangeNotes: New file. Add entry cgf-000001.

* sigproc.cc (proc_terminate): Don't set parent pid of child to 1 if we've
execed since the execed process is still considered the parent.
* child_info.h: Bump copyright.
This commit is contained in:
Christopher Faylor 2012-05-02 16:39:39 +00:00
parent 03cd7bbbb1
commit b79c0094f8
4 changed files with 44 additions and 2 deletions

View File

@ -1,3 +1,11 @@
2012-05-02 Christopher Faylor <me.cygwin2012@cgf.cx>
* ChangeNotes: New file. Add entry cgf-000001.
* sigproc.cc (proc_terminate): Don't set parent pid of child to 1 if
we've execed since the execed process is still considered the parent.
* child_info.h: Bump copyright.
2012-05-02 Corinna Vinschen <corinna@vinschen.de>
* fenv.cc (fesetround): Fix test for valid input parameter.

26
winsup/cygwin/DevNotes Normal file
View File

@ -0,0 +1,26 @@
2012-05-02 cgf-000001
This fix was due to a bug report on the Cygwin mailing list:
http://cygwin.com/ml/cygwin/2012-05/msg00009.html
strace showed that ssh-agent was checking the parent pid and getting a 1
when it shouldn't have. Other stuff looked ok so I chose to consider
this a smoking gun.
Going back to the version that the OP said did not have the problem, I
worked forward until I found where the problem first occurred -
somewhere around 2012-03-19. And, indeed, the getppid call returned the
correct value in the working version. That means that this stopped
working when I redid the way the process pipe was inherited around
this time period.
It isn't clear why (and I suspect I may have to debug this further at
some poit) this hasn't always been a problem but I made the obvious fix.
We shouldn't have been setting ppid = 1 when we're about to pass off to
an execed process.
As I was writing this, I realized that it was necessary to add some
additional checks. Just checking for "have_execed" isn't enough. If
we've execed a non-cygwin process then it won't know how to deal with
any inherited children. So, always set ppid = 1 if we've execed a
non-cygwin process.

View File

@ -1,6 +1,6 @@
/* child_info.h: shared child info for cygwin
Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2011
Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2011, 2012
Red Hat, Inc.
This file is part of Cygwin.

View File

@ -445,9 +445,17 @@ proc_terminate ()
/* Clean out proc processes from the pid list. */
for (int i = 0; i < nprocs; i++)
{
procs[i]->ppid = 1;
/* If we've execed then the execed process will handle setting ppid
to 1 iff it is a Cygwin process. */
if (!have_execed || !have_execed_cygwin)
procs[i]->ppid = 1;
if (procs[i].wait_thread)
procs[i].wait_thread->terminate_thread ();
/* Release memory associated with this process unless it is 'myself'.
'myself' is only in the procs table when we've execed. We reach
here when the next process has finished initializing but we still
can't free the memory used by 'myself' since it is used later on
during cygwin tear down. */
if (procs[i] != myself)
procs[i].release ();
}