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

Side by Side Diff: ipc/ipc_message_unittest.cc

Issue 1345353004: Resize IPC input buffer to fit the next message. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix tests and address comments Created 5 years, 2 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
« ipc/ipc_channel_reader.h ('K') | « ipc/ipc_message.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ipc/ipc_message.h" 5 #include "ipc/ipc_message.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <limits>
10
9 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
10 #include "base/strings/utf_string_conversions.h" 12 #include "base/strings/utf_string_conversions.h"
11 #include "base/values.h" 13 #include "base/values.h"
12 #include "ipc/ipc_message_utils.h" 14 #include "ipc/ipc_message_utils.h"
13 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
14 16
15 // IPC messages for testing ---------------------------------------------------- 17 // IPC messages for testing ----------------------------------------------------
16 18
17 #define IPC_MESSAGE_IMPL 19 #define IPC_MESSAGE_IMPL
18 #include "ipc/ipc_message_macros.h" 20 #include "ipc/ipc_message_macros.h"
19 21
20 #define IPC_MESSAGE_START TestMsgStart 22 #define IPC_MESSAGE_START TestMsgStart
21 23
22 IPC_MESSAGE_CONTROL0(TestMsgClassEmpty) 24 IPC_MESSAGE_CONTROL0(TestMsgClassEmpty)
23 25
24 IPC_MESSAGE_CONTROL1(TestMsgClassI, int) 26 IPC_MESSAGE_CONTROL1(TestMsgClassI, int)
25 27
26 IPC_SYNC_MESSAGE_CONTROL1_1(TestMsgClassIS, int, std::string) 28 IPC_SYNC_MESSAGE_CONTROL1_1(TestMsgClassIS, int, std::string)
27 29
28 namespace { 30 namespace IPC {
29 31
30 TEST(IPCMessageTest, BasicMessageTest) { 32 TEST(IPCMessageTest, BasicMessageTest) {
31 int v1 = 10; 33 int v1 = 10;
32 std::string v2("foobar"); 34 std::string v2("foobar");
33 base::string16 v3(base::ASCIIToUTF16("hello world")); 35 base::string16 v3(base::ASCIIToUTF16("hello world"));
34 36
35 IPC::Message m(0, 1, IPC::Message::PRIORITY_NORMAL); 37 IPC::Message m(0, 1, IPC::Message::PRIORITY_NORMAL);
36 EXPECT_TRUE(m.WriteInt(v1)); 38 EXPECT_TRUE(m.WriteInt(v1));
37 EXPECT_TRUE(m.WriteString(v2)); 39 EXPECT_TRUE(m.WriteString(v2));
38 EXPECT_TRUE(m.WriteString16(v3)); 40 EXPECT_TRUE(m.WriteString16(v3));
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 110
109 EXPECT_TRUE(input.Equals(&output)); 111 EXPECT_TRUE(input.Equals(&output));
110 112
111 // Also test the corrupt case. 113 // Also test the corrupt case.
112 IPC::Message bad_msg(1, 2, IPC::Message::PRIORITY_NORMAL); 114 IPC::Message bad_msg(1, 2, IPC::Message::PRIORITY_NORMAL);
113 bad_msg.WriteInt(99); 115 bad_msg.WriteInt(99);
114 iter = base::PickleIterator(bad_msg); 116 iter = base::PickleIterator(bad_msg);
115 EXPECT_FALSE(IPC::ReadParam(&bad_msg, &iter, &output)); 117 EXPECT_FALSE(IPC::ReadParam(&bad_msg, &iter, &output));
116 } 118 }
117 119
120 TEST(IPCMessageTest, FindNext) {
121 IPC::Message message;
122 EXPECT_TRUE(message.WriteString("Goooooooogle"));
123 EXPECT_TRUE(message.WriteInt(111));
124
125 std::vector<char> message_data(message.size() + 7);
126 memcpy(message_data.data(), message.data(), message.size());
127
128 const char* data_start = message_data.data();
129 const char* data_end = data_start + message.size();
130
131 IPC::Message::NextMessageInfo next;
132
133 // Data range contains the entire message plus some extra bytes
134 IPC::Message::FindNext(data_start, data_end + 1, &next);
135 EXPECT_TRUE(next.message_found);
136 EXPECT_EQ(next.message_size, message.size());
137 EXPECT_EQ(next.pickle_end, data_end);
138 EXPECT_EQ(next.message_end, data_end);
139
140 // Data range exactly contains the entire message
141 IPC::Message::FindNext(data_start, data_end, &next);
142 EXPECT_TRUE(next.message_found);
143 EXPECT_EQ(next.message_size, message.size());
144 EXPECT_EQ(next.pickle_end, data_end);
145 EXPECT_EQ(next.message_end, data_end);
146
147 // Data range doesn't contain the entire message
148 // (but contains the message header)
149 IPC::Message::FindNext(data_start, data_end - 1, &next);
150 EXPECT_FALSE(next.message_found);
151 #if USE_ATTACHMENT_BROKER
152 EXPECT_EQ(next.message_size, 0u);
153 #else
154 EXPECT_EQ(next.message_size, message.size());
155 #endif
156
157 // Data range doesn't contain the message header
158 // (but contains the pickle header)
159 IPC::Message::FindNext(data_start,
160 data_start + sizeof(IPC::Message::Header) - 1,
161 &next);
162 EXPECT_FALSE(next.message_found);
163 EXPECT_EQ(next.message_size, 0u);
164
165 // Data range doesn't contain the pickle header
166 IPC::Message::FindNext(data_start,
167 data_start + sizeof(base::Pickle::Header) - 1,
168 &next);
169 EXPECT_FALSE(next.message_found);
170 EXPECT_EQ(next.message_size, 0u);
171 }
172
173 TEST(IPCMessageTest, FindNextOverflow) {
174 IPC::Message message;
175 EXPECT_TRUE(message.WriteString("Data"));
176 EXPECT_TRUE(message.WriteInt(777));
177
178 const char* data_start = reinterpret_cast<const char*>(message.data());
179 const char* data_end = data_start + message.size();
180
181 IPC::Message::NextMessageInfo next;
182
183 // Payload size is negative (defeats 'start + size > end' check)
184 message.header()->payload_size = static_cast<uint32_t>(-1);
185 IPC::Message::FindNext(data_start, data_end, &next);
186 EXPECT_FALSE(next.message_found);
187 #if USE_ATTACHMENT_BROKER
188 EXPECT_EQ(next.message_size, 0u);
189 #else
190 if (sizeof(size_t) > sizeof(uint32_t)) {
191 // No overflow, just insane message size
192 EXPECT_EQ(next.message_size,
193 message.header()->payload_size + sizeof(IPC::Message::Header));
194 } else {
195 // Actual overflow, reported as max size_t
196 EXPECT_EQ(next.message_size, std::numeric_limits<size_t>::max());
197 }
198 #endif
199
200 // Payload size is max positive integer (defeats size < 0 check, while
201 // still potentially causing overflow down the road).
202 message.header()->payload_size = std::numeric_limits<int32_t>::max();
203 IPC::Message::FindNext(data_start, data_end, &next);
204 EXPECT_FALSE(next.message_found);
205 #if USE_ATTACHMENT_BROKER
206 EXPECT_EQ(next.message_size, 0u);
207 #else
208 EXPECT_EQ(next.message_size,
209 message.header()->payload_size + sizeof(IPC::Message::Header));
210 #endif
211 }
212
213 namespace {
214
118 class IPCMessageParameterTest : public testing::Test { 215 class IPCMessageParameterTest : public testing::Test {
119 public: 216 public:
120 IPCMessageParameterTest() : extra_param_("extra_param"), called_(false) {} 217 IPCMessageParameterTest() : extra_param_("extra_param"), called_(false) {}
121 218
122 bool OnMessageReceived(const IPC::Message& message) { 219 bool OnMessageReceived(const IPC::Message& message) {
123 bool handled = true; 220 bool handled = true;
124 IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(IPCMessageParameterTest, message, 221 IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(IPCMessageParameterTest, message,
125 &extra_param_) 222 &extra_param_)
126 IPC_MESSAGE_HANDLER(TestMsgClassEmpty, OnEmpty) 223 IPC_MESSAGE_HANDLER(TestMsgClassEmpty, OnEmpty)
127 IPC_MESSAGE_HANDLER(TestMsgClassI, OnInt) 224 IPC_MESSAGE_HANDLER(TestMsgClassI, OnInt)
(...skipping 25 matching lines...) Expand all
153 250
154 bool Send(IPC::Message* reply) { 251 bool Send(IPC::Message* reply) {
155 delete reply; 252 delete reply;
156 return true; 253 return true;
157 }*/ 254 }*/
158 255
159 std::string extra_param_; 256 std::string extra_param_;
160 bool called_; 257 bool called_;
161 }; 258 };
162 259
260 } // namespace
261
163 TEST_F(IPCMessageParameterTest, EmptyDispatcherWithParam) { 262 TEST_F(IPCMessageParameterTest, EmptyDispatcherWithParam) {
164 TestMsgClassEmpty message; 263 TestMsgClassEmpty message;
165 EXPECT_TRUE(OnMessageReceived(message)); 264 EXPECT_TRUE(OnMessageReceived(message));
166 EXPECT_TRUE(called_); 265 EXPECT_TRUE(called_);
167 } 266 }
168 267
169 #if defined(OS_ANDROID) 268 #if defined(OS_ANDROID)
170 #define MAYBE_OneIntegerWithParam DISABLED_OneIntegerWithParam 269 #define MAYBE_OneIntegerWithParam DISABLED_OneIntegerWithParam
171 #else 270 #else
172 #define MAYBE_OneIntegerWithParam OneIntegerWithParam 271 #define MAYBE_OneIntegerWithParam OneIntegerWithParam
173 #endif 272 #endif
174 TEST_F(IPCMessageParameterTest, MAYBE_OneIntegerWithParam) { 273 TEST_F(IPCMessageParameterTest, MAYBE_OneIntegerWithParam) {
175 TestMsgClassI message(42); 274 TestMsgClassI message(42);
176 EXPECT_TRUE(OnMessageReceived(message)); 275 EXPECT_TRUE(OnMessageReceived(message));
177 EXPECT_TRUE(called_); 276 EXPECT_TRUE(called_);
178 } 277 }
179 278
180 /* TODO: handle sync IPCs 279 /* TODO: handle sync IPCs
181 TEST_F(IPCMessageParameterTest, Sync) { 280 TEST_F(IPCMessageParameterTest, Sync) {
182 std::string output; 281 std::string output;
183 TestMsgClassIS message(42, &output); 282 TestMsgClassIS message(42, &output);
184 EXPECT_TRUE(OnMessageReceived(message)); 283 EXPECT_TRUE(OnMessageReceived(message));
185 EXPECT_TRUE(called_); 284 EXPECT_TRUE(called_);
186 EXPECT_EQ(output, std::string("out")); 285 EXPECT_EQ(output, std::string("out"));
187 }*/ 286 }*/
188 287
189 } // namespace 288 } // namespace IPC
OLDNEW
« ipc/ipc_channel_reader.h ('K') | « ipc/ipc_message.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698