diff options
author | Christopher Faylor <me@cgf.cx> | 2003-09-26 02:23:34 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2003-09-26 02:23:34 +0000 |
commit | 570be9788fa387f44cc775e775db747ea9698533 (patch) | |
tree | 1037261a2c836b4f9b72ac39cbc322aabbb8dd74 | |
parent | 711d0c752af7fbb8573db47f8ac64b42bf9419c5 (diff) | |
download | cygnal-570be9788fa387f44cc775e775db747ea9698533.tar.gz cygnal-570be9788fa387f44cc775e775db747ea9698533.tar.bz2 cygnal-570be9788fa387f44cc775e775db747ea9698533.zip |
* 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.
-rw-r--r-- | winsup/cygwin/ChangeLog | 8 | ||||
-rw-r--r-- | winsup/cygwin/spawn.cc | 21 |
2 files changed, 23 insertions, 6 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index ea53ae594..12804d04f 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -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> * spawn.cc (spawn_guts): Move system signal handling stuff after diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index b33966064..8d2ab2df6 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; } |