* spawn.cc (child_info_spawn::worker): Save and restore my_wr_proc_pipe around
non-execing operations to avoid handle leak seen in http://cygwin.com/ml/cygwin/2013-03/msg00152.html .
This commit is contained in:
		| @@ -1,3 +1,9 @@ | |||||||
|  | 2013-03-08  Christopher Faylor  <me.cygwin2013@cgf.cx> | ||||||
|  |  | ||||||
|  | 	* spawn.cc (child_info_spawn::worker): Save and restore my_wr_proc_pipe | ||||||
|  | 	around non-execing operations to avoid handle leak seen in | ||||||
|  | 	http://cygwin.com/ml/cygwin/2013-03/msg00152.html . | ||||||
|  |  | ||||||
| 2013-03-07  Corinna Vinschen  <corinna@vinschen.de> | 2013-03-07  Corinna Vinschen  <corinna@vinschen.de> | ||||||
|  |  | ||||||
| 	* include/sys/un.h (UNIX_PATH_MAX): Rename from UNIX_PATH_LEN to | 	* include/sys/un.h (UNIX_PATH_MAX): Rename from UNIX_PATH_LEN to | ||||||
|   | |||||||
| @@ -620,6 +620,9 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv, | |||||||
|       SetHandleInformation (wr_proc_pipe, HANDLE_FLAG_INHERIT, 0); |       SetHandleInformation (wr_proc_pipe, HANDLE_FLAG_INHERIT, 0); | ||||||
|       SetHandleInformation (parent, HANDLE_FLAG_INHERIT, 0); |       SetHandleInformation (parent, HANDLE_FLAG_INHERIT, 0); | ||||||
|     } |     } | ||||||
|  |   /* FIXME: racy */ | ||||||
|  |   if (mode != _P_OVERLAY) | ||||||
|  |     SetHandleInformation (my_wr_proc_pipe, HANDLE_FLAG_INHERIT, 0); | ||||||
|   parent_winpid = GetCurrentProcessId (); |   parent_winpid = GetCurrentProcessId (); | ||||||
|  |  | ||||||
|   /* When ruid != euid we create the new process under the current original |   /* When ruid != euid we create the new process under the current original | ||||||
| @@ -724,10 +727,9 @@ loop: | |||||||
| 	} | 	} | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   /* Restore impersonation. In case of _P_OVERLAY this isn't |   if (mode != _P_OVERLAY) | ||||||
|      allowed since it would overwrite child data. */ |     SetHandleInformation (my_wr_proc_pipe, HANDLE_FLAG_INHERIT, | ||||||
|   if (mode != _P_OVERLAY || !rc) | 			  HANDLE_FLAG_INHERIT); | ||||||
|     ::cygheap->user.reimpersonate (); |  | ||||||
|  |  | ||||||
|   /* Set errno now so that debugging messages from it appear before our |   /* Set errno now so that debugging messages from it appear before our | ||||||
|      final debugging message [this is a general rule for debugging |      final debugging message [this is a general rule for debugging | ||||||
| @@ -748,9 +750,16 @@ loop: | |||||||
| 	 be closed otherwise.  Don't need to do this for 'parent' since it will | 	 be closed otherwise.  Don't need to do this for 'parent' since it will | ||||||
| 	 be closed in every case.  See FIXME above. */ | 	 be closed in every case.  See FIXME above. */ | ||||||
|       if (!iscygwin () && mode == _P_OVERLAY) |       if (!iscygwin () && mode == _P_OVERLAY) | ||||||
| 	SetHandleInformation (wr_proc_pipe, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); | 	SetHandleInformation (wr_proc_pipe, HANDLE_FLAG_INHERIT, | ||||||
|  | 			      HANDLE_FLAG_INHERIT); | ||||||
|       if (wr_proc_pipe == my_wr_proc_pipe) |       if (wr_proc_pipe == my_wr_proc_pipe) | ||||||
| 	wr_proc_pipe = NULL;	/* We still own it: don't nuke in destructor */ | 	wr_proc_pipe = NULL;	/* We still own it: don't nuke in destructor */ | ||||||
|  |  | ||||||
|  |       /* Restore impersonation. In case of _P_OVERLAY this isn't | ||||||
|  | 	 allowed since it would overwrite child data. */ | ||||||
|  |       if (mode != _P_OVERLAY) | ||||||
|  | 	::cygheap->user.reimpersonate (); | ||||||
|  |  | ||||||
|       res = -1; |       res = -1; | ||||||
|       goto out; |       goto out; | ||||||
|     } |     } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user