diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2020-02-28 13:21:05 +0100 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2020-02-28 15:27:16 +0100 |
commit | 729cb70bcf232a1da956ec3725c1f76e28b3caa5 (patch) | |
tree | a495575012bf23ec95ade96b7ea2835b4cb1fa59 | |
parent | a834dc1ba923d33a87f0dc3be0e23a9aa81603b8 (diff) | |
download | newlib-729cb70bcf232a1da956ec3725c1f76e28b3caa5.zip newlib-729cb70bcf232a1da956ec3725c1f76e28b3caa5.tar.gz newlib-729cb70bcf232a1da956ec3725c1f76e28b3caa5.tar.bz2 |
Cygwin: AF_UNIX: rework fixup_after_exec
fhandler_socket_unix::fixup_after_exec incorrectly calls
fhandler_socket_unix::fixup_after_fork with a NULL parent process
handle. Not only that calling DuplicateHandle with a NULL parent
handle fails, but it's utterly wrong trying to duplicate the handles
at all here.
Rather just set some important values to NULL and reopen the shared
memory region. Create a fixup_helper method to call common code from
fixup_after_fork and fixup_after_exec.
Add comments to other invocations of fixup_after_fork with NULL
handle to mark them as correct this way.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r-- | winsup/cygwin/fhandler.h | 1 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_socket_inet.cc | 2 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_socket_unix.cc | 21 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_tty.cc | 2 |
4 files changed, 16 insertions, 10 deletions
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 55f18ae..90805ab 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -1076,6 +1076,7 @@ class fhandler_socket_unix : public fhandler_socket void fixup_after_fork (HANDLE parent); void fixup_after_exec (); void set_close_on_exec (bool val); + void fixup_helper (); public: fhandler_socket_unix (); diff --git a/winsup/cygwin/fhandler_socket_inet.cc b/winsup/cygwin/fhandler_socket_inet.cc index 6f43838..703781d 100644 --- a/winsup/cygwin/fhandler_socket_inet.cc +++ b/winsup/cygwin/fhandler_socket_inet.cc @@ -534,7 +534,7 @@ void fhandler_socket_wsock::fixup_after_exec () { if (need_fixup_before () && !close_on_exec ()) - fixup_after_fork (NULL); + fixup_after_fork (NULL); /* No parent handle required. */ } int diff --git a/winsup/cygwin/fhandler_socket_unix.cc b/winsup/cygwin/fhandler_socket_unix.cc index 760f210..d7bb109 100644 --- a/winsup/cygwin/fhandler_socket_unix.cc +++ b/winsup/cygwin/fhandler_socket_unix.cc @@ -1149,6 +1149,16 @@ fhandler_socket_unix::set_cred () scred->gid = myself->gid; } +void +fhandler_socket_unix::fixup_helper () +{ + if (shmem_handle) + reopen_shmem (); + connect_wait_thr = NULL; + cwt_termination_evt = NULL; + cwt_param = NULL; +} + /* ========================== public methods ========================= */ void @@ -1158,20 +1168,15 @@ fhandler_socket_unix::fixup_after_fork (HANDLE parent) if (backing_file_handle && backing_file_handle != INVALID_HANDLE_VALUE) fork_fixup (parent, backing_file_handle, "backing_file_handle"); if (shmem_handle) - { - fork_fixup (parent, shmem_handle, "shmem_handle"); - reopen_shmem (); - } - connect_wait_thr = NULL; - cwt_termination_evt = NULL; - cwt_param = NULL; + fork_fixup (parent, shmem_handle, "shmem_handle"); + fixup_helper (); } void fhandler_socket_unix::fixup_after_exec () { if (!close_on_exec ()) - fixup_after_fork (NULL); + fixup_helper (); } void diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc index 153bdad..b42e0ae 100644 --- a/winsup/cygwin/fhandler_tty.cc +++ b/winsup/cygwin/fhandler_tty.cc @@ -2974,7 +2974,7 @@ fhandler_pty_slave::fixup_after_exec () reset_switch_to_pcon (); if (!close_on_exec ()) - fixup_after_fork (NULL); + fixup_after_fork (NULL); /* No parent handle required. */ else if (get_pseudo_console ()) { int used = 0; |