diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index ecf7b8af8..0935486f4 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,11 @@ +Thu Sep 20 16:48:44 2001 Christopher Faylor + + * fhandler.cc (fhandler_base::set_inheritance): Just use + DUPLICATE_CLOSE_SOURCE to change inheritance. Eliminate all other + logic dealing with closed handles. + * fhandler.h (fhandler_base::set_inheritance): Reflect above change. + * fhandler_tty.cc (fhandler_tty_common::set_close_on_exec): Ditto. + Thu Sep 20 13:34:00 2001 Corinna Vinschen * fhandler_socket.cc (fhandler_socket::fixup_after_exec): Close diff --git a/winsup/cygwin/child_info.h b/winsup/cygwin/child_info.h index 68d1751b0..983675877 100644 --- a/winsup/cygwin/child_info.h +++ b/winsup/cygwin/child_info.h @@ -29,7 +29,7 @@ enum class child_info { public: - DWORD zero[1]; // must be zeroed + DWORD zero[4]; // must be zeroed DWORD cb; // size of this record DWORD type; // type of record int cygpid; // cygwin pid of child process diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc index 0f38e0207..ff3946512 100644 --- a/winsup/cygwin/fhandler.cc +++ b/winsup/cygwin/fhandler.cc @@ -1510,44 +1510,18 @@ fhandler_pipe::lseek (off_t offset, int whence) return -1; } -#ifdef DEBUGGING -#define nameparm name -#else -#define nameparm -#endif - void -fhandler_base::set_inheritance (HANDLE &h, int not_inheriting, const char *nameparm) -#undef nameparm +fhandler_base::set_inheritance (HANDLE &h, int not_inheriting) { - HANDLE newh; - - if (wincap.has_set_handle_information () && (!is_console () || - wincap.has_set_handle_information_on_console_handles ())) - (void) SetHandleInformation (h, HANDLE_FLAG_INHERIT, - not_inheriting ? 0 : HANDLE_FLAG_INHERIT); - else if (!DuplicateHandle (hMainProc, h, hMainProc, &newh, 0, !not_inheriting, - DUPLICATE_SAME_ACCESS)) - debug_printf ("DuplicateHandle %E"); -#ifndef DEBUGGING - else - { - hclose (h); - h = newh; - } -#else - else if (!name) - { - hclose (h); - h = newh; - } - else - /* FIXME: This won't work with sockets */ - { - ForceCloseHandle2 (h, name); - h = newh; - ProtectHandle2 (h, name); - } + /* Note that we could use SetHandleInformation here but it is not available + on all platforms. Test cases seem to indicate that using DuplicateHandle + in this fashion does not actually close the original handle, which is + what we want. If this changes in the future, we may be forced to use + SetHandleInformation on newer OS's */ + if (!DuplicateHandle (hMainProc, h, hMainProc, &h, 0, !not_inheriting, + DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE)) + debug_printf ("DuplicateHandle failed, %E"); +#ifdef DEBUGGING setclexec_pid (h, not_inheriting); #endif } diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 1ab155743..94c623f8b 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -310,8 +310,7 @@ public: unsigned long get_namehash () { return namehash; } virtual void hclose (HANDLE h) {CloseHandle (h);} - virtual void set_inheritance (HANDLE &h, int not_inheriting, - const char *name = NULL); + virtual void set_inheritance (HANDLE &h, int not_inheriting); /* fixup fd possibly non-inherited handles after fork */ void fork_fixup (HANDLE parent, HANDLE &h, const char *name); diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc index b0ee336aa..4aa3b0572 100644 --- a/winsup/cygwin/fhandler_tty.cc +++ b/winsup/cygwin/fhandler_tty.cc @@ -1119,7 +1119,7 @@ fhandler_tty_common::set_close_on_exec (int val) /* FIXME: This is a duplication from fhandler_base::set_close_on_exec. It is here because we need to specify the "from_pty" stuff here or we'll get warnings from ForceCloseHandle when debugging. */ - set_inheritance (get_io_handle (), val, "from_pty"); + set_inheritance (get_io_handle (), val); set_close_on_exec_flag (val); #endif if (output_done_event) @@ -1130,10 +1130,10 @@ fhandler_tty_common::set_close_on_exec (int val) set_inheritance (ioctl_done_event, val); if (inuse) set_inheritance (inuse, val); - set_inheritance (output_mutex, val, "output_mutex"); - set_inheritance (input_mutex, val, "input_mutex"); + set_inheritance (output_mutex, val); + set_inheritance (input_mutex, val); set_inheritance (input_available_event, val); - set_inheritance (output_handle, val, "to_pty"); + set_inheritance (output_handle, val); } void