|
@@ -160,8 +160,11 @@ namespace Google.Protobuf
|
|
|
|
|
|
internal static uint? ReadUInt32Wrapper(ref ReadOnlySpan<byte> buffer, ref ParserInternalState state)
|
|
|
{
|
|
|
- // length:1 + tag:1 + value:5(varint32-max) = 7 bytes
|
|
|
- if (state.bufferPos + 7 <= state.bufferSize)
|
|
|
+ // field=1, type=varint = tag of 8
|
|
|
+ const int expectedTag = 8;
|
|
|
+ // length:1 + tag:1 + value:10(varint64-max) = 12 bytes
|
|
|
+ // Value can be 64 bits for negative integers
|
|
|
+ if (state.bufferPos + 12 <= state.bufferSize)
|
|
|
{
|
|
|
// The entire wrapper message is already contained in `buffer`.
|
|
|
int pos0 = state.bufferPos;
|
|
@@ -177,8 +180,7 @@ namespace Google.Protobuf
|
|
|
return ReadUInt32WrapperSlow(ref buffer, ref state);
|
|
|
}
|
|
|
int finalBufferPos = state.bufferPos + length;
|
|
|
- // field=1, type=varint = tag of 8
|
|
|
- if (buffer[state.bufferPos++] != 8)
|
|
|
+ if (buffer[state.bufferPos++] != expectedTag)
|
|
|
{
|
|
|
state.bufferPos = pos0;
|
|
|
return ReadUInt32WrapperSlow(ref buffer, ref state);
|