OSDN Git Service

* fork.cc (fork_child): Fixup SYSV IPC shared memory before fixing
authorcorinna <corinna>
Fri, 1 Apr 2005 11:46:58 +0000 (11:46 +0000)
committercorinna <corinna>
Fri, 1 Apr 2005 11:46:58 +0000 (11:46 +0000)
up fdtab.

winsup/cygwin/ChangeLog
winsup/cygwin/fork.cc

index 9157562..de66583 100644 (file)
@@ -1,3 +1,8 @@
+2005-04-01  Corinna Vinschen  <corinna@vinschen.de>
+
+       * fork.cc (fork_child): Fixup SYSV IPC shared memory before fixing
+       up fdtab.
+
 2005-03-31  Corinna Vinschen  <corinna@vinschen.de>
 
        * gentls_offsets: Add '-m32' flag to native compiler call to satisfy
index 4ae2d0a..4a84213 100644 (file)
@@ -199,6 +199,17 @@ fork_child (HANDLE& hParent, dll *&first_dll, bool& load_dlls)
   if (fixup_mmaps_after_fork (hParent))
     api_fatal ("recreate_mmaps_after_fork_failed");
 
+#ifdef USE_SERVER
+  /* Incredible but true:  If we use sockets and SYSV IPC shared memory,
+     there's a good chance that a duplicated socket in the child occupies
+     memory which is needed to duplicate shared memory from the parent
+     process, if the shared memory hasn't been duplicated already.
+     The same goes very likely for "normal" mmap shared memory, too, but
+     with SYSV IPC it was the first time observed.  So, *never* fixup
+     fdtab before fixing up shared memory. */
+  if (fixup_shms_after_fork ())
+    api_fatal ("recreate_shm areas after fork failed");
+#endif
 
   MALLOC_CHECK;
 
@@ -226,11 +237,6 @@ fork_child (HANDLE& hParent, dll *&first_dll, bool& load_dlls)
   _my_tls.fixup_after_fork ();
   sigproc_init ();
 
-#ifdef USE_SERVER
-  if (fixup_shms_after_fork ())
-    api_fatal ("recreate_shm areas after fork failed");
-#endif
-
   pthread::atforkchild ();
   fixup_timers_after_fork ();
   fixup_hooks_after_fork ();