Fix C++ unit tests.

Add a missing test to libminijail_unittest.cpp and replace NULL with
nullptr.

Bug: 32608187
Test: libminijail_unittest, syscall_filter_unittest
Change-Id: If21e6e6f312e74bc63ea7865730cd73089eeeaf9
diff --git a/libminijail_unittest.cpp b/libminijail_unittest.cpp
index 4e75bdc..cdaba0b 100644
--- a/libminijail_unittest.cpp
+++ b/libminijail_unittest.cpp
@@ -17,7 +17,9 @@
 
 #include <errno.h>
 
+#include <fcntl.h>
 #include <sys/types.h>
+#include <sys/stat.h>
 #include <sys/wait.h>
 
 #include <gtest/gtest.h>
@@ -26,6 +28,12 @@
 #include "libminijail-private.h"
 #include "util.h"
 
+#if defined(__ANDROID__)
+const char *kShellPath = "/system/bin/sh";
+#else
+const char *kShellPath = "/bin/sh";
+#endif
+
 /* Prototypes needed only by test. */
 void *consumebytes(size_t length, char **buf, size_t *buflength);
 char *consumestr(char **buf, size_t *buflength);
@@ -41,7 +49,7 @@
   char buf[1024];
   size_t len = sizeof(buf);
   char *pos = &buf[0];
-  EXPECT_TRUE(NULL != consumebytes(0, &pos, &len));
+  EXPECT_NE(nullptr, consumebytes(0, &pos, &len));
   EXPECT_EQ(&buf[0], pos);
   EXPECT_EQ(sizeof(buf), len);
 }
@@ -52,7 +60,7 @@
   char *pos = &buf[0];
   /* One past the end since it consumes the whole buffer. */
   char *end = &buf[sizeof(buf)];
-  EXPECT_TRUE(NULL != consumebytes(len, &pos, &len));
+  EXPECT_NE(nullptr, consumebytes(len, &pos, &len));
   EXPECT_EQ((size_t)0, len);
   EXPECT_EQ(end, pos);
 }
@@ -63,7 +71,7 @@
   char *pos = &buf[0];
   /* One past the end since it consumes the whole buffer. */
   char *end = &buf[sizeof(buf) / 2];
-  EXPECT_TRUE(NULL != consumebytes(len / 2, &pos, &len));
+  EXPECT_NE(nullptr, consumebytes(len / 2, &pos, &len));
   EXPECT_EQ(sizeof(buf) / 2, len);
   EXPECT_EQ(end, pos);
 }
@@ -73,7 +81,7 @@
   size_t len = sizeof(buf);
   char *pos = &buf[0];
   /* One past the end since it consumes the whole buffer. */
-  EXPECT_TRUE(NULL == consumebytes(len + 1, &pos, &len));
+  EXPECT_EQ(nullptr, consumebytes(len + 1, &pos, &len));
   EXPECT_EQ(sizeof(buf), len);
   EXPECT_EQ(&buf[0], pos);
 }
@@ -83,7 +91,7 @@
   size_t len = 0;
   char *pos = &buf[0];
   memset(buf, 0xff, sizeof(buf));
-  EXPECT_EQ(NULL, consumestr(&pos, &len));
+  EXPECT_EQ(nullptr, consumestr(&pos, &len));
   EXPECT_EQ((size_t)0, len);
   EXPECT_EQ(&buf[0], pos);
 }
@@ -93,7 +101,7 @@
   size_t len = sizeof(buf);
   char *pos = &buf[0];
   memset(buf, 0xff, sizeof(buf));
-  EXPECT_EQ(NULL, consumestr(&pos, &len));
+  EXPECT_EQ(nullptr, consumestr(&pos, &len));
   EXPECT_EQ(sizeof(buf), len);
   EXPECT_EQ(&buf[0], pos);
 }
@@ -115,7 +123,7 @@
   char *pos = &buf[0];
   memset(buf, 0xff, sizeof(buf));
   buf[sizeof(buf)-1] = '\0';
-  EXPECT_EQ(NULL, consumestr(&pos, &len));
+  EXPECT_EQ(nullptr, consumestr(&pos, &len));
   EXPECT_EQ(sizeof(buf) - 1, len);
   EXPECT_EQ(&buf[0], pos);
 }
@@ -189,11 +197,7 @@
   ASSERT_TRUE(WIFSIGNALED(status));
   EXPECT_EQ(WTERMSIG(status), SIGTERM);
 
-#if defined(__ANDROID__)
-  argv[0] = "/system/bin/sh";
-#else
-  argv[0] = "/bin/sh";
-#endif
+  argv[0] = (char*)kShellPath;
   argv[1] = "-c";
   argv[2] = "echo test >&2";
   argv[3] = NULL;
@@ -211,3 +215,59 @@
 
   minijail_destroy(j);
 }
+
+TEST(Test, test_minijail_no_fd_leaks) {
+  pid_t pid;
+  int child_stdout;
+  int mj_run_ret;
+  ssize_t read_ret;
+  const size_t buf_len = 128;
+  char buf[buf_len];
+  char script[buf_len];
+  int status;
+  char *argv[4];
+
+  int dev_null = open("/dev/null", O_RDONLY);
+  ASSERT_NE(dev_null, -1);
+  snprintf(script,
+           sizeof(script),
+           "[ -e /proc/self/fd/%d ] && echo yes || echo no",
+           dev_null);
+
+  struct minijail *j = minijail_new();
+
+  argv[0] = (char*)kShellPath;
+  argv[1] = "-c";
+  argv[2] = script;
+  argv[3] = NULL;
+  mj_run_ret = minijail_run_pid_pipes_no_preload(
+      j, argv[0], argv, &pid, NULL, &child_stdout, NULL);
+  EXPECT_EQ(mj_run_ret, 0);
+
+  read_ret = read(child_stdout, buf, buf_len);
+  EXPECT_GE(read_ret, 0);
+  buf[read_ret] = '\0';
+  EXPECT_STREQ(buf, "yes\n");
+
+  waitpid(pid, &status, 0);
+  ASSERT_TRUE(WIFEXITED(status));
+  EXPECT_EQ(WEXITSTATUS(status), 0);
+
+  minijail_close_open_fds(j);
+  mj_run_ret = minijail_run_pid_pipes_no_preload(
+      j, argv[0], argv, &pid, NULL, &child_stdout, NULL);
+  EXPECT_EQ(mj_run_ret, 0);
+
+  read_ret = read(child_stdout, buf, buf_len);
+  EXPECT_GE(read_ret, 0);
+  buf[read_ret] = '\0';
+  EXPECT_STREQ(buf, "no\n");
+
+  waitpid(pid, &status, 0);
+  ASSERT_TRUE(WIFEXITED(status));
+  EXPECT_EQ(WEXITSTATUS(status), 0);
+
+  minijail_destroy(j);
+
+  close(dev_null);
+}