* dcrt0.cc (get_cygwin_startup_info): Change zeros to DWORD array.
Expect first DWORD in child_info struct being set to non-zero if wincap.needs_count_in_si_lpres2 is set. Add comment to explain why. * fork.cc (frok::parent): Set ch.zero[0] to a sensible count value if wincap.needs_count_in_si_lpres2 is set. * spawn.cc (spawn_guts): Ditto. Add filler bytes after ch on stack to accomodate needs_count_in_si_lpres2. * wincap.h: Define needs_count_in_si_lpres2 throughout. * wincap.cc: Ditto.
This commit is contained in:
@ -298,7 +298,13 @@ spawn_guts (const char * prog_arg, const char *const *argv,
|
||||
pthread_cleanup_push (do_cleanup, (void *) &cleanup);
|
||||
av newargv;
|
||||
linebuf one_line;
|
||||
child_info_spawn ch;
|
||||
/* Allocate slightly bigger for call to CreateProcess to accomodate
|
||||
needs_count_in_si_lpres2. */
|
||||
struct {
|
||||
child_info_spawn ch;
|
||||
char filler[4];
|
||||
} _ch;
|
||||
#define ch _ch.ch
|
||||
|
||||
char *envblock = NULL;
|
||||
path_conv real_path;
|
||||
@ -481,6 +487,10 @@ spawn_guts (const char * prog_arg, const char *const *argv,
|
||||
si.lpReserved2 = (LPBYTE) &ch;
|
||||
si.cbReserved2 = sizeof (ch);
|
||||
|
||||
/* See comment in dcrt0.cc, function get_cygwin_startup_info. */
|
||||
if (wincap.needs_count_in_si_lpres2 ())
|
||||
ch.zero[0] = sizeof (ch) / 5;
|
||||
|
||||
/* 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.
|
||||
@ -724,6 +734,7 @@ out:
|
||||
free (envblock);
|
||||
pthread_cleanup_pop (1);
|
||||
return (int) res;
|
||||
#undef ch
|
||||
}
|
||||
|
||||
extern "C" int
|
||||
|
Reference in New Issue
Block a user