Index: base/pickle_unittest.cc |
diff --git a/base/pickle_unittest.cc b/base/pickle_unittest.cc |
index 6f9fcc7f62ad898bf4b7de91aee43faafddbda6d..f58e7eceaf45c9bee7c1729f0913b197c0fa3c47 100644 |
--- a/base/pickle_unittest.cc |
+++ b/base/pickle_unittest.cc |
@@ -233,6 +233,88 @@ TEST(PickleTest, BadLenStr16) { |
EXPECT_FALSE(iter.ReadString16(&outstr)); |
} |
+TEST(PickleTest, PeekNext) { |
+ struct CustomHeader : base::Pickle::Header { |
+ int cookies[10]; |
+ }; |
+ |
+ Pickle pickle(sizeof(CustomHeader)); |
+ |
+ EXPECT_TRUE(pickle.WriteString("Goooooooooooogle")); |
+ |
+ const char* pickle_data = static_cast<const char*>(pickle.data()); |
+ |
+ size_t pickle_size; |
+ |
+ // Data range doesn't contain header |
+ EXPECT_FALSE(Pickle::PeekNext( |
+ sizeof(CustomHeader), |
+ pickle_data, |
+ pickle_data + sizeof(CustomHeader) - 1, |
+ &pickle_size)); |
+ |
+ // Data range contains header |
+ EXPECT_TRUE(Pickle::PeekNext( |
+ sizeof(CustomHeader), |
+ pickle_data, |
+ pickle_data + sizeof(CustomHeader), |
+ &pickle_size)); |
+ EXPECT_EQ(pickle_size, pickle.size()); |
+ |
+ // Data range contains header and some other data |
+ EXPECT_TRUE(Pickle::PeekNext( |
+ sizeof(CustomHeader), |
+ pickle_data, |
+ pickle_data + sizeof(CustomHeader) + 1, |
+ &pickle_size)); |
+ EXPECT_EQ(pickle_size, pickle.size()); |
+ |
+ // Data range contains full pickle |
+ EXPECT_TRUE(Pickle::PeekNext( |
+ sizeof(CustomHeader), |
+ pickle_data, |
+ pickle_data + pickle.size(), |
+ &pickle_size)); |
+ EXPECT_EQ(pickle_size, pickle.size()); |
+} |
+ |
+TEST(PickleTest, PeekNextOverflow) { |
+ struct CustomHeader : base::Pickle::Header { |
+ int cookies[10]; |
+ }; |
+ |
+ CustomHeader header; |
+ |
+ // Check if we can wrap around at all |
+ if (sizeof(size_t) > sizeof(header.payload_size)) |
+ return; |
+ |
+ const char* pickle_data = reinterpret_cast<const char*>(&header); |
+ |
+ size_t pickle_size; |
+ |
+ // Wrapping around is detected and reported as maximum size_t value |
+ header.payload_size = static_cast<uint32_t>( |
+ 1 - static_cast<int32_t>(sizeof(CustomHeader))); |
+ EXPECT_TRUE(Pickle::PeekNext( |
+ sizeof(CustomHeader), |
+ pickle_data, |
+ pickle_data + sizeof(CustomHeader), |
+ &pickle_size)); |
+ EXPECT_EQ(pickle_size, std::numeric_limits<size_t>::max()); |
+ |
+ // Ridiculous pickle sizes are fine (callers are supposed to |
+ // verify them) |
+ header.payload_size = |
+ std::numeric_limits<uint32_t>::max() / 2 - sizeof(CustomHeader); |
+ EXPECT_TRUE(Pickle::PeekNext( |
+ sizeof(CustomHeader), |
+ pickle_data, |
+ pickle_data + sizeof(CustomHeader), |
+ &pickle_size)); |
+ EXPECT_EQ(pickle_size, std::numeric_limits<uint32_t>::max() / 2); |
+} |
+ |
TEST(PickleTest, FindNext) { |
Pickle pickle; |
EXPECT_TRUE(pickle.WriteInt(1)); |