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);
+}