diff --git a/conformance/failure_list_python.txt b/conformance/failure_list_python.txt index d3d04c3658..31b122ca08 100644 --- a/conformance/failure_list_python.txt +++ b/conformance/failure_list_python.txt @@ -35,6 +35,3 @@ Recommended.Proto3.ProtobufInput.RejectInvalidUtf8.String.Singular # Recommended.Proto2.ProtobufInput.RejectInvalidUtf8.String.Oneof # Should have failed to parse, but didn't. # Recommended.Proto2.ProtobufInput.RejectInvalidUtf8.String.Repeated # Should have failed to parse, but didn't. # Recommended.Proto2.ProtobufInput.RejectInvalidUtf8.String.Singular # Should have failed to parse, but didn't. -Recommended.Proto2.ProtobufInput.ValidMessageSetEncoding.DuplicateDifferentTypeId.ProtobufOutput # Output was not equivalent to reference message -Recommended.Proto2.ProtobufInput.ValidMessageSetEncoding.DuplicateValue.ProtobufOutput # Output was not equivalent to reference message -Recommended.Proto2.ProtobufInput.ValidMessageSetEncoding.DuplicateValueOutOfOrder.ProtobufOutput # Output was not equivalent to reference message diff --git a/python/google/protobuf/internal/decoder.py b/python/google/protobuf/internal/decoder.py index ae9b1d7d85..b6609ef937 100755 --- a/python/google/protobuf/internal/decoder.py +++ b/python/google/protobuf/internal/decoder.py @@ -902,10 +902,15 @@ def MessageSetItemDecoder(descriptor): while 1: tag_bytes, pos = local_ReadTag(buffer, pos) if tag_bytes == type_id_tag_bytes: - type_id, pos = local_DecodeVarint(buffer, pos) + temp_type_id, pos = local_DecodeVarint(buffer, pos) + if type_id == -1: + type_id = temp_type_id elif tag_bytes == message_tag_bytes: - size, message_start = local_DecodeVarint(buffer, pos) - pos = message_end = message_start + size + size, start = local_DecodeVarint(buffer, pos) + if message_start == -1: + message_start = start + message_end = start + size + pos = start + size elif tag_bytes == item_end_tag_bytes: break else: @@ -967,15 +972,21 @@ def UnknownMessageSetItemDecoder(): def DecodeUnknownItem(buffer): pos = 0 end = len(buffer) + type_id = -1 message_start = -1 message_end = -1 while 1: tag_bytes, pos = ReadTag(buffer, pos) if tag_bytes == type_id_tag_bytes: - type_id, pos = _DecodeVarint(buffer, pos) + temp_type_id, pos = _DecodeVarint(buffer, pos) + if type_id == -1: + type_id = temp_type_id elif tag_bytes == message_tag_bytes: - size, message_start = _DecodeVarint(buffer, pos) - pos = message_end = message_start + size + size, start = _DecodeVarint(buffer, pos) + if message_start == -1: + message_start = start + message_end = start + size + pos = start + size elif tag_bytes == item_end_tag_bytes: break else: