Skip to content

Commit 26569de

Browse files
Fix NPE when a message with parsed extension merges from bytes that contain extension data and when lazy mode is enabled.
PiperOrigin-RevId: 904139856
1 parent 8d82427 commit 26569de

2 files changed

Lines changed: 23 additions & 5 deletions

File tree

java/core/src/main/java/com/google/protobuf/MessageReflection.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,12 +1030,10 @@ public void mergeMessage(
10301030
if (!field.isRepeated()) {
10311031
boolean isLazyField = ExtensionRegistryLite.lazyExtensionEnabled() && field.isExtension();
10321032
if (hasField(field)) {
1033-
if (isLazyField) {
1033+
InternalLazyField lazyField = extensions.getLazyField(field);
1034+
if (isLazyField && lazyField != null) {
10341035
Object unused =
1035-
setField(
1036-
field,
1037-
InternalLazyField.mergeFrom(
1038-
extensions.getLazyField(field), input, extensionRegistry));
1036+
setField(field, InternalLazyField.mergeFrom(lazyField, input, extensionRegistry));
10391037
return;
10401038
}
10411039
Object fieldOrBuilder = extensions.getFieldAllowBuilders(field);

java/core/src/test/java/com/google/protobuf/ParserTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,4 +434,24 @@ public int read() throws IOException {
434434
assertThat(e.getClass()).isEqualTo(InterruptedIOException.class);
435435
}
436436
}
437+
438+
@Test
439+
public void testMessageWithExtensionsParseFromBytes() throws Exception {
440+
TestParsingMerge.Builder builder = TestParsingMerge.newBuilder();
441+
ExtensionRegistry registry = ExtensionRegistry.newInstance();
442+
UnittestProto.registerAllExtensions(registry);
443+
builder
444+
.setExtension(
445+
TestParsingMerge.optionalExt, TestAllTypes.newBuilder().setOptionalInt32(1).build())
446+
.mergeFrom(
447+
TestParsingMerge.newBuilder()
448+
.setExtension(
449+
TestParsingMerge.optionalExt,
450+
TestAllTypes.newBuilder().setOptionalInt32(2).build())
451+
.buildPartial()
452+
.toByteString(),
453+
registry);
454+
455+
assertThat(builder.getExtension(TestParsingMerge.optionalExt).getOptionalInt32()).isEqualTo(2);
456+
}
437457
}

0 commit comments

Comments
 (0)