aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2013-03-09 00:11:31 +0000
committerChristopher Faylor <me@cgf.cx>2013-03-09 00:11:31 +0000
commit6a375e03253862e982d27d87c10cac618ba9b7f6 (patch)
tree9ca4525d5377a1b4ea8b8770e4b7104a13d0dbc9
parent735c1b80062ad50f585ca7ed4e928a9f0b92f497 (diff)
downloadnewlib-6a375e03253862e982d27d87c10cac618ba9b7f6.zip
newlib-6a375e03253862e982d27d87c10cac618ba9b7f6.tar.gz
newlib-6a375e03253862e982d27d87c10cac618ba9b7f6.tar.bz2
* spawn.cc (child_info_spawn::worker): Save and restore my_wr_proc_pipe around
non-execing operations to avoid handle leak seen in http://cygwin.com/ml/cygwin/2013-03/msg00152.html .
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/spawn.cc19
2 files changed, 20 insertions, 5 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index d509568..17746b3 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,9 @@
+2013-03-08 Christopher Faylor <me.cygwin2013@cgf.cx>
+
+ * spawn.cc (child_info_spawn::worker): Save and restore my_wr_proc_pipe
+ around non-execing operations to avoid handle leak seen in
+ http://cygwin.com/ml/cygwin/2013-03/msg00152.html .
+
2013-03-07 Corinna Vinschen <corinna@vinschen.de>
* include/sys/un.h (UNIX_PATH_MAX): Rename from UNIX_PATH_LEN to
diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc
index 170f37a..e5152c0 100644
--- a/winsup/cygwin/spawn.cc
+++ b/winsup/cygwin/spawn.cc
@@ -620,6 +620,9 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv,
SetHandleInformation (wr_proc_pipe, HANDLE_FLAG_INHERIT, 0);
SetHandleInformation (parent, HANDLE_FLAG_INHERIT, 0);
}
+ /* FIXME: racy */
+ if (mode != _P_OVERLAY)
+ SetHandleInformation (my_wr_proc_pipe, HANDLE_FLAG_INHERIT, 0);
parent_winpid = GetCurrentProcessId ();
/* When ruid != euid we create the new process under the current original
@@ -724,10 +727,9 @@ loop:
}
}
- /* Restore impersonation. In case of _P_OVERLAY this isn't
- allowed since it would overwrite child data. */
- if (mode != _P_OVERLAY || !rc)
- ::cygheap->user.reimpersonate ();
+ if (mode != _P_OVERLAY)
+ SetHandleInformation (my_wr_proc_pipe, HANDLE_FLAG_INHERIT,
+ HANDLE_FLAG_INHERIT);
/* Set errno now so that debugging messages from it appear before our
final debugging message [this is a general rule for debugging
@@ -748,9 +750,16 @@ loop:
be closed otherwise. Don't need to do this for 'parent' since it will
be closed in every case. See FIXME above. */
if (!iscygwin () && mode == _P_OVERLAY)
- SetHandleInformation (wr_proc_pipe, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
+ SetHandleInformation (wr_proc_pipe, HANDLE_FLAG_INHERIT,
+ HANDLE_FLAG_INHERIT);
if (wr_proc_pipe == my_wr_proc_pipe)
wr_proc_pipe = NULL; /* We still own it: don't nuke in destructor */
+
+ /* Restore impersonation. In case of _P_OVERLAY this isn't
+ allowed since it would overwrite child data. */
+ if (mode != _P_OVERLAY)
+ ::cygheap->user.reimpersonate ();
+
res = -1;
goto out;
}