aboutsummaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorMichael Haubenwallner <michael.haubenwallner@ssi-schaefer.com>2019-07-31 12:35:33 +0200
committerCorinna Vinschen <corinna-cygwin@cygwin.com>2019-07-31 13:27:51 +0200
commit2986a524d853ab6d06bf88b65e0e9d60cea51dcc (patch)
tree64e1f0d5f6cf8b5042ef6f63c596ae78dab4cb05 /winsup
parent23a779bf3d7c2afc9eab88f6b8727c1db5544547 (diff)
downloadnewlib-2986a524d853ab6d06bf88b65e0e9d60cea51dcc.zip
newlib-2986a524d853ab6d06bf88b65e0e9d60cea51dcc.tar.gz
newlib-2986a524d853ab6d06bf88b65e0e9d60cea51dcc.tar.bz2
Cygwin: fork: attach child not before success
Do not attach to the child before it was successfully initialized, or we would need more sophisticated cleanup on child initialization failure, like suppressing SIGCHILD delivery with multiple threads ("waitproc") involved. Improves "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
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/fork.cc19
1 files changed, 11 insertions, 8 deletions
diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc
index 0119581..7080144 100644
--- a/winsup/cygwin/fork.cc
+++ b/winsup/cygwin/fork.cc
@@ -424,14 +424,6 @@ 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)");
@@ -516,6 +508,17 @@ frok::parent (volatile char * volatile stack_here)
}
}
+ /* Do not attach to the child before it has successfully initialized.
+ Otherwise we may wait forever, or deliver an orphan SIGCHILD. */
+ if (!child.reattach ())
+ {
+ this_errno = EAGAIN;
+#ifdef DEBUGGING0
+ error ("child reattach failed");
+#endif
+ goto cleanup;
+ }
+
/* Finally start the child up. */
resume_child (forker_finished);