* 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:
Christopher Faylor 2006-05-25 05:40:51 +00:00
parent 38229bcdcf
commit 3cd94e0c0a
6 changed files with 50 additions and 8 deletions

View File

@ -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.

View File

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

View File

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

View File

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

View File

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

View File

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