Skip to content

Commit 1c052b2

Browse files
seirlcopybara-github
authored andcommitted
Pass message_factory to reflection->GetMessage in cel::Value::WrapField.
Inside WrapFieldImpl in value.cc, CEL called reflection->GetMessage(*message, field) without passing message_factory as the 3rd argument. When message is a compiled C++ GeneratedMessage, Protobuf reflection defaulted factory to MessageFactory::generated_factory(). If field is an extension whose descriptor lives in a dynamic DescriptorPool, generated_factory()->GetPrototype(extension_desc) returns nullptr, causing a SIGSEGV (@(nil)) in ExtensionSet::GetMessage(). This CL passes message_factory to reflection->GetMessage(*message, field, message_factory) so Protobuf reflection uses CEL's MessageFactory to resolve dynamic extensions. PiperOrigin-RevId: 957173111
1 parent 1c4f3fc commit 1c052b2

1 file changed

Lines changed: 5 additions & 4 deletions

File tree

common/value.cc

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1583,11 +1583,12 @@ Value WrapFieldImpl(
15831583
}
15841584
if constexpr (Unsafe::value) {
15851585
return Value::WrapMessageUnsafe(
1586-
&reflection->GetMessage(*message, field), descriptor_pool,
1587-
message_factory, arena);
1586+
&reflection->GetMessage(*message, field, message_factory),
1587+
descriptor_pool, message_factory, arena);
15881588
} else {
1589-
return Value::WrapMessage(&reflection->GetMessage(*message, field),
1590-
descriptor_pool, message_factory, arena);
1589+
return Value::WrapMessage(
1590+
&reflection->GetMessage(*message, field, message_factory),
1591+
descriptor_pool, message_factory, arena);
15911592
}
15921593
case google::protobuf::FieldDescriptor::TYPE_BYTES: {
15931594
std::string scratch;

0 commit comments

Comments
 (0)