A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/protocolbuffers/protobuf/commit/c63fd563095adae535732b9464f4ab99f31c1bb4 below:

Tolerate message set extensions encoded as normal deliminited submess… · protocolbuffers/protobuf@c63fd56 · GitHub

File tree Expand file treeCollapse file tree 6 files changed

+59

-21

lines changed

Filter options

Expand file treeCollapse file tree 6 files changed

+59

-21

lines changed Original file line number Diff line number Diff line change

@@ -1,3 +1,2 @@

1 -

Recommended.Proto2.ProtobufInput.ValidMessageSetEncoding.SubmessageEncoding.NotUnknown.ProtobufOutput # Output was not equivalent to reference message: added: message_set_correct.(protobuf_test_messages.proto2.TestAllTypesProto2.Ext

2 1

Required.*.JsonInput.Int32FieldQuotedExponentialValue.* # Failed to parse input or produce output.

3 2

Required.*.JsonInput.AnyWithNoType.* # Failed to parse input or produce output.

Original file line number Diff line number Diff line change

@@ -1,2 +1 @@

1 -

Recommended.Proto2.ProtobufInput.ValidMessageSetEncoding.SubmessageEncoding.NotUnknown.ProtobufOutput # Output was not equivalent to reference message: added: message_set_correct.(protobuf_test_messages.proto2.TestAllTypesProto2.Ext

2 1 Original file line number Diff line number Diff line change

@@ -1,3 +1,2 @@

1 -

Recommended.Proto2.ProtobufInput.ValidMessageSetEncoding.SubmessageEncoding.NotUnknown.ProtobufOutput # Output was not equivalent to reference message: added: message_set_correct.(protobuf_test_messages.proto2.TestAllTypesProto2.Ext

2 1

Required.*.JsonInput.Int32FieldQuotedExponentialValue.* # Failed to parse input or produce output.

3 -

Required.*.JsonInput.AnyWithNoType.*

2 +

Required.*.JsonInput.AnyWithNoType.*

Original file line number Diff line number Diff line change

@@ -333,6 +333,38 @@ TEST(MessageTest, UnknownMessageSet) {

333 333

EXPECT_FALSE(upb_test_FakeMessageSet_Item_has_unknowngroup(items[0]));

334 334

}

335 335 336 +

TEST(MessageTest, MessageSetSubmessageEncoding) {

337 +

upb::Arena arena;

338 + 339 +

// Create a normal extension message and use the set the doppelgänger message

340 +

// set member extension on it. This will allow us to serialize as a normal

341 +

// extension and then attempt to parse it as a message set.

342 +

// This mimics the behavior of an encoder that is message set unaware.

343 +

upb_test_TestExtensions* ext_msg = upb_test_TestExtensions_new(arena.ptr());

344 +

upb_test_MessageSetMember* ext_member =

345 +

upb_test_MessageSetMember_new(arena.ptr());

346 +

upb_test_MessageSetMember_set_optional_int32(ext_member, 234);

347 +

upb_test_MessageSetMember_set_doppelganger_message_set_extension(

348 +

ext_msg, ext_member, arena.ptr());

349 + 350 +

size_t size;

351 +

char* serialized =

352 +

upb_test_TestExtensions_serialize(ext_msg, arena.ptr(), &size);

353 +

ASSERT_TRUE(serialized != nullptr);

354 +

ASSERT_GE(size, 0);

355 + 356 +

upb::DefPool defpool;

357 +

upb::MessageDefPtr m(upb_test_TestMessageSet_getmsgdef(defpool.ptr()));

358 +

EXPECT_TRUE(m.ptr() != nullptr);

359 + 360 +

upb_test_TestMessageSet* message_set = upb_test_TestMessageSet_parse_ex(

361 +

serialized, size, upb_DefPool_ExtensionRegistry(defpool.ptr()), 0,

362 +

arena.ptr());

363 +

ASSERT_TRUE(message_set != nullptr);

364 + 365 +

VerifyMessageSet(message_set);

366 +

}

367 + 336 368

