diff options
author | Treehugger Robot | 2018-01-31 11:35:29 -0600 |
---|---|---|
committer | Gerrit Code Review | 2018-01-31 11:35:29 -0600 |
commit | dd218e6c8476368ca8733b046b93005d7cb25ee6 (patch) | |
tree | 18d8f8682b20e9d89786e049662965706df9c5de /libcutils | |
parent | 0e239bbd8b205d4441aef5fa3643bef23ada3955 (diff) | |
parent | 276758dab8e24b29be0abb1b6bdadd7c897e8701 (diff) | |
download | platform-system-core-dd218e6c8476368ca8733b046b93005d7cb25ee6.tar.gz platform-system-core-dd218e6c8476368ca8733b046b93005d7cb25ee6.tar.xz platform-system-core-dd218e6c8476368ca8733b046b93005d7cb25ee6.zip |
Merge "libcutils: test: increase use of ashmem_valid(fd)"
Diffstat (limited to 'libcutils')
-rw-r--r-- | libcutils/tests/AshmemTest.cpp | 70 |
1 files changed, 48 insertions, 22 deletions
diff --git a/libcutils/tests/AshmemTest.cpp b/libcutils/tests/AshmemTest.cpp index a87e23e30..b37d020fb 100644 --- a/libcutils/tests/AshmemTest.cpp +++ b/libcutils/tests/AshmemTest.cpp | |||
@@ -14,11 +14,18 @@ | |||
14 | * limitations under the License. | 14 | * limitations under the License. |
15 | */ | 15 | */ |
16 | 16 | ||
17 | #include <errno.h> | ||
18 | #include <linux/fs.h> | ||
19 | #include <stdint.h> | ||
20 | #include <string.h> | ||
21 | #include <sys/mman.h> | ||
22 | #include <sys/types.h> | ||
23 | #include <unistd.h> | ||
24 | |||
25 | #include <android-base/macros.h> | ||
17 | #include <android-base/unique_fd.h> | 26 | #include <android-base/unique_fd.h> |
18 | #include <cutils/ashmem.h> | 27 | #include <cutils/ashmem.h> |
19 | #include <gtest/gtest.h> | 28 | #include <gtest/gtest.h> |
20 | #include <linux/fs.h> | ||
21 | #include <sys/mman.h> | ||
22 | 29 | ||
23 | using android::base::unique_fd; | 30 | using android::base::unique_fd; |
24 | 31 | ||
@@ -31,15 +38,21 @@ void TestCreateRegion(size_t size, unique_fd &fd, int prot) { | |||
31 | } | 38 | } |
32 | 39 | ||
33 | void TestMmap(const unique_fd& fd, size_t size, int prot, void** region, off_t off = 0) { | 40 | void TestMmap(const unique_fd& fd, size_t size, int prot, void** region, off_t off = 0) { |
41 | ASSERT_TRUE(fd >= 0); | ||
42 | ASSERT_TRUE(ashmem_valid(fd)); | ||
34 | *region = mmap(nullptr, size, prot, MAP_SHARED, fd, off); | 43 | *region = mmap(nullptr, size, prot, MAP_SHARED, fd, off); |
35 | ASSERT_NE(MAP_FAILED, *region); | 44 | ASSERT_NE(MAP_FAILED, *region); |
36 | } | 45 | } |
37 | 46 | ||
38 | void TestProtDenied(const unique_fd &fd, size_t size, int prot) { | 47 | void TestProtDenied(const unique_fd &fd, size_t size, int prot) { |
48 | ASSERT_TRUE(fd >= 0); | ||
49 | ASSERT_TRUE(ashmem_valid(fd)); | ||
39 | EXPECT_EQ(MAP_FAILED, mmap(nullptr, size, prot, MAP_SHARED, fd, 0)); | 50 | EXPECT_EQ(MAP_FAILED, mmap(nullptr, size, prot, MAP_SHARED, fd, 0)); |
40 | } | 51 | } |
41 | 52 | ||
42 | void TestProtIs(const unique_fd& fd, int prot) { | 53 | void TestProtIs(const unique_fd& fd, int prot) { |
54 | ASSERT_TRUE(fd >= 0); | ||
55 | ASSERT_TRUE(ashmem_valid(fd)); | ||
43 | EXPECT_EQ(prot, ioctl(fd, ASHMEM_GET_PROT_MASK)); | 56 | EXPECT_EQ(prot, ioctl(fd, ASHMEM_GET_PROT_MASK)); |
44 | } | 57 | } |
45 | 58 | ||
@@ -86,18 +99,23 @@ TEST(AshmemTest, ForkTest) { | |||
86 | ASSERT_EQ(0, memcmp(region1, &data, size)); | 99 | ASSERT_EQ(0, memcmp(region1, &data, size)); |
87 | EXPECT_EQ(0, munmap(region1, size)); | 100 | EXPECT_EQ(0, munmap(region1, size)); |
88 | 101 | ||
89 | ASSERT_EXIT({ | 102 | ASSERT_EXIT( |
90 | void *region2 = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); | 103 | { |
91 | if (region2 == MAP_FAILED) { | 104 | if (!ashmem_valid(fd)) { |
92 | _exit(1); | 105 | _exit(3); |
93 | } | 106 | } |
94 | if (memcmp(region2, &data, size) != 0) { | 107 | void* region2 = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); |
95 | _exit(2); | 108 | if (region2 == MAP_FAILED) { |
96 | } | 109 | _exit(1); |
97 | memset(region2, 0, size); | 110 | } |
98 | munmap(region2, size); | 111 | if (memcmp(region2, &data, size) != 0) { |
99 | _exit(0); | 112 | _exit(2); |
100 | }, ::testing::ExitedWithCode(0),""); | 113 | } |
114 | memset(region2, 0, size); | ||
115 | munmap(region2, size); | ||
116 | _exit(0); | ||
117 | }, | ||
118 | ::testing::ExitedWithCode(0), ""); | ||
101 | 119 | ||
102 | memset(&data, 0, size); | 120 | memset(&data, 0, size); |
103 | void *region2; | 121 | void *region2; |
@@ -146,6 +164,7 @@ TEST(AshmemTest, FileOperationsTest) { | |||
146 | }; | 164 | }; |
147 | for (const auto& cfg : seeks) { | 165 | for (const auto& cfg : seeks) { |
148 | errno = 0; | 166 | errno = 0; |
167 | ASSERT_TRUE(ashmem_valid(fd)); | ||
149 | auto off = lseek(fd, cfg.offset, cfg.whence); | 168 | auto off = lseek(fd, cfg.offset, cfg.whence); |
150 | ASSERT_EQ(cfg.ret, off) << "lseek(" << cfg.offset << ", " << cfg.whence << ") failed" | 169 | ASSERT_EQ(cfg.ret, off) << "lseek(" << cfg.offset << ", " << cfg.whence << ") failed" |
151 | << (errno ? ": " : "") << (errno ? strerror(errno) : ""); | 170 | << (errno ? ": " : "") << (errno ? strerror(errno) : ""); |
@@ -196,15 +215,19 @@ TEST(AshmemTest, ForkProtTest) { | |||
196 | constexpr size_t size = PAGE_SIZE; | 215 | constexpr size_t size = PAGE_SIZE; |
197 | 216 | ||
198 | int protFlags[] = { PROT_READ, PROT_WRITE }; | 217 | int protFlags[] = { PROT_READ, PROT_WRITE }; |
199 | for (int i = 0; i < 2; i++) { | 218 | for (size_t i = 0; i < arraysize(protFlags); i++) { |
200 | ASSERT_NO_FATAL_FAILURE(TestCreateRegion(size, fd, PROT_READ | PROT_WRITE)); | 219 | ASSERT_NO_FATAL_FAILURE(TestCreateRegion(size, fd, PROT_READ | PROT_WRITE)); |
201 | ASSERT_EXIT({ | 220 | ASSERT_EXIT( |
202 | if (ashmem_set_prot_region(fd, protFlags[i]) >= 0) { | 221 | { |
203 | _exit(0); | 222 | if (!ashmem_valid(fd)) { |
204 | } else { | 223 | _exit(3); |
205 | _exit(1); | 224 | } else if (ashmem_set_prot_region(fd, protFlags[i]) >= 0) { |
206 | } | 225 | _exit(0); |
207 | }, ::testing::ExitedWithCode(0), ""); | 226 | } else { |
227 | _exit(1); | ||
228 | } | ||
229 | }, | ||
230 | ::testing::ExitedWithCode(0), ""); | ||
208 | ASSERT_NO_FATAL_FAILURE(TestProtDenied(fd, size, protFlags[1-i])); | 231 | ASSERT_NO_FATAL_FAILURE(TestProtDenied(fd, size, protFlags[1-i])); |
209 | } | 232 | } |
210 | } | 233 | } |
@@ -227,6 +250,9 @@ TEST(AshmemTest, ForkMultiRegionTest) { | |||
227 | 250 | ||
228 | ASSERT_EXIT({ | 251 | ASSERT_EXIT({ |
229 | for (int i = 0; i < nRegions; i++) { | 252 | for (int i = 0; i < nRegions; i++) { |
253 | if (!ashmem_valid(fd[i])) { | ||
254 | _exit(3); | ||
255 | } | ||
230 | void *region = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd[i], 0); | 256 | void *region = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd[i], 0); |
231 | if (region == MAP_FAILED) { | 257 | if (region == MAP_FAILED) { |
232 | _exit(1); | 258 | _exit(1); |