diff options
author | Jon Skeet <skeet@pobox.com> | 2015-08-08 07:24:57 +0100 |
---|---|---|
committer | Jon Skeet <skeet@pobox.com> | 2015-08-08 07:24:57 +0100 |
commit | cac45313235bd11b08e0803453a2ec5a7d4b652a (patch) | |
tree | b513d3030e013c59fc2a2ef4df0be6a0509b5dc9 /csharp/src/Google.Protobuf.Test | |
parent | b76b76ba4f5152550fd334a6f3533d4db208f633 (diff) | |
parent | 6e16037c9933e175f62feb445ff8bd22d7727285 (diff) | |
download | protobuf-cac45313235bd11b08e0803453a2ec5a7d4b652a.tar.gz protobuf-cac45313235bd11b08e0803453a2ec5a7d4b652a.tar.bz2 protobuf-cac45313235bd11b08e0803453a2ec5a7d4b652a.zip |
Merge pull request #694 from jskeet/groups
Fix groups handling in C#
Diffstat (limited to 'csharp/src/Google.Protobuf.Test')
9 files changed, 190 insertions, 232 deletions
diff --git a/csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs b/csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs index c4c92efd..42c740ac 100644 --- a/csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs +++ b/csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs @@ -442,5 +442,92 @@ namespace Google.Protobuf var input = new CodedInputStream(new byte[] { 0 });
Assert.Throws<InvalidProtocolBufferException>(() => input.ReadTag());
}
+
+ [Test]
+ public void SkipGroup()
+ {
+ // Create an output stream with a group in:
+ // Field 1: string "field 1"
+ // Field 2: group containing:
+ // Field 1: fixed int32 value 100
+ // Field 2: string "ignore me"
+ // Field 3: nested group containing
+ // Field 1: fixed int64 value 1000
+ // Field 3: string "field 3"
+ var stream = new MemoryStream();
+ var output = new CodedOutputStream(stream);
+ output.WriteTag(1, WireFormat.WireType.LengthDelimited);
+ output.WriteString("field 1");
+
+ // The outer group...
+ output.WriteTag(2, WireFormat.WireType.StartGroup);
+ output.WriteTag(1, WireFormat.WireType.Fixed32);
+ output.WriteFixed32(100);
+ output.WriteTag(2, WireFormat.WireType.LengthDelimited);
+ output.WriteString("ignore me");
+ // The nested group...
+ output.WriteTag(3, WireFormat.WireType.StartGroup);
+ output.WriteTag(1, WireFormat.WireType.Fixed64);
+ output.WriteFixed64(1000);
+ // Note: Not sure the field number is relevant for end group...
+ output.WriteTag(3, WireFormat.WireType.EndGroup);
+
+ // End the outer group
+ output.WriteTag(2, WireFormat.WireType.EndGroup);
+
+ output.WriteTag(3, WireFormat.WireType.LengthDelimited);
+ output.WriteString("field 3");
+ output.Flush();
+ stream.Position = 0;
+
+ // Now act like a generated client
+ var input = new CodedInputStream(stream);
+ Assert.AreEqual(WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited), input.ReadTag());
+ Assert.AreEqual("field 1", input.ReadString());
+ Assert.AreEqual(WireFormat.MakeTag(2, WireFormat.WireType.StartGroup), input.ReadTag());
+ input.SkipLastField(); // Should consume the whole group, including the nested one.
+ Assert.AreEqual(WireFormat.MakeTag(3, WireFormat.WireType.LengthDelimited), input.ReadTag());
+ Assert.AreEqual("field 3", input.ReadString());
+ }
+
+ [Test]
+ public void EndOfStreamReachedWhileSkippingGroup()
+ {
+ var stream = new MemoryStream();
+ var output = new CodedOutputStream(stream);
+ output.WriteTag(1, WireFormat.WireType.StartGroup);
+ output.WriteTag(2, WireFormat.WireType.StartGroup);
+ output.WriteTag(2, WireFormat.WireType.EndGroup);
+
+ output.Flush();
+ stream.Position = 0;
+
+ // Now act like a generated client
+ var input = new CodedInputStream(stream);
+ input.ReadTag();
+ Assert.Throws<InvalidProtocolBufferException>(() => input.SkipLastField());
+ }
+
+ [Test]
+ public void RecursionLimitAppliedWhileSkippingGroup()
+ {
+ var stream = new MemoryStream();
+ var output = new CodedOutputStream(stream);
+ for (int i = 0; i < CodedInputStream.DefaultRecursionLimit + 1; i++)
+ {
+ output.WriteTag(1, WireFormat.WireType.StartGroup);
+ }
+ for (int i = 0; i < CodedInputStream.DefaultRecursionLimit + 1; i++)
+ {
+ output.WriteTag(1, WireFormat.WireType.EndGroup);
+ }
+ output.Flush();
+ stream.Position = 0;
+
+ // Now act like a generated client
+ var input = new CodedInputStream(stream);
+ Assert.AreEqual(WireFormat.MakeTag(1, WireFormat.WireType.StartGroup), input.ReadTag());
+ Assert.Throws<InvalidProtocolBufferException>(() => input.SkipLastField());
+ }
}
}
\ No newline at end of file diff --git a/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs b/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs index 6fdd1066..575d4586 100644 --- a/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs +++ b/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs @@ -629,5 +629,27 @@ namespace Google.Protobuf var data = new byte[] { 130, 3, 1 };
Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseFrom(data));
}
+
+ /// <summary>
+ /// Demonstrates current behaviour with an extraneous end group tag - see issue 688
+ /// for details; we may want to change this.
+ /// </summary>
+ [Test]
+ public void ExtraEndGroupSkipped()
+ {
+ var message = SampleMessages.CreateFullTestAllTypes();
+ var stream = new MemoryStream();
+ var output = new CodedOutputStream(stream);
+
+ output.WriteTag(100, WireFormat.WireType.EndGroup);
+ output.WriteTag(TestAllTypes.SingleFixed32FieldNumber, WireFormat.WireType.Fixed32);
+ output.WriteFixed32(123);
+
+ output.Flush();
+
+ stream.Position = 0;
+ var parsed = TestAllTypes.Parser.ParseFrom(stream);
+ Assert.AreEqual(new TestAllTypes { SingleFixed32 = 123 }, parsed);
+ }
}
}
diff --git a/csharp/src/Google.Protobuf.Test/TestProtos/MapUnittestProto3.cs b/csharp/src/Google.Protobuf.Test/TestProtos/MapUnittestProto3.cs index f6835c4b..e9e18193 100644 --- a/csharp/src/Google.Protobuf.Test/TestProtos/MapUnittestProto3.cs +++ b/csharp/src/Google.Protobuf.Test/TestProtos/MapUnittestProto3.cs @@ -476,10 +476,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { mapInt32Int32_.AddEntriesFrom(input, _map_mapInt32Int32_codec); @@ -648,10 +645,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { if (testMap_ == null) { @@ -748,10 +742,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { mapInt32Message_.AddEntriesFrom(input, _map_mapInt32Message_codec); @@ -859,10 +850,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { map1_.AddEntriesFrom(input, _map_map1_codec); @@ -1156,10 +1144,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { mapInt32Int32_.AddEntriesFrom(input, _map_mapInt32Int32_codec); @@ -1309,10 +1294,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { type_.AddEntriesFrom(input, _map_type_codec); @@ -1416,10 +1398,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { entry_.AddEntriesFrom(input, _map_entry_codec); diff --git a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportProto3.cs b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportProto3.cs index 646a01a2..bf527ac5 100644 --- a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportProto3.cs +++ b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportProto3.cs @@ -139,10 +139,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { D = input.ReadInt32(); diff --git a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportPublicProto3.cs b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportPublicProto3.cs index 225775a3..ec460906 100644 --- a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportPublicProto3.cs +++ b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportPublicProto3.cs @@ -125,10 +125,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { E = input.ReadInt32(); diff --git a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestIssues.cs b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestIssues.cs index 1bf40ead..63119a34 100644 --- a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestIssues.cs +++ b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestIssues.cs @@ -142,10 +142,7 @@ namespace UnitTest.Issues.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; } } @@ -222,10 +219,7 @@ namespace UnitTest.Issues.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; } } @@ -302,10 +296,7 @@ namespace UnitTest.Issues.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; } } @@ -441,10 +432,7 @@ namespace UnitTest.Issues.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { value_ = (global::UnitTest.Issues.TestProtos.NegativeEnum) input.ReadEnum(); @@ -534,10 +522,7 @@ namespace UnitTest.Issues.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; } } @@ -730,10 +715,7 @@ namespace UnitTest.Issues.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { PrimitiveValue = input.ReadInt32(); @@ -860,10 +842,7 @@ namespace UnitTest.Issues.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { Item = input.ReadInt32(); @@ -987,10 +966,7 @@ namespace UnitTest.Issues.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { Types_ = input.ReadInt32(); @@ -1075,10 +1051,7 @@ namespace UnitTest.Issues.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; } } @@ -1343,10 +1316,7 @@ namespace UnitTest.Issues.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { PlainString = input.ReadString(); diff --git a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestProto3.cs b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestProto3.cs index 58e5be65..bf4590ad 100644 --- a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestProto3.cs +++ b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestProto3.cs @@ -1211,10 +1211,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { SingleInt32 = input.ReadInt32(); @@ -1546,10 +1543,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { Bb = input.ReadInt32(); @@ -1698,10 +1692,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { if (child_ == null) { @@ -1818,10 +1809,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { DeprecatedInt32 = input.ReadInt32(); @@ -1923,10 +1911,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { C = input.ReadInt32(); @@ -2006,10 +1991,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; } } @@ -2110,10 +2092,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { if (foreignNested_ == null) { @@ -2240,10 +2219,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { A = input.ReadInt32(); @@ -2374,10 +2350,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { if (a_ == null) { @@ -2489,10 +2462,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { if (bb_ == null) { @@ -2622,10 +2592,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { if (a_ == null) { @@ -2859,10 +2826,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { PrimitiveField = input.ReadInt32(); @@ -3066,10 +3030,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { MyInt = input.ReadInt64(); @@ -3209,10 +3170,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { Bb = input.ReadInt32(); @@ -3323,10 +3281,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { sparseEnum_ = (global::Google.Protobuf.TestProtos.TestSparseEnum) input.ReadEnum(); @@ -3428,10 +3383,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { Data = input.ReadString(); @@ -3525,10 +3477,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { data_.AddEntriesFrom(input, _repeated_data_codec); @@ -3630,10 +3579,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { Data = input.ReadBytes(); @@ -3735,10 +3681,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { Data = input.ReadBytes(); @@ -3840,10 +3783,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { Data = input.ReadInt32(); @@ -3945,10 +3885,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { Data = input.ReadUInt32(); @@ -4050,10 +3987,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { Data = input.ReadInt64(); @@ -4155,10 +4089,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { Data = input.ReadUInt64(); @@ -4260,10 +4191,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { Data = input.ReadBool(); @@ -4438,10 +4366,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 8: { FooInt = input.ReadInt32(); @@ -4730,10 +4655,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 722: case 720: { @@ -5075,10 +4997,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 722: case 720: { @@ -5308,10 +5227,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 98: case 101: { @@ -5439,10 +5355,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { A = input.ReadString(); @@ -5522,10 +5435,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; } } @@ -5601,10 +5511,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; } } @@ -5680,10 +5587,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; } } @@ -5759,10 +5663,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; } } @@ -5838,10 +5739,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; } } @@ -5917,10 +5815,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; } } diff --git a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestWellKnownTypes.cs b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestWellKnownTypes.cs index 0840fa27..16634e03 100644 --- a/csharp/src/Google.Protobuf.Test/TestProtos/UnittestWellKnownTypes.cs +++ b/csharp/src/Google.Protobuf.Test/TestProtos/UnittestWellKnownTypes.cs @@ -679,10 +679,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { if (anyField_ == null) { @@ -1136,10 +1133,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { anyField_.AddEntriesFrom(input, _repeated_anyField_codec); @@ -1757,10 +1751,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { global::Google.Protobuf.WellKnownTypes.Any subBuilder = new global::Google.Protobuf.WellKnownTypes.Any(); @@ -2205,10 +2196,7 @@ namespace Google.Protobuf.TestProtos { while ((tag = input.ReadTag()) != 0) { switch(tag) { default: - if (pb::WireFormat.IsEndGroupTag(tag)) { - return; - } - input.ConsumeLastField(); + input.SkipLastField(); break; case 10: { anyField_.AddEntriesFrom(input, _map_anyField_codec); diff --git a/csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs b/csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs index d2a07057..fbc0ff07 100644 --- a/csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs +++ b/csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs @@ -322,5 +322,28 @@ namespace Google.Protobuf.WellKnownTypes // A normal implementation would have 0 now, as the explicit default would have been overwritten the 5. Assert.AreEqual(5, message.Int32Field); } + + [Test] + public void UnknownFieldInWrapper() + { + var stream = new MemoryStream(); + var output = new CodedOutputStream(stream); + var wrapperTag = WireFormat.MakeTag(TestWellKnownTypes.Int32FieldFieldNumber, WireFormat.WireType.LengthDelimited); + var unknownTag = WireFormat.MakeTag(15, WireFormat.WireType.Varint); + var valueTag = WireFormat.MakeTag(Int32Value.ValueFieldNumber, WireFormat.WireType.Varint); + + output.WriteTag(wrapperTag); + output.WriteLength(4); // unknownTag + value 5 + valueType + value 6, each 1 byte + output.WriteTag(unknownTag); + output.WriteInt32((int) valueTag); // Sneakily "pretend" it's a tag when it's really a value + output.WriteTag(valueTag); + output.WriteInt32(6); + + output.Flush(); + stream.Position = 0; + + var message = TestWellKnownTypes.Parser.ParseFrom(stream); + Assert.AreEqual(6, message.Int32Field); + } } } |