| Index: third_party/protobuf/src/google/protobuf/io/coded_stream_unittest.cc
|
| diff --git a/third_party/protobuf/src/google/protobuf/io/coded_stream_unittest.cc b/third_party/protobuf/src/google/protobuf/io/coded_stream_unittest.cc
|
| index a8108e4572bc5111648e12e8b9d2fe1cfe4d2fba..31574d5be35b3ca6c81fc25ceff30b9ffbddddbe 100644
|
| --- a/third_party/protobuf/src/google/protobuf/io/coded_stream_unittest.cc
|
| +++ b/third_party/protobuf/src/google/protobuf/io/coded_stream_unittest.cc
|
| @@ -58,6 +58,7 @@
|
| #define ULL(x) GOOGLE_ULONGLONG(x)
|
|
|
| namespace google {
|
| +
|
| namespace protobuf {
|
| namespace io {
|
| namespace {
|
| @@ -134,7 +135,7 @@ class CodedStreamTest : public testing::Test {
|
| // for further information.
|
| static void SetupTotalBytesLimitWarningTest(
|
| int total_bytes_limit, int warning_threshold,
|
| - vector<string>* out_errors, vector<string>* out_warnings);
|
| + std::vector<string>* out_errors, std::vector<string>* out_warnings);
|
|
|
| // Buffer used during most of the tests. This assumes tests run sequentially.
|
| static const int kBufferSize = 1024 * 64;
|
| @@ -244,7 +245,7 @@ TEST_F(CodedStreamTest, EmptyInputBeforeEos) {
|
| int count_;
|
| } in;
|
| CodedInputStream input(&in);
|
| - input.ReadTag();
|
| + input.ReadTagNoLastTag();
|
| EXPECT_TRUE(input.ConsumedEntireMessage());
|
| }
|
|
|
| @@ -445,6 +446,21 @@ TEST_2D(CodedStreamTest, ReadVarint32Error, kVarintErrorCases, kBlockSizes) {
|
| EXPECT_EQ(kVarintErrorCases_case.can_parse, coded_input.ReadVarint32(&value));
|
| }
|
|
|
| +TEST_2D(CodedStreamTest, ReadVarint32Error_LeavesValueInInitializedState,
|
| + kVarintErrorCases, kBlockSizes) {
|
| + memcpy(buffer_, kVarintErrorCases_case.bytes, kVarintErrorCases_case.size);
|
| + ArrayInputStream input(buffer_, kVarintErrorCases_case.size,
|
| + kBlockSizes_case);
|
| + CodedInputStream coded_input(&input);
|
| +
|
| + uint32 value = 0;
|
| + EXPECT_EQ(kVarintErrorCases_case.can_parse, coded_input.ReadVarint32(&value));
|
| + // While the specific value following a failure is not critical, we do want to
|
| + // ensure that it doesn't get set to an uninitialized value. (This check fails
|
| + // in MSAN mode if value has been set to an uninitialized value.)
|
| + EXPECT_EQ(value, value);
|
| +}
|
| +
|
| TEST_2D(CodedStreamTest, ReadVarint64Error, kVarintErrorCases, kBlockSizes) {
|
| memcpy(buffer_, kVarintErrorCases_case.bytes, kVarintErrorCases_case.size);
|
| ArrayInputStream input(buffer_, kVarintErrorCases_case.size,
|
| @@ -455,6 +471,21 @@ TEST_2D(CodedStreamTest, ReadVarint64Error, kVarintErrorCases, kBlockSizes) {
|
| EXPECT_EQ(kVarintErrorCases_case.can_parse, coded_input.ReadVarint64(&value));
|
| }
|
|
|
| +TEST_2D(CodedStreamTest, ReadVarint64Error_LeavesValueInInitializedState,
|
| + kVarintErrorCases, kBlockSizes) {
|
| + memcpy(buffer_, kVarintErrorCases_case.bytes, kVarintErrorCases_case.size);
|
| + ArrayInputStream input(buffer_, kVarintErrorCases_case.size,
|
| + kBlockSizes_case);
|
| + CodedInputStream coded_input(&input);
|
| +
|
| + uint64 value = 0;
|
| + EXPECT_EQ(kVarintErrorCases_case.can_parse, coded_input.ReadVarint64(&value));
|
| + // While the specific value following a failure is not critical, we do want to
|
| + // ensure that it doesn't get set to an uninitialized value. (This check fails
|
| + // in MSAN mode if value has been set to an uninitialized value.)
|
| + EXPECT_EQ(value, value);
|
| +}
|
| +
|
| // -------------------------------------------------------------------
|
| // VarintSize
|
|
|
| @@ -494,6 +525,28 @@ TEST_1D(CodedStreamTest, VarintSize64, kVarintSizeCases) {
|
| CodedOutputStream::VarintSize64(kVarintSizeCases_case.value));
|
| }
|
|
|
| +TEST_F(CodedStreamTest, VarintSize32PowersOfTwo) {
|
| + int expected = 1;
|
| + for (int i = 1; i < 32; i++) {
|
| + if (i % 7 == 0) {
|
| + expected += 1;
|
| + }
|
| + EXPECT_EQ(expected,
|
| + CodedOutputStream::VarintSize32(static_cast<uint32>(0x1u << i)));
|
| + }
|
| +}
|
| +
|
| +TEST_F(CodedStreamTest, VarintSize64PowersOfTwo) {
|
| + int expected = 1;
|
| + for (int i = 1; i < 64; i++) {
|
| + if (i % 7 == 0) {
|
| + expected += 1;
|
| + }
|
| + EXPECT_EQ(expected, CodedOutputStream::VarintSize64(
|
| + static_cast<uint64>(0x1ull << i)));
|
| + }
|
| +}
|
| +
|
| // -------------------------------------------------------------------
|
| // Fixed-size int tests
|
|
|
| @@ -1176,7 +1229,7 @@ TEST_F(CodedStreamTest, TotalBytesLimit) {
|
| EXPECT_TRUE(coded_input.ReadString(&str, 16));
|
| EXPECT_EQ(0, coded_input.BytesUntilTotalBytesLimit());
|
|
|
| - vector<string> errors;
|
| + std::vector<string> errors;
|
|
|
| {
|
| ScopedMemoryLog error_log;
|
| @@ -1210,7 +1263,7 @@ TEST_F(CodedStreamTest, TotalBytesLimitNotValidMessageEnd) {
|
|
|
| // Read a tag. Should fail, but report being a valid endpoint since it's
|
| // a regular limit.
|
| - EXPECT_EQ(0, coded_input.ReadTag());
|
| + EXPECT_EQ(0, coded_input.ReadTagNoLastTag());
|
| EXPECT_TRUE(coded_input.ConsumedEntireMessage());
|
|
|
| // Pop the limit.
|
| @@ -1218,7 +1271,7 @@ TEST_F(CodedStreamTest, TotalBytesLimitNotValidMessageEnd) {
|
|
|
| // Read a tag. Should fail, and report *not* being a valid endpoint, since
|
| // this time we're hitting the total bytes limit.
|
| - EXPECT_EQ(0, coded_input.ReadTag());
|
| + EXPECT_EQ(0, coded_input.ReadTagNoLastTag());
|
| EXPECT_FALSE(coded_input.ConsumedEntireMessage());
|
| }
|
|
|
| @@ -1228,7 +1281,7 @@ TEST_F(CodedStreamTest, TotalBytesLimitNotValidMessageEnd) {
|
| // vectors.
|
| void CodedStreamTest::SetupTotalBytesLimitWarningTest(
|
| int total_bytes_limit, int warning_threshold,
|
| - vector<string>* out_errors, vector<string>* out_warnings) {
|
| + std::vector<string>* out_errors, std::vector<string>* out_warnings) {
|
| ArrayInputStream raw_input(buffer_, sizeof(buffer_), 128);
|
|
|
| ScopedMemoryLog scoped_log;
|
| @@ -1244,25 +1297,21 @@ void CodedStreamTest::SetupTotalBytesLimitWarningTest(
|
| }
|
|
|
| TEST_F(CodedStreamTest, TotalBytesLimitWarning) {
|
| - vector<string> errors;
|
| - vector<string> warnings;
|
| + std::vector<string> errors;
|
| + std::vector<string> warnings;
|
| SetupTotalBytesLimitWarningTest(10240, 1024, &errors, &warnings);
|
|
|
| EXPECT_EQ(0, errors.size());
|
|
|
| - ASSERT_EQ(2, warnings.size());
|
| - EXPECT_PRED_FORMAT2(testing::IsSubstring,
|
| - "Reading dangerously large protocol message. If the message turns out to "
|
| - "be larger than 10240 bytes, parsing will be halted for security reasons.",
|
| - warnings[0]);
|
| + EXPECT_EQ(1, warnings.size());
|
| EXPECT_PRED_FORMAT2(testing::IsSubstring,
|
| "The total number of bytes read was 2048",
|
| - warnings[1]);
|
| + warnings[0]);
|
| }
|
|
|
| TEST_F(CodedStreamTest, TotalBytesLimitWarningDisabled) {
|
| - vector<string> errors;
|
| - vector<string> warnings;
|
| + std::vector<string> errors;
|
| + std::vector<string> warnings;
|
|
|
| // Test with -1
|
| SetupTotalBytesLimitWarningTest(10240, -1, &errors, &warnings);
|
| @@ -1361,7 +1410,7 @@ TEST_F(CodedStreamTest, InputOver2G) {
|
| // input.BackUp() with the correct number of bytes on destruction.
|
| ReallyBigInputStream input;
|
|
|
| - vector<string> errors;
|
| + std::vector<string> errors;
|
|
|
| {
|
| ScopedMemoryLog error_log;
|
|
|