| Index: base/pickle_unittest.cc
|
| ===================================================================
|
| --- base/pickle_unittest.cc (revision 19191)
|
| +++ base/pickle_unittest.cc (working copy)
|
| @@ -7,6 +7,7 @@
|
| #include "base/basictypes.h"
|
| #include "base/pickle.h"
|
| #include "base/scoped_ptr.h"
|
| +#include "base/string16.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace {
|
| @@ -218,3 +219,30 @@
|
| copy = copy_refs_source_buffer;
|
| ASSERT_EQ(source.size(), copy.size());
|
| }
|
| +
|
| +TEST(PickleTest, EvilLengths) {
|
| + Pickle source;
|
| + std::string str(10000, 'A');
|
| + source.WriteData(str.c_str(), 100000);
|
| + // ReadString16 used to have its read buffer length calculation wrong leading
|
| + // to out-of-bounds reading.
|
| + void* iter = NULL;
|
| + string16 str16;
|
| + EXPECT_FALSE(source.ReadString16(&iter, &str16));
|
| +
|
| + // And check we didn't break ReadString16.
|
| + str16 = (wchar_t) 'A';
|
| + Pickle str16_pickle;
|
| + str16_pickle.WriteString16(str16);
|
| + iter = NULL;
|
| + EXPECT_TRUE(str16_pickle.ReadString16(&iter, &str16));
|
| + EXPECT_EQ(1U, str16.length());
|
| +
|
| + // Check we don't fail in a length check with large WStrings.
|
| + Pickle big_len;
|
| + big_len.WriteInt(1 << 30);
|
| + iter = NULL;
|
| + std::wstring wstr;
|
| + EXPECT_FALSE(big_len.ReadWString(&iter, &wstr));
|
| +}
|
| +
|
|
|