Add a conformance test for invalid end group tag. Java and Python/C++ are both non-conformant, since they allow these invalid payloads. PiperOrigin-RevId: 694312115
diff --git a/conformance/binary_json_conformance_suite.cc b/conformance/binary_json_conformance_suite.cc index 543919a..1399611 100644 --- a/conformance/binary_json_conformance_suite.cc +++ b/conformance/binary_json_conformance_suite.cc
@@ -1367,6 +1367,26 @@ } template <typename MessageType> +void BinaryAndJsonConformanceSuiteImpl<MessageType>::TestUnmatchedEndGroup() { + ExpectParseFailureForProto(tag(201, WireFormatLite::WIRETYPE_END_GROUP), + "UnmatchedEndGroup", REQUIRED); + ExpectParseFailureForProto(tag(1234, WireFormatLite::WIRETYPE_END_GROUP), + "UnmatchedEndGroupUnknown", REQUIRED); + ExpectParseFailureForProto(tag(1, WireFormatLite::WIRETYPE_END_GROUP), + "UnmatchedEndGroupWrongType", REQUIRED); + ExpectParseFailureForProto( + len(18, tag(1234, WireFormatLite::WIRETYPE_END_GROUP)), + "UnmatchedEndGroupNestedLen", REQUIRED); + ExpectParseFailureForProto( + group(201, tag(202, WireFormatLite::WIRETYPE_END_GROUP)), + "UnmatchedEndGroupNested", REQUIRED); + ExpectParseFailureForProto( + absl::StrCat(tag(1, WireFormatLite::WIRETYPE_END_GROUP), + len(2, "hello world")), + "UnmatchedEndGroupWithData", REQUIRED); +} + +template <typename MessageType> void BinaryAndJsonConformanceSuiteImpl<MessageType>::TestUnknownWireType() { for (uint8_t type : {0x6, 0x7}) { for (uint8_t field = 0; field < 4; ++field) { @@ -1553,7 +1573,7 @@ } TestIllegalTags(); - + TestUnmatchedEndGroup(); TestUnknownWireType(); int64_t kInt64Min = -9223372036854775808ULL;
diff --git a/conformance/binary_json_conformance_suite.h b/conformance/binary_json_conformance_suite.h index 325a76e..3166eb4 100644 --- a/conformance/binary_json_conformance_suite.h +++ b/conformance/binary_json_conformance_suite.h
@@ -143,6 +143,7 @@ ConformanceLevel level); void TestPrematureEOFForType(google::protobuf::FieldDescriptor::Type type); void TestIllegalTags(); + void TestUnmatchedEndGroup(); void TestUnknownWireType(); void TestOneofMessage(); void TestUnknownMessage();
diff --git a/conformance/failure_list_java.txt b/conformance/failure_list_java.txt index 9e2e525..f4547f9 100644 --- a/conformance/failure_list_java.txt +++ b/conformance/failure_list_java.txt
@@ -43,3 +43,7 @@ Required.*.JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotInt # Should have failed to parse, but didn't. Required.*.JsonInput.StringFieldNotAString # Should have failed to parse, but didn't. Required.*.ProtobufInput.UnknownOrdering.ProtobufOutput # Unknown field mismatch +Required.*.ProtobufInput.UnmatchedEndGroup # Should have failed to parse, but didn't. +Required.*.ProtobufInput.UnmatchedEndGroupUnknown # Should have failed to parse, but didn't. +Required.*.ProtobufInput.UnmatchedEndGroupWithData # Should have failed to parse, but didn't. +Required.*.ProtobufInput.UnmatchedEndGroupWrongType # Should have failed to parse, but didn't.
diff --git a/conformance/failure_list_java_lite.txt b/conformance/failure_list_java_lite.txt index 1494114..39a0f21 100644 --- a/conformance/failure_list_java_lite.txt +++ b/conformance/failure_list_java_lite.txt
@@ -6,3 +6,7 @@ Required.*.ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.MESSAGE # Should have failed to parse, but didn't. Required.*.ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.MESSAGE # Should have failed to parse, but didn't. +Required.*.ProtobufInput.UnmatchedEndGroup # Should have failed to parse, but didn't. +Required.*.ProtobufInput.UnmatchedEndGroupUnknown # Should have failed to parse, but didn't. +Required.*.ProtobufInput.UnmatchedEndGroupWithData # Should have failed to parse, but didn't. +Required.*.ProtobufInput.UnmatchedEndGroupWrongType # Should have failed to parse, but didn't.
diff --git a/conformance/failure_list_jruby.txt b/conformance/failure_list_jruby.txt index b02f9a5..7eced25 100644 --- a/conformance/failure_list_jruby.txt +++ b/conformance/failure_list_jruby.txt
@@ -144,3 +144,7 @@ Required.Editions_Proto3.ProtobufInput.UnknownOrdering.ProtobufOutput Required.Proto2.ProtobufInput.UnknownOrdering.ProtobufOutput Required.Proto3.ProtobufInput.UnknownOrdering.ProtobufOutput +Required.*.ProtobufInput.UnmatchedEndGroup # Should have failed to parse, but didn't. +Required.*.ProtobufInput.UnmatchedEndGroupUnknown # Should have failed to parse, but didn't. +Required.*.ProtobufInput.UnmatchedEndGroupWithData # Should have failed to parse, but didn't. +Required.*.ProtobufInput.UnmatchedEndGroupWrongType # Should have failed to parse, but didn't.
diff --git a/conformance/failure_list_python_cpp.txt b/conformance/failure_list_python_cpp.txt index 1a2cc15..0826610 100644 --- a/conformance/failure_list_python_cpp.txt +++ b/conformance/failure_list_python_cpp.txt
@@ -6,5 +6,8 @@ # # TODO: insert links to corresponding bugs tracking the issue. # Should we use GitHub issues or the Google-internal bug tracker? - Required.*.JsonInput.Int32FieldQuotedExponentialValue.* # Failed to parse input or produce output. +Required.*.ProtobufInput.UnmatchedEndGroup # Should have failed to parse, but didn't. +Required.*.ProtobufInput.UnmatchedEndGroupUnknown # Should have failed to parse, but didn't. +Required.*.ProtobufInput.UnmatchedEndGroupWithData # Should have failed to parse, but didn't. +Required.*.ProtobufInput.UnmatchedEndGroupWrongType # Should have failed to parse, but didn't.