Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2003-09-26 06:23:34 +0400
committerChristopher Faylor <me@cgf.cx>2003-09-26 06:23:34 +0400
commit570be9788fa387f44cc775e775db747ea9698533 (patch)
tree1037261a2c836b4f9b72ac39cbc322aabbb8dd74 /winsup/cygwin
parent711d0c752af7fbb8573db47f8ac64b42bf9419c5 (diff)
* 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.
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/ChangeLog8
-rw-r--r--winsup/cygwin/spawn.cc21
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;
}