* 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.
This commit is contained in:
Corinna Vinschen 2008-04-26 18:01:42 +00:00
parent e331d3e26e
commit 346cdb434e
3 changed files with 17 additions and 10 deletions

View 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> 2008-04-25 Corinna Vinschen <corinna@vinschen.de>
* Makefile.in (install): Drop install rules for postinstall script. * Makefile.in (install): Drop install rules for postinstall script.

View File

@ -694,7 +694,7 @@ dll_crt0_0 ()
init_global_security (); init_global_security ();
initial_env (); initial_env ();
SetErrorMode (SEM_FAILCRITICALERRORS); SetErrorMode (SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
/* Initialize signal processing here, early, in the hopes that the creation /* Initialize signal processing here, early, in the hopes that the creation
of a thread early in the process will cause more predictability in memory of a thread early in the process will cause more predictability in memory

View File

@ -471,15 +471,6 @@ spawn_guts (const char *prog_arg, const char *const *argv,
system_printf ("duplicate to pid_handle failed, %E"); 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); runpath = null_app_name ? NULL : real_path.get_wide_win32_path (runpath);
syscall_printf ("null_app_name %d (%W, %.9500W)", null_app_name, 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.lpReserved2 = (LPBYTE) &ch;
si.cbReserved2 = sizeof (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 /* When ruid != euid we create the new process under the current original
account and impersonate in child, this way maintaining the different account and impersonate in child, this way maintaining the different
effective vs. real ids. effective vs. real ids.