aboutsummaryrefslogtreecommitdiff
path: root/src/ProtocolBuffers/UnknownFieldSet.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ProtocolBuffers/UnknownFieldSet.cs')
-rw-r--r--src/ProtocolBuffers/UnknownFieldSet.cs28
1 files changed, 20 insertions, 8 deletions
diff --git a/src/ProtocolBuffers/UnknownFieldSet.cs b/src/ProtocolBuffers/UnknownFieldSet.cs
index 20a46936..ff6a1534 100644
--- a/src/ProtocolBuffers/UnknownFieldSet.cs
+++ b/src/ProtocolBuffers/UnknownFieldSet.cs
@@ -419,13 +419,19 @@ namespace Google.ProtocolBuffers
/// </summary>
public Builder MergeFrom(CodedInputStream input)
{
- while (true)
+ uint tag;
+ string name;
+ while (input.ReadTag(out tag, out name))
{
- uint tag = input.ReadTag();
- if (tag == 0 || !MergeFieldFrom(tag, input))
+ if (tag == 0)
{
+ if (input.SkipField())
+ continue; //can't merge unknown without field tag
break;
}
+
+ if(!MergeFieldFrom(tag, input))
+ break;
}
return this;
}
@@ -581,11 +587,14 @@ namespace Google.ProtocolBuffers
internal void MergeFrom(CodedInputStream input, ExtensionRegistry extensionRegistry, IBuilder builder)
{
- while (true)
+ uint tag;
+ string name;
+ while (input.ReadTag(out tag, out name))
{
- uint tag = input.ReadTag();
if (tag == 0)
{
+ if (input.SkipField())
+ continue; //can't merge unknown without field tag
break;
}
@@ -765,11 +774,14 @@ namespace Google.ProtocolBuffers
IBuilderLite subBuilder = null;
FieldDescriptor field = null;
- while (true)
+ uint tag;
+ string name;
+ while (input.ReadTag(out tag, out name))
{
- uint tag = input.ReadTag();
if (tag == 0)
{
+ if (input.SkipField())
+ continue; //can't merge unknown without field tag
break;
}
@@ -833,7 +845,7 @@ namespace Google.ProtocolBuffers
else
{
// Unknown tag. Skip it.
- if (!input.SkipField(tag))
+ if (!input.SkipField())
{
break; // end of group
}