Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Side by Side Diff: mojo/public/cpp/bindings/tests/bounds_checker_unittest.cc

Issue 289333002: Mojo cpp bindings: validation logic for incoming messages (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <limits>
6
7 #include "mojo/public/cpp/bindings/lib/bounds_checker.h"
8 #include "mojo/public/cpp/system/core.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 namespace mojo {
12 namespace test {
13 namespace {
14
15 const void* ToPtr(uintptr_t ptr) {
16 return reinterpret_cast<const void*>(ptr);
17 }
18
19 bool AreEqualVectors(const std::vector<uintptr_t>& actual_values,
20 const uintptr_t* expected_values,
21 size_t expected_value_count) {
22 if (actual_values.size() != expected_value_count)
23 return false;
24
25 for (size_t i = 0; i < expected_value_count; ++i) {
26 if (actual_values[i] != expected_values[i])
27 return false;
28 }
29 return true;
30 }
31
32 #ifdef NDEBUG
33 TEST(BoundsCheckerTest, MemoryRangeOverflow) {
34 internal::BoundsChecker
35 checker(ToPtr(std::numeric_limits<uintptr_t>::max() - 3000), 5000, 0);
36
37 EXPECT_FALSE(checker.IsWithinBounds(
38 ToPtr(std::numeric_limits<uintptr_t>::max() - 3000), 1));
39 EXPECT_FALSE(checker.ClaimMemory(
40 ToPtr(std::numeric_limits<uintptr_t>::max() - 3000), 1));
41 }
42 #endif
43
44 TEST(BoundsCheckerTest, IsWithinBounds) {
45 {
46 internal::BoundsChecker checker(ToPtr(1234), 100, 0);
47
48 // Basics.
49 EXPECT_FALSE(checker.IsWithinBounds(ToPtr(100), 5));
50 EXPECT_FALSE(checker.IsWithinBounds(ToPtr(1230), 50));
51 EXPECT_TRUE(checker.IsWithinBounds(ToPtr(1234), 5));
52 EXPECT_TRUE(checker.IsWithinBounds(ToPtr(1240), 50));
53 EXPECT_TRUE(checker.IsWithinBounds(ToPtr(1234), 100));
54 EXPECT_FALSE(checker.IsWithinBounds(ToPtr(1234), 200));
55 EXPECT_FALSE(checker.IsWithinBounds(ToPtr(1240), 100));
56 EXPECT_FALSE(checker.IsWithinBounds(ToPtr(2234), 5));
57
58 // Should return false for empty ranges.
59 EXPECT_FALSE(checker.IsWithinBounds(ToPtr(0), 0));
60 EXPECT_FALSE(checker.IsWithinBounds(ToPtr(1200), 0));
61 EXPECT_FALSE(checker.IsWithinBounds(ToPtr(1234), 0));
62 EXPECT_FALSE(checker.IsWithinBounds(ToPtr(1240), 0));
63 EXPECT_FALSE(checker.IsWithinBounds(ToPtr(2234), 0));
64 }
65
66 {
67 // The valid memory range is empty.
68 internal::BoundsChecker checker(ToPtr(1234), 0, 0);
69
70 EXPECT_FALSE(checker.IsWithinBounds(ToPtr(1234), 1));
71 EXPECT_FALSE(checker.IsWithinBounds(ToPtr(1234), 0));
72 }
73
74 {
75 internal::BoundsChecker
76 checker(ToPtr(std::numeric_limits<uintptr_t>::max() - 2000), 1000, 0);
77
78 // Test overflow.
79 EXPECT_FALSE(checker.IsWithinBounds(
80 ToPtr(std::numeric_limits<uintptr_t>::max() - 1500), 4000));
81 EXPECT_FALSE(checker.IsWithinBounds(
82 ToPtr(std::numeric_limits<uintptr_t>::max() - 1500),
83 std::numeric_limits<uint32_t>::max()));
84
85 // This should be fine.
86 EXPECT_TRUE(checker.IsWithinBounds(
87 ToPtr(std::numeric_limits<uintptr_t>::max() - 1500), 200));
88 }
89 }
90
91 TEST(BoundsCheckerTest, ClaimHandle) {
92 {
93 internal::BoundsChecker checker(ToPtr(0), 0, 10);
94
95 // Basics.
96 EXPECT_TRUE(checker.ClaimHandle(Handle(0)));
97 EXPECT_FALSE(checker.ClaimHandle(Handle(0)));
98
99 EXPECT_TRUE(checker.ClaimHandle(Handle(9)));
100 EXPECT_FALSE(checker.ClaimHandle(Handle(10)));
101
102 // Should return true for invalid handle.
103 EXPECT_TRUE(checker.ClaimHandle(Handle(static_cast<MojoHandle>(-1))));
104 EXPECT_TRUE(checker.ClaimHandle(Handle(static_cast<MojoHandle>(-1))));
105 }
106
107 {
108 // No handle to claim.
109 internal::BoundsChecker checker(ToPtr(0), 0, 0);
110
111 EXPECT_FALSE(checker.ClaimHandle(Handle(0)));
112
113 // Should still return true for invalid handle.
114 EXPECT_TRUE(checker.ClaimHandle(Handle(static_cast<MojoHandle>(-1))));
115 }
116 }
117
118 TEST(BoundsCheckerTest, ClaimMemory) {
119 {
120 internal::BoundsChecker checker(ToPtr(1000), 2000, 0);
121
122 // Basics.
123 EXPECT_FALSE(checker.ClaimMemory(ToPtr(500), 100));
124 EXPECT_FALSE(checker.ClaimMemory(ToPtr(800), 300));
125 EXPECT_TRUE(checker.ClaimMemory(ToPtr(1000), 100));
126 EXPECT_FALSE(checker.ClaimMemory(ToPtr(1099), 100));
127 EXPECT_TRUE(checker.ClaimMemory(ToPtr(1100), 200));
128 EXPECT_FALSE(checker.ClaimMemory(ToPtr(2000), 1001));
129 EXPECT_TRUE(checker.ClaimMemory(ToPtr(2000), 1000));
130 EXPECT_FALSE(checker.ClaimMemory(ToPtr(3000), 1));
131
132 // Test that we cannot claim a range that overlaps an existing one.
133 EXPECT_TRUE(checker.ClaimMemory(ToPtr(1400), 200));
134 // The same range.
135 EXPECT_FALSE(checker.ClaimMemory(ToPtr(1400), 200));
136 // Inclusion.
137 EXPECT_FALSE(checker.ClaimMemory(ToPtr(1450), 100));
138 // The head overlaps an existing range.
139 EXPECT_FALSE(checker.ClaimMemory(ToPtr(1450), 200));
140 // The tail overlaps an existing range.
141 EXPECT_FALSE(checker.ClaimMemory(ToPtr(1350), 200));
142 }
143
144 {
145 // No memory to claim.
146 internal::BoundsChecker checker(ToPtr(10000), 0, 0);
147
148 EXPECT_FALSE(checker.ClaimMemory(ToPtr(10000), 1));
149 EXPECT_FALSE(checker.ClaimMemory(ToPtr(10000), 0));
150 }
151
152 {
153 internal::BoundsChecker checker(ToPtr(1000), 2000, 0);
154
155 // Test the internal state of claimed ranges.
156 EXPECT_TRUE(checker.ClaimMemory(ToPtr(2150), 50));
157 EXPECT_EQ(2u, checker.GetClaimedRangesForTesting().size());
158
159 EXPECT_TRUE(checker.ClaimMemory(ToPtr(2350), 50));
160 EXPECT_EQ(4u, checker.GetClaimedRangesForTesting().size());
161
162 EXPECT_TRUE(checker.ClaimMemory(ToPtr(2250), 50));
163 uintptr_t expected_values1[] = {2150, 2200, 2250, 2300, 2350, 2400};
164 EXPECT_TRUE(AreEqualVectors(checker.GetClaimedRangesForTesting(),
165 expected_values1, 6u));
166
167 EXPECT_TRUE(checker.ClaimMemory(ToPtr(2300), 25));
168 uintptr_t expected_values2[] = {2150, 2200, 2250, 2325, 2350, 2400};
169 EXPECT_TRUE(AreEqualVectors(checker.GetClaimedRangesForTesting(),
170 expected_values2, 6u));
171
172 EXPECT_TRUE(checker.ClaimMemory(ToPtr(2050), 100));
173 uintptr_t expected_values3[] = {2050, 2200, 2250, 2325, 2350, 2400};
174 EXPECT_TRUE(AreEqualVectors(checker.GetClaimedRangesForTesting(),
175 expected_values3, 6u));
176
177 EXPECT_TRUE(checker.ClaimMemory(ToPtr(2200), 50));
178 uintptr_t expected_values4[] = {2050, 2325, 2350, 2400};
179 EXPECT_TRUE(AreEqualVectors(checker.GetClaimedRangesForTesting(),
180 expected_values4, 4u));
181
182 EXPECT_TRUE(checker.ClaimMemory(ToPtr(2325), 25));
183 uintptr_t expected_values5[] = {2050, 2400};
184 EXPECT_TRUE(AreEqualVectors(checker.GetClaimedRangesForTesting(),
185 expected_values5, 2u));
186 }
187
188 {
189 internal::BoundsChecker
190 checker(ToPtr(std::numeric_limits<uintptr_t>::max() - 1000), 500, 0);
191
192 // Test overflow.
193 EXPECT_FALSE(checker.ClaimMemory(
194 ToPtr(std::numeric_limits<uintptr_t>::max() - 750), 4000));
195 EXPECT_FALSE(checker.ClaimMemory(
196 ToPtr(std::numeric_limits<uintptr_t>::max() - 750),
197 std::numeric_limits<uint32_t>::max()));
198
199 // This should be fine.
200 EXPECT_TRUE(checker.ClaimMemory(
201 ToPtr(std::numeric_limits<uintptr_t>::max() - 750), 200));
202 }
203 }
204
205 } // namespace
206 } // namespace test
207 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698