diff options
author | Nicholas Seckar <seckar@google.com> | 2013-09-24 20:52:54 -0700 |
---|---|---|
committer | Ulas Kirazci <ulas@google.com> | 2013-10-04 10:52:08 -0700 |
commit | b3c24e0ed285b9457560040fe49cb4f9616e721b (patch) | |
tree | 1bca00fbae2863ef4ddcca2c08585ebd259b598b /java/src | |
parent | 4b7983cb71bda102b5b5d3aa2fb6767d0df4f6d4 (diff) | |
download | protobuf-b3c24e0ed285b9457560040fe49cb4f9616e721b.tar.gz protobuf-b3c24e0ed285b9457560040fe49cb4f9616e721b.tar.bz2 protobuf-b3c24e0ed285b9457560040fe49cb4f9616e721b.zip |
Fix roundtrip failure with groups when unknown fields are enabled.
When parsing a group, the group's end tag should not be stored within the
message's unknownFieldData. Not only does this waste space, it is also output
the next time the group is serialized, resulting in two end tags for that group.
The resulting bytes are not always a valid protocol buffer and may fail to
parse.
This change ensures that group end tags do not result in an unknownFieldData
entry, and that messages with groups can be roundtripped without corruption.
Change-Id: I240f858a7217a7652b756598c34aacad5dcc3363
Conflicts:
java/src/test/java/com/google/protobuf/NanoTest.java
Diffstat (limited to 'java/src')
-rw-r--r-- | java/src/main/java/com/google/protobuf/nano/WireFormatNano.java | 9 | ||||
-rw-r--r-- | java/src/test/java/com/google/protobuf/NanoTest.java | 17 |
2 files changed, 24 insertions, 2 deletions
diff --git a/java/src/main/java/com/google/protobuf/nano/WireFormatNano.java b/java/src/main/java/com/google/protobuf/nano/WireFormatNano.java index c901e59c..301ff1db 100644 --- a/java/src/main/java/com/google/protobuf/nano/WireFormatNano.java +++ b/java/src/main/java/com/google/protobuf/nano/WireFormatNano.java @@ -119,6 +119,9 @@ public final class WireFormatNano { * <p>Generated messages will call this for unknown fields if the store_unknown_fields * option is on. * + * <p>Note that the tag might be a end-group tag (rather than the start of an unknown field) in + * which case we do not want to add an unknown field entry. + * * @param data a Collection in which to store the data. * @param input the input buffer. * @param tag the tag of the field. @@ -130,11 +133,13 @@ public final class WireFormatNano { final CodedInputByteBufferNano input, final int tag) throws IOException { int startPos = input.getPosition(); - boolean skip = input.skipField(tag); + if (!input.skipField(tag)) { + return false; // This wasn't an unknown field, it's an end-group tag. + } int endPos = input.getPosition(); byte[] bytes = input.getData(startPos, endPos - startPos); data.add(new UnknownFieldData(tag, bytes)); - return skip; + return true; } /** diff --git a/java/src/test/java/com/google/protobuf/NanoTest.java b/java/src/test/java/com/google/protobuf/NanoTest.java index 84836195..ca0bcda4 100644 --- a/java/src/test/java/com/google/protobuf/NanoTest.java +++ b/java/src/test/java/com/google/protobuf/NanoTest.java @@ -35,6 +35,7 @@ import com.google.protobuf.nano.EnumClassNanoMultiple; import com.google.protobuf.nano.EnumClassNanos; import com.google.protobuf.nano.Extensions; import com.google.protobuf.nano.Extensions.AnotherMessage; +import com.google.protobuf.nano.Extensions.MessageWithGroup; import com.google.protobuf.nano.FileScopeEnumMultiple; import com.google.protobuf.nano.FileScopeEnumRefNano; import com.google.protobuf.nano.InternalNano; @@ -505,6 +506,22 @@ public class NanoTest extends TestCase { assertEquals(1, newMsg.optionalGroup.a); } + public void testNanoOptionalGroupWithUnknownFieldsEnabled() throws Exception { + MessageWithGroup msg = new MessageWithGroup(); + MessageWithGroup.Group grp = new MessageWithGroup.Group(); + grp.a = 1; + msg.group = grp; + byte [] serialized = MessageNano.toByteArray(msg); + + MessageWithGroup parsed = MessageWithGroup.parseFrom(serialized); + assertTrue(msg.group != null); + assertEquals(1, msg.group.a); + + byte [] serialized2 = MessageNano.toByteArray(parsed); + assertEquals(serialized2.length, serialized.length); + MessageWithGroup parsed2 = MessageWithGroup.parseFrom(serialized2); + } + public void testNanoOptionalNestedMessage() throws Exception { TestAllTypesNano msg = new TestAllTypesNano(); TestAllTypesNano.NestedMessage nestedMsg = new TestAllTypesNano.NestedMessage(); |