diff --git a/src/google/protobuf/message_unittest.inc b/src/google/protobuf/message_unittest.inc index 4305f5310c..24e67b5209 100644 --- a/src/google/protobuf/message_unittest.inc +++ b/src/google/protobuf/message_unittest.inc @@ -465,6 +465,24 @@ TEST(MESSAGE_TEST_NAME, ParseFailsIfGroupFieldMalformed) { EXPECT_FALSE(parsed.ParseFromString(data)); } +TEST(MESSAGE_TEST_NAME, ParseFailsIfRepeatedGroupFieldMalformed) { + UNITTEST::TestMutualRecursionA original, parsed; + original.mutable_bb() + ->mutable_a() + ->add_subgroupr() + ->mutable_payload() + ->set_optional_int64(-1); + + std::string data; + ASSERT_TRUE(original.SerializeToString(&data)); + // Should parse correctly. + ASSERT_TRUE(parsed.ParseFromString(data)); + // Overwriting the last byte of varint (-1) to 0xFF results in malformed wire. + data[data.size() - 2] = 0xFF; + + EXPECT_FALSE(parsed.ParseFromString(data)); +} + TEST(MESSAGE_TEST_NAME, UninitializedAndMalformed) { UNITTEST::TestRequiredForeign o, p1, p2; o.mutable_optional_message()->set_a(-1); diff --git a/src/google/protobuf/unittest.proto b/src/google/protobuf/unittest.proto index 479262f612..7ebd53f9a2 100644 --- a/src/google/protobuf/unittest.proto +++ b/src/google/protobuf/unittest.proto @@ -552,6 +552,9 @@ message TestMutualRecursionA { optional SubMessage sub_message = 3; // Needed because of bug in javatest optional TestAllTypes not_in_this_scc = 4; } + repeated group SubGroupR = 5 { + optional TestAllTypes payload = 6; + } } message TestMutualRecursionB {