-
-
Notifications
You must be signed in to change notification settings - Fork 144
Description
While deserializing a protobuf message, BeanDeserializer
calls ProtobufParser.nextFieldName()
in a loop.
Following piece of code looks for a field by id, which should be equal to "index" from message schema:
int tag = _decodeVInt();
// inlined _handleRootKey()
int wireType = (tag & 0x7);
int id = (tag >> 3);
ProtobufField f = _findField(id);
if (f == null) {
if (_skipUnknownField(id, wireType) != JsonToken.FIELD_NAME) {
return null;
}
here, if _findField(id)
returns null
(in case message contains unknown field), _skipUnknownField
skips the whole field in the stream.
Problem is that after unknown field is skipped, local variables tag, wireType, id
are still contain info about skipped field and used directly afterwards, while current field is already next one.
Called function _skipUnknownField(id, wireType)
already reads next fields tag and sets class global variable _currentField
to next field, so what has to be done in caller's code is to update local variables to next valid field:
ProtobufField f = _findField(id);
if (f == null) {
if (_skipUnknownField(id, wireType) != JsonToken.FIELD_NAME) {
return null;
}
// sub-optimal as skip method already set it, but:
// update local variables to next field after unknown field is skipped
tag = _currentField.typedTag;
wireType = _currentField.wireType;
id = _currentField.id;
}