* 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.
This commit is contained in:
Christopher Faylor 2003-09-26 02:23:34 +00:00
parent 711d0c752a
commit 570be9788f
2 changed files with 23 additions and 6 deletions

View File

@ -1,3 +1,11 @@
2003-09-25 Pierre Humblet <pierre.humblet@ieee.org>
Christopher Faylor <cgf@redhat.com>
* 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 <cgf@redhat.com> 2003-09-25 Christopher Faylor <cgf@redhat.com>
* spawn.cc (spawn_guts): Move system signal handling stuff after * spawn.cc (spawn_guts): Move system signal handling stuff after

View File

@ -711,7 +711,7 @@ spawn_guts (const char * prog_arg, const char *const *argv,
/* Restore impersonation. In case of _P_OVERLAY this isn't /* Restore impersonation. In case of _P_OVERLAY this isn't
allowed since it would overwrite child data. */ allowed since it would overwrite child data. */
if (mode != _P_OVERLAY) if (mode != _P_OVERLAY || !rc)
cygheap->user.reimpersonate (); cygheap->user.reimpersonate ();
MALLOC_CHECK; MALLOC_CHECK;
@ -734,7 +734,7 @@ spawn_guts (const char * prog_arg, const char *const *argv,
/* FIXME: There is a small race here */ /* FIXME: There is a small race here */
DWORD res; int res;
pthread_cleanup cleanup; pthread_cleanup cleanup;
pthread_cleanup_push (do_cleanup, (void *) &cleanup); pthread_cleanup_push (do_cleanup, (void *) &cleanup);
if (mode == _P_SYSTEM) if (mode == _P_SYSTEM)
@ -788,16 +788,24 @@ spawn_guts (const char * prog_arg, const char *const *argv,
{ {
myself->set_has_pgid_children (); myself->set_has_pgid_children ();
ProtectHandle (pi.hThread); ProtectHandle (pi.hThread);
pinfo child (cygpid, 1); pinfo child (cygpid, PID_IN_USE);
if (!child) if (!child)
{ {
syscall_printf ("pinfo failed");
set_errno (EAGAIN); set_errno (EAGAIN);
syscall_printf ("-1 = spawnve (), process table full"); res = -1;
return -1; goto out;
} }
child->dwProcessId = pi.dwProcessId; child->dwProcessId = pi.dwProcessId;
child->hProcess = pi.hProcess; 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); strcpy (child->progname, real_path);
/* FIXME: This introduces an unreferenced, open handle into the child. /* FIXME: This introduces an unreferenced, open handle into the child.
The purpose is to keep the pid shared memory open so that all of 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; break;
} }
out:
pthread_cleanup_pop (1); pthread_cleanup_pop (1);
return (int) res; return (int) res;
} }