@@ -835,7 +835,7 @@ def MessageSetItemDecoder(descriptor):
835835 local_ReadTag = ReadTag
836836 local_DecodeVarint = _DecodeVarint
837837
838- def DecodeItem (buffer , pos , end , message , field_dict ):
838+ def DecodeItem (buffer , pos , end , message , field_dict , current_depth = 0 ):
839839 """Decode serialized message set to its value and new position.
840840
841841 Args:
@@ -888,10 +888,19 @@ def DecodeItem(buffer, pos, end, message, field_dict):
888888 message_factory .GetMessageClass (message_type )
889889 value = field_dict .setdefault (
890890 extension , message_type ._concrete_class ())
891- if value ._InternalParse (buffer , message_start ,message_end ) != message_end :
891+ current_depth += 1
892+ if current_depth > _recursion_limit :
893+ raise _DecodeError ('Error parsing message: too many levels of nesting.' )
894+ if (
895+ value ._InternalParse (
896+ buffer , message_start , message_end , current_depth
897+ )
898+ != message_end
899+ ):
892900 # The only reason _InternalParse would return early is if it encountered
893901 # an end-group tag.
894902 raise _DecodeError ('Unexpected end-group tag.' )
903+ current_depth -= 1
895904 else :
896905 if not message ._unknown_fields :
897906 message ._unknown_fields = []
@@ -957,7 +966,6 @@ def MapDecoder(field_descriptor, new_default, is_message_map):
957966 message_type = field_descriptor .message_type
958967
959968 def DecodeMap (buffer , pos , end , message , field_dict , current_depth = 0 ):
960- del current_depth # Unused.
961969 submsg = message_type ._concrete_class ()
962970 value = field_dict .get (key )
963971 if value is None :
@@ -970,10 +978,14 @@ def DecodeMap(buffer, pos, end, message, field_dict, current_depth=0):
970978 raise _DecodeError ('Truncated message.' )
971979 # Read sub-message.
972980 submsg .Clear ()
973- if submsg ._InternalParse (buffer , pos , new_pos ) != new_pos :
981+ current_depth += 1
982+ if current_depth > _recursion_limit :
983+ raise _DecodeError ('Error parsing message: too many levels of nesting.' )
984+ if submsg ._InternalParse (buffer , pos , new_pos , current_depth ) != new_pos :
974985 # The only reason _InternalParse would return early is if it
975986 # encountered an end-group tag.
976987 raise _DecodeError ('Unexpected end-group tag.' )
988+ current_depth -= 1
977989
978990 if is_message_map :
979991 value [submsg .key ].CopyFrom (submsg .value )
0 commit comments