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

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

Powered by Google App Engine
This is Rietveld 408576698