[newlib-cygwin] Cygwin: pinfo: stop remember doing reattach

Corinna Vinschen corinna@sourceware.org
Wed Jul 31 16:58:00 GMT 2019


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=23a779bf3d7c2afc9eab88f6b8727c1db5544547

commit 23a779bf3d7c2afc9eab88f6b8727c1db5544547
Author: Michael Haubenwallner <michael.haubenwallner@ssi-schaefer.com>
Date:   Wed Jul 31 12:35:31 2019 +0200

    Cygwin: pinfo: stop remember doing reattach
    
    During fork, the child process requires the process table to be
    initialized for fixup_shms_after_fork, while still allowing subsequent
    dlls.load_after_fork to fail silently (for when the "forkable" hardlinks
    are not created yet).
    pinfo::remember not performing reattach anymore requires explicit
    pinfo::reattach now where appropriate.
    
    Prepares to improve "Cygwin: fork: Remember child not before success."
    commit f03ea8e1c57bd5cea83f6cd47fa02870bdfeb1c5, which leads to fork
    problems if cygserver is running:
    
    https://cygwin.com/ml/cygwin-patches/2019-q2/msg00155.html

Diff:
---
 winsup/cygwin/fork.cc    | 8 ++++++++
 winsup/cygwin/sigproc.cc | 7 +++----
 winsup/cygwin/spawn.cc   | 4 +++-
 3 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc
index 59b1380..0119581 100644
--- a/winsup/cygwin/fork.cc
+++ b/winsup/cygwin/fork.cc
@@ -424,6 +424,14 @@ frok::parent (volatile char * volatile stack_here)
 #endif
       goto cleanup;
     }
+  if (!child.reattach ())
+    {
+      this_errno = EAGAIN;
+#ifdef DEBUGGING0
+      error ("child reattach failed");
+#endif
+      goto cleanup;
+    }
 
   /* CHILD IS STOPPED */
   debug_printf ("child is alive (but stopped)");
diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc
index 900facd..8003e2d 100644
--- a/winsup/cygwin/sigproc.cc
+++ b/winsup/cygwin/sigproc.cc
@@ -216,9 +216,7 @@ proc_subproc (DWORD what, uintptr_t val)
 	  vchild->process_state |= PID_INITIALIZING;
 	  vchild->ppid = what == PROC_DETACHED_CHILD ? 1 : myself->pid;	/* always set last */
 	}
-      if (what == PROC_DETACHED_CHILD)
-	break;
-      /* fall through intentionally */
+      break;
 
     case PROC_REATTACH_CHILD:
       procs[nprocs] = vchild;
@@ -873,7 +871,8 @@ void
 child_info_spawn::wait_for_myself ()
 {
   postfork (myself);
-  myself.remember (false);
+  if (myself.remember (false))
+    myself.reattach ();
   WaitForSingleObject (ev, INFINITE);
 }
 
diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc
index 579b3c9..7f7af44 100644
--- a/winsup/cygwin/spawn.cc
+++ b/winsup/cygwin/spawn.cc
@@ -779,7 +779,9 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv,
 	  child->start_time = time (NULL); /* Register child's starting time. */
 	  child->nice = myself->nice;
 	  postfork (child);
-	  if (!child.remember (mode == _P_DETACH))
+	  if (mode == _P_DETACH
+	      ? !child.remember (true)
+	      : !(child.remember (false) && child.reattach ()))
 	    {
 	      /* FIXME: Child in strange state now */
 	      CloseHandle (pi.hProcess);



More information about the Cygwin-cvs mailing list