From 15bf55e2251df4ad798a4f88b8514899c26e3dc3 Mon Sep 17 00:00:00 2001 From: Jon Skeet Date: Tue, 4 Aug 2015 12:38:53 +0100 Subject: Validate that after reading a message, we've consumed as many bytes as we expected to. We should now have no conformance failures. --- csharp/src/Google.Protobuf/CodedInputStream.cs | 29 ++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'csharp/src/Google.Protobuf/CodedInputStream.cs') diff --git a/csharp/src/Google.Protobuf/CodedInputStream.cs b/csharp/src/Google.Protobuf/CodedInputStream.cs index fee31e3b..5da03b5c 100644 --- a/csharp/src/Google.Protobuf/CodedInputStream.cs +++ b/csharp/src/Google.Protobuf/CodedInputStream.cs @@ -54,13 +54,37 @@ namespace Google.Protobuf /// public sealed class CodedInputStream { + /// + /// Buffer of data read from the stream or provided at construction time. + /// private readonly byte[] buffer; + + /// + /// The number of valid bytes in the buffer. + /// private int bufferSize; + private int bufferSizeAfterLimit = 0; + /// + /// The position within the current buffer (i.e. the next byte to read) + /// private int bufferPos = 0; + + /// + /// The stream to read further input from, or null if the byte array buffer was provided + /// directly on construction, with no further data available. + /// private readonly Stream input; + + /// + /// The last tag we read. 0 indicates we've read to the end of the stream + /// (or haven't read anything yet). + /// private uint lastTag = 0; + /// + /// The next tag, used to store the value read by PeekTag. + /// private uint nextTag = 0; private bool hasNextTag = false; @@ -456,6 +480,11 @@ namespace Google.Protobuf ++recursionDepth; builder.MergeFrom(this); CheckLastTagWas(0); + // Check that we've read exactly as much data as expected. + if (!ReachedLimit) + { + throw InvalidProtocolBufferException.TruncatedMessage(); + } --recursionDepth; PopLimit(oldLimit); } -- cgit v1.2.3