diff options
author | Christopher Faylor <me@cgf.cx> | 2013-03-09 00:11:31 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2013-03-09 00:11:31 +0000 |
commit | 6a375e03253862e982d27d87c10cac618ba9b7f6 (patch) | |
tree | 9ca4525d5377a1b4ea8b8770e4b7104a13d0dbc9 | |
parent | 735c1b80062ad50f585ca7ed4e928a9f0b92f497 (diff) | |
download | newlib-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/ChangeLog | 6 | ||||
-rw-r--r-- | winsup/cygwin/spawn.cc | 19 |
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; } |