Bugfix: Make extensions beyond n=16 immutable. Previously, we only make extensions immutable if they were in the FieldSet's array, maximum size 16. The overflow entries in the TreeMap weren't made immutable. PiperOrigin-RevId: 671564444
diff --git a/java/core/src/main/java/com/google/protobuf/FieldSet.java b/java/core/src/main/java/com/google/protobuf/FieldSet.java index debad4e..c81a1d1 100644 --- a/java/core/src/main/java/com/google/protobuf/FieldSet.java +++ b/java/core/src/main/java/com/google/protobuf/FieldSet.java
@@ -101,8 +101,15 @@ int n = fields.getNumArrayEntries(); // Optimisation: hoist out of hot loop. for (int i = 0; i < n; ++i) { Entry<T, Object> entry = fields.getArrayEntryAt(i); - if (entry.getValue() instanceof GeneratedMessageLite) { - ((GeneratedMessageLite<?, ?>) entry.getValue()).makeImmutable(); + Object value = entry.getValue(); + if (value instanceof GeneratedMessageLite) { + ((GeneratedMessageLite<?, ?>) value).makeImmutable(); + } + } + for (Map.Entry<T, Object> entry : fields.getOverflowEntries()) { + Object value = entry.getValue(); + if (value instanceof GeneratedMessageLite) { + ((GeneratedMessageLite<?, ?>) value).makeImmutable(); } } fields.makeImmutable();
diff --git a/java/core/src/test/java/com/google/protobuf/ParserLiteTest.java b/java/core/src/test/java/com/google/protobuf/ParserLiteTest.java index 5433bb4..c903e95 100644 --- a/java/core/src/test/java/com/google/protobuf/ParserLiteTest.java +++ b/java/core/src/test/java/com/google/protobuf/ParserLiteTest.java
@@ -76,15 +76,14 @@ } @Test - public void testParseExtensionsLite_extensionIsMutable() throws Exception { + public void testParseExtensionsLite_extensionIsImmutable() throws Exception { TestAllExtensionsLite message = TestAllExtensionsLite.parseFrom( TestUtilLite.getAllLiteExtensionsSet().toByteArray(), TestUtilLite.getExtensionRegistryLite()); Object nested = message.getExtension(UnittestLite.optionalNestedMessageExtensionLite); if (nested instanceof GeneratedMessageLite) { - // TODO: Make this false. - assertThat(((GeneratedMessageLite) nested).isMutable()).isTrue(); + assertThat(((GeneratedMessageLite) nested).isMutable()).isFalse(); } }