From b24fdd476f1f0c6a1219560a52eba0e5bc23c65a Mon Sep 17 00:00:00 2001 From: Jan-Willem Maarse Date: Thu, 1 May 2014 09:59:09 -0700 Subject: [PATCH] Fix NPE when clearing an extension in nano protos If ExtendableMessageNano doesn't have any unknown fields, trying to clear an extension by setting it to null would throw an NPE. Change-Id: I6abcdfcc0193de44f97b21dd6cc2f40604938a1a --- .../java/com/google/protobuf/nano/Extension.java | 2 +- .../test/java/com/google/protobuf/NanoTest.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/java/src/main/java/com/google/protobuf/nano/Extension.java b/java/src/main/java/com/google/protobuf/nano/Extension.java index 177a9ccc0a..dfe4f87ddf 100644 --- a/java/src/main/java/com/google/protobuf/nano/Extension.java +++ b/java/src/main/java/com/google/protobuf/nano/Extension.java @@ -268,7 +268,7 @@ public class Extension, T> { // After deletion or no-op addition (due to 'value' being an array of empty or // null-only elements), unknownFields may be empty. Discard the ArrayList if so. - return (unknownFields.size() == 0) ? null : unknownFields; + return (unknownFields == null || unknownFields.isEmpty()) ? null : unknownFields; } protected UnknownFieldData writeData(Object value) { diff --git a/java/src/test/java/com/google/protobuf/NanoTest.java b/java/src/test/java/com/google/protobuf/NanoTest.java index 5f28647ddf..00e2597edd 100644 --- a/java/src/test/java/com/google/protobuf/NanoTest.java +++ b/java/src/test/java/com/google/protobuf/NanoTest.java @@ -2910,6 +2910,20 @@ public class NanoTest extends TestCase { assertTrue(Arrays.equals(enums, message.getExtension(RepeatedExtensions.repeatedEnum))); } + public void testNullExtensions() throws Exception { + // Check that clearing the extension on an empty message is a no-op. + Extensions.ExtendableMessage message = new Extensions.ExtendableMessage(); + message.setExtension(SingularExtensions.someMessage, null); + assertEquals(0, MessageNano.toByteArray(message).length); + + // Check that the message is empty after setting and clearing an extension. + AnotherMessage another = new AnotherMessage(); + message.setExtension(SingularExtensions.someMessage, another); + assertTrue(MessageNano.toByteArray(message).length > 0); + message.setExtension(SingularExtensions.someMessage, null); + assertEquals(0, MessageNano.toByteArray(message).length); + } + public void testUnknownFields() throws Exception { // Check that we roundtrip (serialize and deserialize) unrecognized fields. AnotherMessage message = new AnotherMessage();