* debug.h (ModifyHandle): Define new macro.
(modify_handle): Declare new function. * debug.cc (modify_handle): Define new function. * fhandler.h (fhandler_base::fork_fixup): Change return value from void to bool. * fhandler.cc (fhandler_base::fork_fixup): Return true if fork fixup has been done. * pipe.cc (fhandler_pipe::set_close_on_exec): Set inheritance of protected handle via ModifyHandle if DEBUGGING. (fhandler_pipe::fixup_after_fork): Protect guard handle if fork fixup has been done.
This commit is contained in:
		| @@ -1,3 +1,17 @@ | |||||||
|  | 2006-05-25  Christopher Faylor  <cgf@timesys.com> | ||||||
|  |  | ||||||
|  | 	* debug.h (ModifyHandle): Define new macro. | ||||||
|  | 	(modify_handle): Declare new function. | ||||||
|  | 	* debug.cc (modify_handle): Define new function. | ||||||
|  | 	* fhandler.h (fhandler_base::fork_fixup): Change return value from void | ||||||
|  | 	to bool. | ||||||
|  | 	* fhandler.cc (fhandler_base::fork_fixup): Return true if fork fixup has | ||||||
|  | 	been done. | ||||||
|  | 	* pipe.cc (fhandler_pipe::set_close_on_exec): Set inheritance of | ||||||
|  | 	protected handle via ModifyHandle if DEBUGGING. | ||||||
|  | 	(fhandler_pipe::fixup_after_fork): Protect guard handle if fork fixup | ||||||
|  | 	has been done. | ||||||
|  |  | ||||||
| 2006-05-24  Christopher Faylor  <cgf@timesys.com> | 2006-05-24  Christopher Faylor  <cgf@timesys.com> | ||||||
|  |  | ||||||
| 	* cygtls.cc (_cygtls::call): Call call2 using _my_tls. | 	* cygtls.cc (_cygtls::call): Call call2 using _my_tls. | ||||||
|   | |||||||
| @@ -114,6 +114,20 @@ newh () | |||||||
|   return NULL; |   return NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void __stdcall | ||||||
|  | modify_handle (const char *func, int ln, HANDLE h, const char *name, bool inh) | ||||||
|  | { | ||||||
|  |   handle_list *hl = find_handle (h); | ||||||
|  |   if (!hl) | ||||||
|  |     { | ||||||
|  |       system_printf ("%s:%d handle %s<%p> not found", func, ln, name, h); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |   hl->next->inherited = inh; | ||||||
|  |   debug_printf ("%s:%d set handle %s<%p> inheritance flag to %d", func, ln, | ||||||
|  | 		name, h, inh); | ||||||
|  | } | ||||||
|  |  | ||||||
| /* Add a handle to the linked list of known handles. */ | /* Add a handle to the linked list of known handles. */ | ||||||
| void __stdcall | void __stdcall | ||||||
| add_handle (const char *func, int ln, HANDLE h, const char *name, bool inh) | add_handle (const char *func, int ln, HANDLE h, const char *name, bool inh) | ||||||
|   | |||||||
| @@ -28,6 +28,7 @@ details. */ | |||||||
| # define ForceCloseHandle CloseHandle | # define ForceCloseHandle CloseHandle | ||||||
| # define ForceCloseHandle1(h, n) CloseHandle (h) | # define ForceCloseHandle1(h, n) CloseHandle (h) | ||||||
| # define ForceCloseHandle2(h, n) CloseHandle (h) | # define ForceCloseHandle2(h, n) CloseHandle (h) | ||||||
|  | # define ModifyHandle(h, n) do {} while (0) | ||||||
| # define ProtectHandle(h) do {} while (0) | # define ProtectHandle(h) do {} while (0) | ||||||
| # define ProtectHandle1(h,n) do {} while (0) | # define ProtectHandle1(h,n) do {} while (0) | ||||||
| # define ProtectHandle2(h,n) do {} while (0) | # define ProtectHandle2(h,n) do {} while (0) | ||||||
| @@ -55,6 +56,8 @@ details. */ | |||||||
| 	close_handle (__PRETTY_FUNCTION__, __LINE__, (h), n, TRUE) | 	close_handle (__PRETTY_FUNCTION__, __LINE__, (h), n, TRUE) | ||||||
| # endif | # endif | ||||||
|  |  | ||||||
|  | # define ModifyHandle(h, n) modify_handle (__PRETTY_FUNCTION__, __LINE__, (h), #h, n) | ||||||
|  |  | ||||||
| # define ProtectHandle(h) add_handle (__PRETTY_FUNCTION__, __LINE__, (h), #h) | # define ProtectHandle(h) add_handle (__PRETTY_FUNCTION__, __LINE__, (h), #h) | ||||||
| # define ProtectHandle1(h, n) add_handle (__PRETTY_FUNCTION__, __LINE__, (h), #n) | # define ProtectHandle1(h, n) add_handle (__PRETTY_FUNCTION__, __LINE__, (h), #n) | ||||||
| # define ProtectHandle2(h, n) add_handle (__PRETTY_FUNCTION__, __LINE__, (h), n) | # define ProtectHandle2(h, n) add_handle (__PRETTY_FUNCTION__, __LINE__, (h), n) | ||||||
| @@ -70,8 +73,10 @@ void __stdcall verify_handle (const char *, int, HANDLE) | |||||||
|   __attribute__ ((regparm (3))); |   __attribute__ ((regparm (3))); | ||||||
| bool __stdcall close_handle (const char *, int, HANDLE, const char *, bool) | bool __stdcall close_handle (const char *, int, HANDLE, const char *, bool) | ||||||
|   __attribute__ ((regparm (3))); |   __attribute__ ((regparm (3))); | ||||||
| void __stdcall cygbench (const char *s) __attribute__ ((regparm (1))); |  | ||||||
| extern "C" void console_printf (const char *fmt,...); | extern "C" void console_printf (const char *fmt,...); | ||||||
|  | void __stdcall cygbench (const char *s) __attribute__ ((regparm (1))); | ||||||
|  | void __stdcall modify_handle (const char *, int, HANDLE, const char *, bool) | ||||||
|  |   __attribute__ ((regparm (3))); | ||||||
| void setclexec (HANDLE, HANDLE, bool); | void setclexec (HANDLE, HANDLE, bool); | ||||||
| void debug_fixup_after_fork_exec (); | void debug_fixup_after_fork_exec (); | ||||||
| extern int pinger; | extern int pinger; | ||||||
|   | |||||||
| @@ -1464,17 +1464,23 @@ fhandler_base::set_no_inheritance (HANDLE &h, int not_inheriting) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| void | bool | ||||||
| fhandler_base::fork_fixup (HANDLE parent, HANDLE &h, const char *name) | fhandler_base::fork_fixup (HANDLE parent, HANDLE &h, const char *name) | ||||||
| { | { | ||||||
|   HANDLE oh = h; |   HANDLE oh = h; | ||||||
|  |   bool res = false; | ||||||
|   if (/* !is_socket () && */ !close_on_exec ()) |   if (/* !is_socket () && */ !close_on_exec ()) | ||||||
|     debug_printf ("handle %p already opened", h); |     debug_printf ("handle %p already opened", h); | ||||||
|   else if (!DuplicateHandle (parent, h, hMainProc, &h, 0, !close_on_exec (), |   else if (!DuplicateHandle (parent, h, hMainProc, &h, 0, !close_on_exec (), | ||||||
| 			     DUPLICATE_SAME_ACCESS)) | 			     DUPLICATE_SAME_ACCESS)) | ||||||
|     system_printf ("%s - %E, handle %s<%p>", get_name (), name, h); |     system_printf ("%s - %E, handle %s<%p>", get_name (), name, h); | ||||||
|   else if (oh != h) |   else | ||||||
|     VerifyHandle (h); |     { | ||||||
|  |       if (oh != h) | ||||||
|  | 	VerifyHandle (h); | ||||||
|  |       res = true; | ||||||
|  |     } | ||||||
|  |   return res; | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void | ||||||
|   | |||||||
| @@ -252,7 +252,7 @@ class fhandler_base | |||||||
|   virtual void set_no_inheritance (HANDLE &h, int not_inheriting); |   virtual void set_no_inheritance (HANDLE &h, int not_inheriting); | ||||||
|  |  | ||||||
|   /* fixup fd possibly non-inherited handles after fork */ |   /* fixup fd possibly non-inherited handles after fork */ | ||||||
|   void fork_fixup (HANDLE parent, HANDLE &h, const char *name); |   bool fork_fixup (HANDLE parent, HANDLE &h, const char *name); | ||||||
|   virtual bool need_fixup_before () const {return false;} |   virtual bool need_fixup_before () const {return false;} | ||||||
|  |  | ||||||
|   int open_9x (int flags, mode_t mode = 0); |   int open_9x (int flags, mode_t mode = 0); | ||||||
|   | |||||||
| @@ -155,7 +155,10 @@ fhandler_pipe::set_close_on_exec (bool val) | |||||||
| { | { | ||||||
|   fhandler_base::set_close_on_exec (val); |   fhandler_base::set_close_on_exec (val); | ||||||
|   if (guard) |   if (guard) | ||||||
|     set_no_inheritance (guard, val); |     { | ||||||
|  |       set_no_inheritance (guard, val); | ||||||
|  |       ModifyHandle (guard, !val); | ||||||
|  |     } | ||||||
|   if (writepipe_exists) |   if (writepipe_exists) | ||||||
|     set_no_inheritance (writepipe_exists, val); |     set_no_inheritance (writepipe_exists, val); | ||||||
| } | } | ||||||
| @@ -250,8 +253,8 @@ void | |||||||
| fhandler_pipe::fixup_after_fork (HANDLE parent) | fhandler_pipe::fixup_after_fork (HANDLE parent) | ||||||
| { | { | ||||||
|   fhandler_base::fixup_after_fork (parent); |   fhandler_base::fixup_after_fork (parent); | ||||||
|   if (guard) |   if (guard && fork_fixup (parent, guard, "guard")) | ||||||
|     fork_fixup (parent, guard, "guard"); |     ProtectHandle (guard); | ||||||
|   if (writepipe_exists) |   if (writepipe_exists) | ||||||
|     fork_fixup (parent, writepipe_exists, "writepipe_exists"); |     fork_fixup (parent, writepipe_exists, "writepipe_exists"); | ||||||
|   fixup_in_child (); |   fixup_in_child (); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user