Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 <string> | 5 #include <string> |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/pickle.h" | 9 #include "base/pickle.h" |
| 10 #include "base/strings/string16.h" | 10 #include "base/strings/string16.h" |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 226 | 226 |
| 227 TEST(PickleTest, BadLenStr16) { | 227 TEST(PickleTest, BadLenStr16) { |
| 228 Pickle pickle; | 228 Pickle pickle; |
| 229 EXPECT_TRUE(pickle.WriteInt(-1)); | 229 EXPECT_TRUE(pickle.WriteInt(-1)); |
| 230 | 230 |
| 231 PickleIterator iter(pickle); | 231 PickleIterator iter(pickle); |
| 232 string16 outstr; | 232 string16 outstr; |
| 233 EXPECT_FALSE(iter.ReadString16(&outstr)); | 233 EXPECT_FALSE(iter.ReadString16(&outstr)); |
| 234 } | 234 } |
| 235 | 235 |
| 236 TEST(PickleTest, PeekNext) { | |
| 237 struct CustomHeader : base::Pickle::Header { | |
| 238 int cookies[10]; | |
| 239 }; | |
| 240 | |
| 241 Pickle pickle(sizeof(CustomHeader)); | |
| 242 | |
| 243 EXPECT_TRUE(pickle.WriteString("Goooooooooooogle")); | |
| 244 | |
| 245 const char* pickle_data = static_cast<const char*>(pickle.data()); | |
| 246 | |
| 247 size_t pickle_size; | |
| 248 | |
| 249 // Data range doesn't contain header | |
| 250 EXPECT_FALSE(Pickle::PeekNext( | |
| 251 sizeof(CustomHeader), | |
| 252 pickle_data, | |
| 253 pickle_data + sizeof(CustomHeader) - 1, | |
| 254 &pickle_size)); | |
| 255 | |
| 256 // Data range contains header | |
| 257 EXPECT_TRUE(Pickle::PeekNext( | |
| 258 sizeof(CustomHeader), | |
| 259 pickle_data, | |
| 260 pickle_data + sizeof(CustomHeader), | |
| 261 &pickle_size)); | |
| 262 EXPECT_EQ(pickle_size, pickle.size()); | |
| 263 | |
| 264 // Data range contains header and some other data | |
| 265 EXPECT_TRUE(Pickle::PeekNext( | |
| 266 sizeof(CustomHeader), | |
| 267 pickle_data, | |
| 268 pickle_data + sizeof(CustomHeader) + 1, | |
| 269 &pickle_size)); | |
| 270 EXPECT_EQ(pickle_size, pickle.size()); | |
| 271 | |
| 272 // Data range contains full pickle | |
| 273 EXPECT_TRUE(Pickle::PeekNext( | |
| 274 sizeof(CustomHeader), | |
| 275 pickle_data, | |
| 276 pickle_data + pickle.size(), | |
| 277 &pickle_size)); | |
| 278 EXPECT_EQ(pickle_size, pickle.size()); | |
| 279 } | |
| 280 | |
| 281 TEST(PickleTest, PeekNextOverflow) { | |
| 282 struct CustomHeader : base::Pickle::Header { | |
| 283 int cookies[10]; | |
| 284 }; | |
| 285 | |
| 286 CustomHeader header; | |
| 287 | |
| 288 // Check if we can wrap around at all | |
| 289 if (sizeof(size_t) > sizeof(header.payload_size)) | |
| 290 return; | |
| 291 | |
| 292 const char* pickle_data = reinterpret_cast<const char*>(&header); | |
| 293 | |
| 294 size_t pickle_size; | |
| 295 | |
| 296 // Wrapping around is detected and reported as maximum size_t value | |
| 297 header.payload_size = static_cast<uint32_t>( | |
| 298 1 - static_cast<int32_t>(sizeof(CustomHeader))); | |
| 299 EXPECT_TRUE(Pickle::PeekNext( | |
| 300 sizeof(CustomHeader), | |
| 301 pickle_data, | |
| 302 pickle_data + sizeof(CustomHeader), | |
| 303 &pickle_size)); | |
| 304 EXPECT_EQ(pickle_size, std::numeric_limits<size_t>::max()); | |
| 305 | |
| 306 // Ridiculous pickle sizes are fine (callers are supposed to | |
| 307 // verify them) | |
| 308 header.payload_size = | |
| 309 std::numeric_limits<size_t>::max() / 2 - sizeof(CustomHeader); | |
| 310 EXPECT_TRUE(Pickle::PeekNext( | |
| 311 sizeof(CustomHeader), | |
| 312 pickle_data, | |
| 313 pickle_data + sizeof(CustomHeader), | |
| 314 &pickle_size)); | |
| 315 EXPECT_EQ(pickle_size, std::numeric_limits<size_t>::max() / 2); | |
| 316 } | |
| 317 | |
| 236 TEST(PickleTest, FindNext) { | 318 TEST(PickleTest, FindNext) { |
| 237 Pickle pickle; | 319 Pickle pickle; |
| 238 EXPECT_TRUE(pickle.WriteInt(1)); | 320 EXPECT_TRUE(pickle.WriteInt(1)); |
| 239 EXPECT_TRUE(pickle.WriteString("Domo")); | 321 EXPECT_TRUE(pickle.WriteString("Domo")); |
| 240 | 322 |
| 241 const char* start = reinterpret_cast<const char*>(pickle.data()); | 323 const char* start = reinterpret_cast<const char*>(pickle.data()); |
| 242 const char* end = start + pickle.size(); | 324 const char* end = start + pickle.size(); |
| 243 | 325 |
| 244 EXPECT_TRUE(end == Pickle::FindNext(pickle.header_size_, start, end)); | 326 EXPECT_TRUE(end == Pickle::FindNext(pickle.header_size_, start, end)); |
| 245 EXPECT_TRUE(NULL == Pickle::FindNext(pickle.header_size_, start, end - 1)); | 327 EXPECT_TRUE(NULL == Pickle::FindNext(pickle.header_size_, start, end - 1)); |
| 246 EXPECT_TRUE(end == Pickle::FindNext(pickle.header_size_, start, end + 1)); | 328 EXPECT_TRUE(end == Pickle::FindNext(pickle.header_size_, start, end + 1)); |
| 247 } | 329 } |
| 248 | 330 |
| 249 TEST(PickleTest, FindNextWithIncompleteHeader) { | 331 TEST(PickleTest, FindNextWithIncompleteHeader) { |
| 250 size_t header_size = sizeof(Pickle::Header); | 332 size_t header_size = sizeof(Pickle::Header); |
| 251 scoped_ptr<char[]> buffer(new char[header_size - 1]); | 333 scoped_ptr<char[]> buffer(new char[header_size - 1]); |
| 252 memset(buffer.get(), 0x1, header_size - 1); | 334 memset(buffer.get(), 0x1, header_size - 1); |
| 253 | 335 |
| 254 const char* start = buffer.get(); | 336 const char* start = buffer.get(); |
| 255 const char* end = start + header_size - 1; | 337 const char* end = start + header_size - 1; |
| 256 | 338 |
| 257 EXPECT_TRUE(NULL == Pickle::FindNext(header_size, start, end)); | 339 EXPECT_TRUE(NULL == Pickle::FindNext(header_size, start, end)); |
| 258 } | 340 } |
| 259 | 341 |
| 260 #if defined(COMPILER_MSVC) | 342 #if defined(COMPILER_MSVC) |
| 261 #pragma warning(push) | 343 #pragma warning(push) |
| 262 #pragma warning(disable: 4146) | 344 #pragma warning(disable: 4146) |
|
Maria
2015/09/25 22:23:00
Looks like you might need to do something similar
| |
| 263 #endif | 345 #endif |
| 264 TEST(PickleTest, FindNextOverflow) { | 346 TEST(PickleTest, FindNextOverflow) { |
| 265 size_t header_size = sizeof(Pickle::Header); | 347 size_t header_size = sizeof(Pickle::Header); |
| 266 size_t header_size2 = 2 * header_size; | 348 size_t header_size2 = 2 * header_size; |
| 267 size_t payload_received = 100; | 349 size_t payload_received = 100; |
| 268 scoped_ptr<char[]> buffer(new char[header_size2 + payload_received]); | 350 scoped_ptr<char[]> buffer(new char[header_size2 + payload_received]); |
| 269 const char* start = buffer.get(); | 351 const char* start = buffer.get(); |
| 270 Pickle::Header* header = reinterpret_cast<Pickle::Header*>(buffer.get()); | 352 Pickle::Header* header = reinterpret_cast<Pickle::Header*>(buffer.get()); |
| 271 const char* end = start + header_size2 + payload_received; | 353 const char* end = start + header_size2 + payload_received; |
| 272 // It is impossible to construct an overflow test otherwise. | 354 // It is impossible to construct an overflow test otherwise. |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 436 pickle.WriteBool(true); | 518 pickle.WriteBool(true); |
| 437 | 519 |
| 438 // Make a deep copy. | 520 // Make a deep copy. |
| 439 Pickle pickle2(pickle); | 521 Pickle pickle2(pickle); |
| 440 | 522 |
| 441 // Check that there isn't any extraneous capacity. | 523 // Check that there isn't any extraneous capacity. |
| 442 EXPECT_EQ(pickle.capacity_after_header(), pickle2.capacity_after_header()); | 524 EXPECT_EQ(pickle.capacity_after_header(), pickle2.capacity_after_header()); |
| 443 } | 525 } |
| 444 | 526 |
| 445 } // namespace base | 527 } // namespace base |
| OLD | NEW |