summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/ChangeLog5
-rw-r--r--winsup/cygwin/pinfo.cc9
2 files changed, 12 insertions, 2 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 21f9f420d..9d0215c52 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,8 @@
+2005-01-03 Christopher Faylor <cgf@timesys.com>
+
+ * pinfo.cc (_pinfo::dup_proc_pipe): Can't close proc pipe when execing
+ or we will suffer an exit code race.
+
2005-01-03 Corinna Vinschen <corinna@vinschen.de>
* signal.cc (abort): Call _GLOBAL_REENT's __cleanup.
diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc
index d600b58bd..8ebc602e6 100644
--- a/winsup/cygwin/pinfo.cc
+++ b/winsup/cygwin/pinfo.cc
@@ -764,9 +764,14 @@ proc_waiter (void *arg)
bool
_pinfo::dup_proc_pipe (HANDLE hProcess)
{
+ DWORD flags = DUPLICATE_SAME_ACCESS;
+ /* Grr. Can't set DUPLICATE_CLOSE_SOURCE for exec case because we could be
+ execing a non-cygwin process and we need to set the exit value before the
+ parent sees it. */
+ if (this != myself)
+ flags |= DUPLICATE_CLOSE_SOURCE;
bool res = DuplicateHandle (hMainProc, wr_proc_pipe, hProcess, &wr_proc_pipe,
- 0, FALSE,
- DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE);
+ 0, FALSE, flags);
if (!res)
sigproc_printf ("DuplicateHandle failed, pid %d, hProcess %p, %E", pid, hProcess);
else