@@ -294,19 +294,8 @@ Object parseMessage(
294294 CodedInputStream input ,
295295 ExtensionRegistryLite registry ,
296296 Descriptors .FieldDescriptor descriptor ,
297- Message defaultInstance )
298- throws IOException ;
299-
300- /**
301- * Parse from a ByteString into a sub field message defined based on either FieldDescriptor or
302- * the default instance. There isn't a varint indicating the length of the message at the
303- * beginning of the input ByteString.
304- */
305- Object parseMessageFromBytes (
306- ByteString bytes ,
307- ExtensionRegistryLite registry ,
308- Descriptors .FieldDescriptor descriptor ,
309- Message defaultInstance )
297+ Message defaultInstance ,
298+ boolean inputLengthPrefixed )
310299 throws IOException ;
311300
312301 /**
@@ -494,7 +483,8 @@ public Object parseMessage(
494483 CodedInputStream input ,
495484 ExtensionRegistryLite extensionRegistry ,
496485 Descriptors .FieldDescriptor field ,
497- Message defaultInstance )
486+ Message defaultInstance ,
487+ boolean inputLengthPrefixed )
498488 throws IOException {
499489 Message .Builder subBuilder ;
500490 // When default instance is not null. The field is an extension field.
@@ -509,31 +499,11 @@ public Object parseMessage(
509499 subBuilder .mergeFrom (originalMessage );
510500 }
511501 }
512- input .readMessage (subBuilder , extensionRegistry );
513- return subBuilder .buildPartial ();
514- }
515-
516- @ Override
517- public Object parseMessageFromBytes (
518- ByteString bytes ,
519- ExtensionRegistryLite extensionRegistry ,
520- Descriptors .FieldDescriptor field ,
521- Message defaultInstance )
522- throws IOException {
523- Message .Builder subBuilder ;
524- // When default instance is not null. The field is an extension field.
525- if (defaultInstance != null ) {
526- subBuilder = defaultInstance .newBuilderForType ();
502+ if (inputLengthPrefixed ) {
503+ input .readMessage (subBuilder , extensionRegistry );
527504 } else {
528- subBuilder = builder . newBuilderForField ( field );
505+ subBuilder . mergeFrom ( input , extensionRegistry );
529506 }
530- if (!field .isRepeated ()) {
531- Message originalMessage = (Message ) getField (field );
532- if (originalMessage != null ) {
533- subBuilder .mergeFrom (originalMessage );
534- }
535- }
536- subBuilder .mergeFrom (bytes , extensionRegistry );
537507 return subBuilder .buildPartial ();
538508 }
539509
@@ -762,7 +732,8 @@ public Object parseMessage(
762732 CodedInputStream input ,
763733 ExtensionRegistryLite registry ,
764734 Descriptors .FieldDescriptor field ,
765- Message defaultInstance )
735+ Message defaultInstance ,
736+ boolean inputLengthPrefixed )
766737 throws IOException {
767738 Message .Builder subBuilder = defaultInstance .newBuilderForType ();
768739 if (!field .isRepeated ()) {
@@ -771,7 +742,11 @@ public Object parseMessage(
771742 subBuilder .mergeFrom (originalMessage );
772743 }
773744 }
774- input .readMessage (subBuilder , registry );
745+ if (inputLengthPrefixed ) {
746+ input .readMessage (subBuilder , registry );
747+ } else {
748+ subBuilder .mergeFrom (input , registry );
749+ }
775750 return subBuilder .buildPartial ();
776751 }
777752
@@ -823,24 +798,6 @@ public void mergeMessage(
823798 }
824799 }
825800
826- @ Override
827- public Object parseMessageFromBytes (
828- ByteString bytes ,
829- ExtensionRegistryLite registry ,
830- Descriptors .FieldDescriptor field ,
831- Message defaultInstance )
832- throws IOException {
833- Message .Builder subBuilder = defaultInstance .newBuilderForType ();
834- if (!field .isRepeated ()) {
835- Message originalMessage = (Message ) getField (field );
836- if (originalMessage != null ) {
837- subBuilder .mergeFrom (originalMessage );
838- }
839- }
840- subBuilder .mergeFrom (bytes , registry );
841- return subBuilder .buildPartial ();
842- }
843-
844801 @ Override
845802 public MergeTarget newMergeTargetForField (
846803 Descriptors .FieldDescriptor descriptor , Message defaultInstance ) {
@@ -977,7 +934,8 @@ public Object parseMessage(
977934 CodedInputStream input ,
978935 ExtensionRegistryLite registry ,
979936 Descriptors .FieldDescriptor field ,
980- Message defaultInstance )
937+ Message defaultInstance ,
938+ boolean inputLengthPrefixed )
981939 throws IOException {
982940 Message .Builder subBuilder = defaultInstance .newBuilderForType ();
983941 if (!field .isRepeated ()) {
@@ -986,7 +944,11 @@ public Object parseMessage(
986944 subBuilder .mergeFrom (originalMessage );
987945 }
988946 }
989- input .readMessage (subBuilder , registry );
947+ if (inputLengthPrefixed ) {
948+ input .readMessage (subBuilder , registry );
949+ } else {
950+ subBuilder .mergeFrom (input , registry );
951+ }
990952 return subBuilder .buildPartial ();
991953 }
992954
@@ -1067,24 +1029,6 @@ public void mergeMessage(
10671029 }
10681030 }
10691031
1070- @ Override
1071- public Object parseMessageFromBytes (
1072- ByteString bytes ,
1073- ExtensionRegistryLite registry ,
1074- Descriptors .FieldDescriptor field ,
1075- Message defaultInstance )
1076- throws IOException {
1077- Message .Builder subBuilder = defaultInstance .newBuilderForType ();
1078- if (!field .isRepeated ()) {
1079- Message originalMessage = (Message ) getField (field );
1080- if (originalMessage != null ) {
1081- subBuilder .mergeFrom (originalMessage );
1082- }
1083- }
1084- subBuilder .mergeFrom (bytes , registry );
1085- return subBuilder .buildPartial ();
1086- }
1087-
10881032 @ Override
10891033 public MergeTarget newMergeTargetForField (
10901034 Descriptors .FieldDescriptor descriptor , Message defaultInstance ) {
@@ -1366,10 +1310,17 @@ private static void mergeMessageSetExtensionFromCodedStream(
13661310 }
13671311 input .checkLastTagWas (WireFormat .MESSAGE_SET_ITEM_END_TAG );
13681312
1313+ int remainingInputRecursionLimit =
1314+ input .recursionLimit - input .messageDepth - input .groupDepth - 1 ;
1315+ if (remainingInputRecursionLimit < 0 ) {
1316+ throw InvalidProtocolBufferException .recursionLimitExceeded ();
1317+ }
1318+
13691319 // Process the raw bytes.
13701320 if (rawBytes != null && typeId != 0 ) { // Zero is not a valid type ID.
13711321 if (extension != null ) { // We known the type
1372- mergeMessageSetExtensionFromBytes (rawBytes , extension , extensionRegistry , target );
1322+ mergeMessageSetExtensionFromBytes (
1323+ rawBytes , extension , extensionRegistry , target , remainingInputRecursionLimit );
13731324 } else { // We don't know how to parse this. Ignore it.
13741325 if (rawBytes != null && unknownFields != null ) {
13751326 unknownFields .mergeField (
@@ -1383,17 +1334,26 @@ private static void mergeMessageSetExtensionFromBytes(
13831334 ByteString rawBytes ,
13841335 ExtensionRegistry .ExtensionInfo extension ,
13851336 ExtensionRegistryLite extensionRegistry ,
1386- MergeTarget target )
1337+ MergeTarget target ,
1338+ int remainingInputRecursionLimit )
13871339 throws IOException {
13881340
13891341 Descriptors .FieldDescriptor field = extension .descriptor ;
13901342 boolean hasOriginalValue = target .hasField (field );
13911343
1344+ // TODO: b/535485217 - Consider letting InternalLazyField to concat the bytes to avoid parsing
1345+ // if the existing field is a lazy field with lazy bytes.
13921346 if (hasOriginalValue || ExtensionRegistryLite .isEagerlyParseMessageSets ()) {
13931347 // If the field already exists, we just parse the field.
1348+ CodedInputStream input = rawBytes .newCodedInput ();
1349+ input .setRecursionLimit (remainingInputRecursionLimit );
13941350 Object value =
1395- target .parseMessageFromBytes (
1396- rawBytes , extensionRegistry , field , extension .defaultInstance );
1351+ target .parseMessage (
1352+ input ,
1353+ extensionRegistry ,
1354+ field ,
1355+ extension .defaultInstance ,
1356+ /* inputLengthPrefixed= */ false );
13971357 target .setField (field , value );
13981358 } else {
13991359 // Use InternalLazyField to load MessageSet lazily.
@@ -1410,7 +1370,13 @@ private static void eagerlyMergeMessageSetExtension(
14101370 MergeTarget target )
14111371 throws IOException {
14121372 Descriptors .FieldDescriptor field = extension .descriptor ;
1413- Object value = target .parseMessage (input , extensionRegistry , field , extension .defaultInstance );
1373+ Object value =
1374+ target .parseMessage (
1375+ input ,
1376+ extensionRegistry ,
1377+ field ,
1378+ extension .defaultInstance ,
1379+ /* inputLengthPrefixed= */ true );
14141380 target .setField (field , value );
14151381 }
14161382}
0 commit comments