summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2020-02-28 13:21:05 +0100
committerCorinna Vinschen <corinna@vinschen.de>2020-02-28 15:27:16 +0100
commit729cb70bcf232a1da956ec3725c1f76e28b3caa5 (patch)
treea495575012bf23ec95ade96b7ea2835b4cb1fa59
parenta834dc1ba923d33a87f0dc3be0e23a9aa81603b8 (diff)
downloadcygnal-729cb70bcf232a1da956ec3725c1f76e28b3caa5.tar.gz
cygnal-729cb70bcf232a1da956ec3725c1f76e28b3caa5.tar.bz2
cygnal-729cb70bcf232a1da956ec3725c1f76e28b3caa5.zip
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.h1
-rw-r--r--winsup/cygwin/fhandler_socket_inet.cc2
-rw-r--r--winsup/cygwin/fhandler_socket_unix.cc21
-rw-r--r--winsup/cygwin/fhandler_tty.cc2
4 files changed, 16 insertions, 10 deletions
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index 55f18aebd..90805abb8 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 6f4383861..703781d17 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 760f210bf..d7bb1090e 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 153bdad79..b42e0aeb6 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;