TEST(MessageTest, Proto2Enum) {

337 369

upb::Arena arena;

338 370

upb_test_Proto2FakeEnumMessage* fake_msg =

Original file line number Diff line number Diff line change

@@ -41,7 +41,12 @@ message TestMessageSet {

41 41

message MessageSetMember {

42 42

optional int32 optional_int32 = 1;

43 43

extend TestMessageSet {

44 -

optional MessageSetMember message_set_extension = 4;

44 +

optional MessageSetMember message_set_extension = 2000;

45 +

}

46 +

// Also extend a non-MessageSet with the same field number. This will allow us

47 +

// to test parsing a normal extension into a MessageSet.

48 +

extend TestExtensions {

49 +

optional MessageSetMember doppelganger_message_set_extension = 2000;

45 50

}

46 51

}

47 52 Original file line number Diff line number Diff line change

@@ -930,7 +930,8 @@ static const char* upb_Decoder_DecodeMessageSetItem(

930 930

static const upb_MiniTableField* _upb_Decoder_FindField(upb_Decoder* d,

931 931

const upb_MiniTable* t,

932 932

uint32_t field_number,

933 -

int* last_field_index) {

933 +

int* last_field_index,

934 +

int wire_type) {

934 935

static upb_MiniTableField none = {

935 936

0, 0, 0, 0, kUpb_FakeFieldType_FieldNotFound, 0};

936 937

if (t == NULL) return &none;

@@ -959,20 +960,22 @@ static const upb_MiniTableField* _upb_Decoder_FindField(upb_Decoder* d,

959 960

}

960 961 961 962

if (d->extreg) {

962 -

switch (t->UPB_PRIVATE(ext)) {

963 -

case kUpb_ExtMode_Extendable: {

964 -

const upb_MiniTableExtension* ext =

965 -

upb_ExtensionRegistry_Lookup(d->extreg, t, field_number);

966 -

if (ext) return &ext->UPB_PRIVATE(field);

967 -

break;

963 +

int ext_mode = t->UPB_PRIVATE(ext);

964 +

// Treat a message set as an extendable message if it is a delimited field.

965 +

// This provides compatibility with encoders that are unaware of message

966 +

// sets and serialize them as normal extensions.

967 +

if (ext_mode == kUpb_ExtMode_Extendable ||

968 +

(ext_mode == kUpb_ExtMode_IsMessageSet &&

969 +

wire_type == kUpb_WireType_Delimited)) {

970 +

const upb_MiniTableExtension* ext =

971 +

upb_ExtensionRegistry_Lookup(d->extreg, t, field_number);

972 +

if (ext) return &ext->UPB_PRIVATE(field);

973 +

} else if (ext_mode == kUpb_ExtMode_IsMessageSet) {

974 +

if (field_number == kUpb_MsgSet_Item) {

975 +

static upb_MiniTableField item = {

976 +

0, 0, 0, 0, kUpb_FakeFieldType_MessageSetItem, 0};

977 +

return &item;

968 978

}

969 -

case kUpb_ExtMode_IsMessageSet:

970 -

if (field_number == kUpb_MsgSet_Item) {

971 -

static upb_MiniTableField item = {

972 -

0, 0, 0, 0, kUpb_FakeFieldType_MessageSetItem, 0};

973 -

return &item;

974 -

}

975 -

break;

976 979

}

977 980

}

978 981

@@ -1073,7 +1076,7 @@ static int _upb_Decoder_GetDelimitedOp(upb_Decoder* d, const upb_MiniTable* mt,

1073 1076

[kUpb_FieldType_SFixed64] = kUpb_DecodeOp_UnknownField,

1074 1077

[kUpb_FieldType_SInt32] = kUpb_DecodeOp_UnknownField,

1075 1078

[kUpb_FieldType_SInt64] = kUpb_DecodeOp_UnknownField,

1076 -

[kUpb_FakeFieldType_MessageSetItem] = kUpb_DecodeOp_UnknownField,

1079 +

[kUpb_FakeFieldType_MessageSetItem] = kUpb_DecodeOp_SubMessage,

1077 1080

// For repeated field type.

1078 1081

[kRepeatedBase + kUpb_FieldType_Double] = OP_FIXPCK_LG2(3),

1079 1082

[kRepeatedBase + kUpb_FieldType_Float] = OP_FIXPCK_LG2(2),

@@ -1320,7 +1323,8 @@ static const char* _upb_Decoder_DecodeMessage(upb_Decoder* d, const char* ptr,

1320 1323

return ptr;

1321 1324

}

1322 1325 1323 -

field = _upb_Decoder_FindField(d, layout, field_number, &last_field_index);

1326 +

field = _upb_Decoder_FindField(d, layout, field_number, &last_field_index,

1327 +

wire_type);

1324 1328

ptr = _upb_Decoder_DecodeWireValue(d, ptr, layout, field, wire_type, &val,

1325 1329

&op);

1326 1330

You can’t perform that action at this time.


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4