OSDN Git Service

* dcrt0.cc (dll_crt0_0): Set SEM_NOGPFAULTERRORBOX error mode, too,
authorcorinna <corinna>
Sat, 26 Apr 2008 18:01:41 +0000 (18:01 +0000)
committercorinna <corinna>
Sat, 26 Apr 2008 18:01:41 +0000 (18:01 +0000)
to accommodate Vista/Longhorn.
* spawn.cc (spawn_guts): Move check for CREATE_SUSPENDED condition
after the call to ch.set() since it depends on it.

winsup/cygwin/ChangeLog
winsup/cygwin/dcrt0.cc
winsup/cygwin/spawn.cc

index dd4032e..7cdd1f8 100644 (file)
@@ -1,3 +1,10 @@
+2008-04-26  Corinna Vinschen  <corinna@vinschen.de>
+
+       * dcrt0.cc (dll_crt0_0): Set SEM_NOGPFAULTERRORBOX error mode, too,
+       to accommodate Vista/Longhorn.
+       * spawn.cc (spawn_guts): Move check for CREATE_SUSPENDED condition
+       after the call to ch.set() since it depends on it.
+
 2008-04-25  Corinna Vinschen  <corinna@vinschen.de>
 
        * Makefile.in (install): Drop install rules for postinstall script.
index 7b299d3..e0fa5b5 100644 (file)
@@ -694,7 +694,7 @@ dll_crt0_0 ()
   init_global_security ();
   initial_env ();
 
-  SetErrorMode (SEM_FAILCRITICALERRORS);
+  SetErrorMode (SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
 
   /* Initialize signal processing here, early, in the hopes that the creation
      of a thread early in the process will cause more predictability in memory
index a6c3fe7..e4baade 100644 (file)
@@ -471,15 +471,6 @@ spawn_guts (const char *prog_arg, const char *const *argv,
        system_printf ("duplicate to pid_handle failed, %E");
     }
 
-  /* Some file types (currently only sockets) need extra effort in the parent
-     after CreateProcess and before copying the datastructures to the child.
-     So we have to start the child in suspend state, unfortunately, to avoid
-     a race condition. */
-  if (!newargv.win16_exe
-      && (!ch.iscygwin () || mode != _P_OVERLAY
-         || cygheap->fdtab.need_fixup_before ()))
-    c_flags |= CREATE_SUSPENDED;
-
   runpath = null_app_name ? NULL : real_path.get_wide_win32_path (runpath);
 
   syscall_printf ("null_app_name %d (%W, %.9500W)", null_app_name,
@@ -506,6 +497,15 @@ spawn_guts (const char *prog_arg, const char *const *argv,
   si.lpReserved2 = (LPBYTE) &ch;
   si.cbReserved2 = sizeof (ch);
 
+  /* Depends on ch.set call above!
+     Some file types might need extra effort in the parent after CreateProcess
+     and before copying the datastructures to the child.  So we have to start
+     the child in suspend state, unfortunately, to avoid a race condition. */
+  if (!newargv.win16_exe
+      && (!ch.iscygwin () || mode != _P_OVERLAY
+         || cygheap->fdtab.need_fixup_before ()))
+    c_flags |= CREATE_SUSPENDED;
+
   /* When ruid != euid we create the new process under the current original
      account and impersonate in child, this way maintaining the different
      effective vs. real ids.