You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by qi...@apache.org on 2018/11/08 07:39:34 UTC

[mesos] 05/08: Added a test `SubprocessTest.WhiteListFds`.

This is an automated email from the ASF dual-hosted git repository.

qianzhang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mesos.git

commit df0a616e3555767e308a87c787d5ad5cdd4e66c1
Author: Qian Zhang <zh...@gmail.com>
AuthorDate: Fri Oct 12 22:04:02 2018 +0800

    Added a test `SubprocessTest.WhiteListFds`.
    
    Review: https://reviews.apache.org/r/69016
---
 3rdparty/libprocess/src/tests/subprocess_tests.cpp | 77 ++++++++++++++++++++++
 1 file changed, 77 insertions(+)

diff --git a/3rdparty/libprocess/src/tests/subprocess_tests.cpp b/3rdparty/libprocess/src/tests/subprocess_tests.cpp
index e6742ec..7f1413c 100644
--- a/3rdparty/libprocess/src/tests/subprocess_tests.cpp
+++ b/3rdparty/libprocess/src/tests/subprocess_tests.cpp
@@ -41,6 +41,7 @@
 namespace io = process::io;
 
 using process::Clock;
+using process::Future;
 using process::MAX_REAP_INTERVAL;
 using process::Subprocess;
 using process::subprocess;
@@ -1048,5 +1049,81 @@ TEST_F(SubprocessTest, EnvironmentOverride)
 }
 
 
+#ifdef __linux__
+// This test verifies:
+//   1. The subprocess will have the stdio file descriptors.
+//   2. The whitelisted file descriptors will be successfully
+//      inherited by the subprocess.
+//   3. The non-whitelisted file descriptors will be not be
+//      inherited by the subprocess.
+TEST_F(SubprocessTest, WhiteListFds)
+{
+  Try<int_fd> fd1 = os::open(
+      path::join(os::getcwd(), id::UUID::random().toString()),
+      O_CREAT | O_EXCL | O_RDONLY | O_CLOEXEC);
+
+  Try<int_fd> fd2 = os::open(
+      path::join(os::getcwd(), id::UUID::random().toString()),
+      O_CREAT | O_EXCL | O_RDONLY);
+
+  ASSERT_SOME(fd1);
+  ASSERT_SOME(fd2);
+
+  Try<Subprocess> s = subprocess(
+      "ls /dev/fd",
+      Subprocess::FD(STDIN_FILENO),
+      Subprocess::PIPE(),
+      Subprocess::FD(STDERR_FILENO),
+      None(),
+      None(),
+      {},
+      {},
+      {fd1.get()});
+
+  ASSERT_SOME(s);
+  ASSERT_SOME(s->out());
+
+  Future<string> output = io::read(s->out().get());
+  AWAIT_READY(output);
+
+  hashset<int_fd> fds;
+
+  vector<string> tokens = strings::tokenize(output.get(), "\n");
+  foreach (const string& fdString, tokens) {
+    Try<int_fd> fd = numify<int_fd>(fdString);
+    ASSERT_SOME(fd);
+
+    fds.insert(fd.get());
+  }
+
+  // The subprocess should always have the stdio file descriptors.
+  EXPECT_TRUE(fds.contains(STDIN_FILENO));
+  EXPECT_TRUE(fds.contains(STDOUT_FILENO));
+  EXPECT_TRUE(fds.contains(STDERR_FILENO));
+
+  // `fd1` should be inherited by the subprocess since it is whitelisted even
+  // it has `O_CLOEXEC` set initially.
+  EXPECT_TRUE(fds.contains(fd1.get()));
+
+  // `fd2` should not be inherited by the subprocess since it is not whitelisted
+  // even it has no `O_CLOEXEC` set initially.
+  EXPECT_FALSE(fds.contains(fd2.get()));
+
+  ASSERT_SOME(os::close(fd1.get()));
+  ASSERT_SOME(os::close(fd2.get()));
+
+  // Advance time until the internal reaper reaps the subprocess.
+  Clock::pause();
+  while (s->status().isPending()) {
+    Clock::advance(MAX_REAP_INTERVAL());
+    Clock::settle();
+  }
+  Clock::resume();
+
+  AWAIT_EXPECT_WEXITSTATUS_EQ(0, s->status());
+}
+#endif // __linux__
+
+
 // TODO(joerg84): Consider adding tests for setsid, working_directory,
 // and supervisor childHooks.