Windows: Fixed inheritance in `Subprocess::PIPE()`.

`Subprocess::PIPE()` was creating inheritable pipes and files. On
Windows, our policy is to make everything not inheritable and then
have `CreateProcessW` set the the right pipes to be inheritable to
avoid any handle leaks.

Review: https://reviews.apache.org/r/66958/


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/07f5c000
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/07f5c000
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/07f5c000

Branch: refs/heads/master
Commit: 07f5c00038d4ae22fbb72f8979f5f013b37780fd
Parents: ebac13d
Author: Akash Gupta <akash-gu...@hotmail.com>
Authored: Wed May 23 14:01:49 2018 -0700
Committer: Andrew Schwartzmeyer <and...@schwartzmeyer.com>
Committed: Wed May 23 14:07:47 2018 -0700

----------------------------------------------------------------------
 3rdparty/libprocess/src/subprocess_windows.cpp | 47 +++++----------------
 1 file changed, 10 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/07f5c000/3rdparty/libprocess/src/subprocess_windows.cpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/src/subprocess_windows.cpp 
b/3rdparty/libprocess/src/subprocess_windows.cpp
index a1e6425..c497a03 100644
--- a/3rdparty/libprocess/src/subprocess_windows.cpp
+++ b/3rdparty/libprocess/src/subprocess_windows.cpp
@@ -36,8 +36,6 @@
 #include <stout/os/pipe.hpp>
 #include <stout/os/strerror.hpp>
 
-#include <stout/internal/windows/inherit.hpp>
-
 using std::array;
 using std::string;
 
@@ -46,45 +44,32 @@ namespace process {
 using InputFileDescriptors = Subprocess::IO::InputFileDescriptors;
 using OutputFileDescriptors = Subprocess::IO::OutputFileDescriptors;
 
-// Opens an inheritable pipe[1] represented as a pair of file handles. On
-// success, the first handle returned receives the 'read' handle of the pipe,
-// while the second receives the 'write' handle. The pipe handles can then be
-// passed to a child process, as exemplified in [2].
+// Opens a pair of file handles. On success, the first handle returned receives
+// the 'read' handle of the pipe, while the second receives the 'write' handle.
+// The pipe handles can then be passed to a child process, as shown in [1].
 //
-// [1] 
https://msdn.microsoft.com/en-us/library/windows/desktop/aa379560(v=vs.85).aspx
-// [2] 
https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx
+// [1] 
https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx
 Subprocess::IO Subprocess::PIPE()
 {
   return Subprocess::IO(
       []() -> Try<InputFileDescriptors> {
-        const Try<array<int_fd, 2>> pipefd = os::pipe();
+        // Create STDIN pipe and set the 'read' component to be not overlapped,
+        // because we're sending it to the child process.
+        const Try<array<int_fd, 2>> pipefd = os::pipe(false, true);
         if (pipefd.isError()) {
           return Error(pipefd.error());
         }
 
-        // Create STDIN pipe and set the 'write' component to not be
-        // inheritable.
-        const Try<Nothing> inherit =
-          ::internal::windows::set_inherit(pipefd.get()[1], false);
-        if (inherit.isError()) {
-          return Error(inherit.error());
-        }
-
         return InputFileDescriptors{pipefd.get()[0], pipefd.get()[1]};
       },
       []() -> Try<OutputFileDescriptors> {
-        const Try<array<int_fd, 2>> pipefd = os::pipe();
+        // Create STDOUT pipe and set the 'write' component to be not
+        // overlapped, because we're sending it to the child process.
+        const Try<array<int_fd, 2>> pipefd = os::pipe(true, false);
         if (pipefd.isError()) {
           return Error(pipefd.error());
         }
 
-        // Create OUT pipe and set the 'read' component to not be inheritable.
-        const Try<Nothing> inherit =
-          ::internal::windows::set_inherit(pipefd.get()[0], false);
-        if (inherit.isError()) {
-          return Error(inherit.error());
-        }
-
         return OutputFileDescriptors{pipefd.get()[0], pipefd.get()[1]};
       });
 }
@@ -100,12 +85,6 @@ Subprocess::IO Subprocess::PATH(const string& path)
           return Error(open.error());
         }
 
-        const Try<Nothing> inherit =
-          ::internal::windows::set_inherit(open.get(), true);
-        if (inherit.isError()) {
-          return Error(inherit.error());
-        }
-
         return InputFileDescriptors{open.get(), None()};
       },
       [path]() -> Try<OutputFileDescriptors> {
@@ -115,12 +94,6 @@ Subprocess::IO Subprocess::PATH(const string& path)
           return Error(open.error());
         }
 
-        const Try<Nothing> inherit =
-          ::internal::windows::set_inherit(open.get(), true);
-        if (inherit.isError()) {
-          return Error(inherit.error());
-        }
-
         return OutputFileDescriptors{None(), open.get()};
       });
 }

Reply via email to