* 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:
		| @@ -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> | 2012-05-02  Corinna Vinschen  <corinna@vinschen.de> | ||||||
|  |  | ||||||
| 	* fenv.cc (fesetround): Fix test for valid input parameter. | 	* fenv.cc (fesetround): Fix test for valid input parameter. | ||||||
|   | |||||||
							
								
								
									
										26
									
								
								winsup/cygwin/DevNotes
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								winsup/cygwin/DevNotes
									
									
									
									
									
										Normal 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. | ||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* child_info.h: shared child info for cygwin | /* 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. |    Red Hat, Inc. | ||||||
|  |  | ||||||
| This file is part of Cygwin. | This file is part of Cygwin. | ||||||
|   | |||||||
| @@ -445,9 +445,17 @@ proc_terminate () | |||||||
|       /* Clean out proc processes from the pid list. */ |       /* Clean out proc processes from the pid list. */ | ||||||
|       for (int i = 0; i < nprocs; i++) |       for (int i = 0; i < nprocs; i++) | ||||||
| 	{ | 	{ | ||||||
|  | 	  /* 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; | 	    procs[i]->ppid = 1; | ||||||
| 	  if (procs[i].wait_thread) | 	  if (procs[i].wait_thread) | ||||||
| 	    procs[i].wait_thread->terminate_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) | 	  if (procs[i] != myself) | ||||||
| 	    procs[i].release (); | 	    procs[i].release (); | ||||||
| 	} | 	} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user