@@ -32,11 +32,12 @@ namespace
3232 BITS32 = 5 ,
3333 };
3434
35- // The following condition must always be true:
36- // any_cursor_position < min(END_OF_VARINT, END_OF_GROUP)
37- // This inequation helps to check conditions in SimpleReader.
38- constexpr UInt64 END_OF_VARINT = static_cast <UInt64>(-1 );
39- constexpr UInt64 END_OF_GROUP = static_cast <UInt64>(-2 );
35+ // The following conditions must always be true:
36+ // any_cursor_position > END_OF_VARINT
37+ // any_cursor_position > END_OF_GROUP
38+ // Those inequations helps checking conditions in ProtobufReader::SimpleReader.
39+ constexpr Int64 END_OF_VARINT = -1 ;
40+ constexpr Int64 END_OF_GROUP = -2 ;
4041
4142 Int64 decodeZigZag (UInt64 n) { return static_cast <Int64>((n >> 1 ) ^ (~(n & 1 ) + 1 )); }
4243
@@ -77,7 +78,7 @@ void ProtobufReader::SimpleReader::endMessage(bool ignore_errors)
7778 if (!current_message_level)
7879 return ;
7980
80- UInt64 root_message_end = (current_message_level == 1 ) ? current_message_end : parent_message_ends.front ();
81+ Int64 root_message_end = (current_message_level == 1 ) ? current_message_end : parent_message_ends.front ();
8182 if (cursor != root_message_end)
8283 {
8384 if (cursor < root_message_end)
@@ -95,6 +96,9 @@ void ProtobufReader::SimpleReader::endMessage(bool ignore_errors)
9596void ProtobufReader::SimpleReader::startNestedMessage ()
9697{
9798 assert (current_message_level >= 1 );
99+ if ((cursor > field_end) && (field_end != END_OF_GROUP))
100+ throwUnknownFormat ();
101+
98102 // Start reading a nested message which is located inside a length-delimited field
99103 // of another message.
100104 parent_message_ends.emplace_back (current_message_end);
@@ -146,7 +150,7 @@ bool ProtobufReader::SimpleReader::readFieldNumber(UInt32 & field_number)
146150 throwUnknownFormat ();
147151 }
148152
149- if (cursor >= current_message_end)
153+ if (( cursor >= current_message_end) && (current_message_end != END_OF_GROUP) )
150154 return false ;
151155
152156 UInt64 varint = readVarint ();
@@ -196,11 +200,17 @@ bool ProtobufReader::SimpleReader::readFieldNumber(UInt32 & field_number)
196200
197201bool ProtobufReader::SimpleReader::readUInt (UInt64 & value)
198202{
203+ if (field_end == END_OF_VARINT)
204+ {
205+ value = readVarint ();
206+ field_end = cursor;
207+ return true ;
208+ }
209+
199210 if (unlikely (cursor >= field_end))
200211 return false ;
212+
201213 value = readVarint ();
202- if (field_end == END_OF_VARINT)
203- field_end = cursor;
204214 return true ;
205215}
206216
@@ -227,6 +237,7 @@ bool ProtobufReader::SimpleReader::readFixed(T & value)
227237{
228238 if (unlikely (cursor >= field_end))
229239 return false ;
240+
230241 readBinary (&value, sizeof (T));
231242 return true ;
232243}
0 commit comments