From fb0eb5750eddffbf4dcc49423036682ecb4f8a82 Mon Sep 17 00:00:00 2001 From: cgf Date: Fri, 26 Sep 2003 02:23:33 +0000 Subject: [PATCH] * spawn.cc (spawn_guts): Catch potential error from pinfo.remember. Change debug messages to make sense. Pass correct value to pinfo constructor. Ensure cleanup after errors. Always reimpersonate after errors. --- winsup/cygwin/ChangeLog | 8 ++++++++ winsup/cygwin/spawn.cc | 21 +++++++++++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index ea53ae5941..12804d04f7 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,11 @@ +2003-09-25 Pierre Humblet + Christopher Faylor + + * spawn.cc (spawn_guts): Catch potential error from pinfo.remember. + Change debug messages to make sense. Pass correct value to pinfo + constructor. Ensure cleanup after errors. Always reimpersonate after + errors. + 2003-09-25 Christopher Faylor * spawn.cc (spawn_guts): Move system signal handling stuff after diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index b339660640..8d2ab2df6e 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -711,7 +711,7 @@ spawn_guts (const char * prog_arg, const char *const *argv, /* Restore impersonation. In case of _P_OVERLAY this isn't allowed since it would overwrite child data. */ - if (mode != _P_OVERLAY) + if (mode != _P_OVERLAY || !rc) cygheap->user.reimpersonate (); MALLOC_CHECK; @@ -734,7 +734,7 @@ spawn_guts (const char * prog_arg, const char *const *argv, /* FIXME: There is a small race here */ - DWORD res; + int res; pthread_cleanup cleanup; pthread_cleanup_push (do_cleanup, (void *) &cleanup); if (mode == _P_SYSTEM) @@ -788,16 +788,24 @@ spawn_guts (const char * prog_arg, const char *const *argv, { myself->set_has_pgid_children (); ProtectHandle (pi.hThread); - pinfo child (cygpid, 1); + pinfo child (cygpid, PID_IN_USE); if (!child) { + syscall_printf ("pinfo failed"); set_errno (EAGAIN); - syscall_printf ("-1 = spawnve (), process table full"); - return -1; + res = -1; + goto out; } child->dwProcessId = pi.dwProcessId; child->hProcess = pi.hProcess; - child.remember (); + if (!child.remember ()) + { + syscall_printf ("process table full"); + set_errno (EAGAIN); + res = -1; + goto out; + } + strcpy (child->progname, real_path); /* FIXME: This introduces an unreferenced, open handle into the child. The purpose is to keep the pid shared memory open so that all of @@ -919,6 +927,7 @@ spawn_guts (const char * prog_arg, const char *const *argv, break; } +out: pthread_cleanup_pop (1); return (int) res; } -- 2.11.0