Skip to content

Commit c05b320

Browse files
habermancopybara-github
authored andcommitted
Fixed a bug where FileDescriptor maps like message_types_by_name could return descriptors from other files.
Fixes: #13740 PiperOrigin-RevId: 587135054
1 parent 7bdd38e commit c05b320

3 files changed

Lines changed: 70 additions & 6 deletions

File tree

python/descriptor.c

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1248,26 +1248,34 @@ static const void* PyUpb_FileDescriptor_NestedLookup(
12481248

12491249
static const void* PyUpb_FileDescriptor_LookupMessage(
12501250
const upb_FileDef* filedef, const char* name) {
1251-
return PyUpb_FileDescriptor_NestedLookup(
1251+
const upb_MessageDef* m = PyUpb_FileDescriptor_NestedLookup(
12521252
filedef, name, (void*)&upb_DefPool_FindMessageByName);
1253+
if (!m) return NULL;
1254+
return upb_MessageDef_File(m) == filedef ? m : NULL;
12531255
}
12541256

12551257
static const void* PyUpb_FileDescriptor_LookupEnum(const upb_FileDef* filedef,
12561258
const char* name) {
1257-
return PyUpb_FileDescriptor_NestedLookup(filedef, name,
1258-
(void*)&upb_DefPool_FindEnumByName);
1259+
const upb_EnumDef* e = PyUpb_FileDescriptor_NestedLookup(
1260+
filedef, name, (void*)&upb_DefPool_FindEnumByName);
1261+
if (!e) return NULL;
1262+
return upb_EnumDef_File(e) == filedef ? e : NULL;
12591263
}
12601264

12611265
static const void* PyUpb_FileDescriptor_LookupExtension(
12621266
const upb_FileDef* filedef, const char* name) {
1263-
return PyUpb_FileDescriptor_NestedLookup(
1267+
const upb_FieldDef* f = PyUpb_FileDescriptor_NestedLookup(
12641268
filedef, name, (void*)&upb_DefPool_FindExtensionByName);
1269+
if (!f) return NULL;
1270+
return upb_FieldDef_File(f) == filedef ? f : NULL;
12651271
}
12661272

12671273
static const void* PyUpb_FileDescriptor_LookupService(
12681274
const upb_FileDef* filedef, const char* name) {
1269-
return PyUpb_FileDescriptor_NestedLookup(
1275+
const upb_ServiceDef* s = PyUpb_FileDescriptor_NestedLookup(
12701276
filedef, name, (void*)&upb_DefPool_FindServiceByName);
1277+
if (!s) return NULL;
1278+
return upb_ServiceDef_File(s) == filedef ? s : NULL;
12711279
}
12721280

12731281
static PyObject* PyUpb_FileDescriptor_GetName(PyUpb_DescriptorBase* self,

python/google/protobuf/internal/descriptor_pool_test.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,51 @@ def testFindFileContainingSymbol(self):
132132
self.assertRaises(KeyError, self.pool.FindFileContainingSymbol,
133133
'google.protobuf.python.internal.Factory1Message.none_field')
134134

135+
def testCrossFileMessageTypesByName(self):
136+
self.assertIs(
137+
descriptor_pool_test1_pb2.DescriptorPoolTest1.DESCRIPTOR,
138+
descriptor_pool_test1_pb2.DESCRIPTOR.message_types_by_name[
139+
'DescriptorPoolTest1'
140+
],
141+
)
142+
with self.assertRaises(KeyError):
143+
descriptor_pool_test2_pb2.DESCRIPTOR.message_types_by_name[
144+
'DescriptorPoolTest1'
145+
]
146+
147+
def testCrossFileEnumTypesByName(self):
148+
self.assertIs(
149+
descriptor_pool_test1_pb2.TopLevelEnumTest1.DESCRIPTOR,
150+
descriptor_pool_test1_pb2.DESCRIPTOR.enum_types_by_name[
151+
'TopLevelEnumTest1'
152+
],
153+
)
154+
with self.assertRaises(KeyError):
155+
descriptor_pool_test2_pb2.DESCRIPTOR.enum_types_by_name[
156+
'TopLevelEnumTest1'
157+
]
158+
159+
def testCrossFileExtensionsByName(self):
160+
self.assertIs(
161+
descriptor_pool_test1_pb2.top_level_extension_test1,
162+
descriptor_pool_test1_pb2.DESCRIPTOR.extensions_by_name[
163+
'top_level_extension_test1'
164+
],
165+
)
166+
with self.assertRaises(KeyError):
167+
descriptor_pool_test2_pb2.DESCRIPTOR.extensions_by_name[
168+
'top_level_extension_test1'
169+
]
170+
171+
def testCrossFileServicesByName(self):
172+
descriptor_pool_test1_pb2.DESCRIPTOR.services_by_name[
173+
'DescriporPoolTestService'
174+
],
175+
with self.assertRaises(KeyError):
176+
descriptor_pool_test2_pb2.DESCRIPTOR.services_by_name[
177+
'DescriporPoolTestService'
178+
]
179+
135180
def testFindFileContainingSymbolFailure(self):
136181
with self.assertRaises(KeyError):
137182
self.pool.FindFileContainingSymbol('Does not exist')

python/google/protobuf/internal/descriptor_pool_test1.proto

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,17 @@ syntax = "proto2";
99

1010
package google.protobuf.python.internal;
1111

12+
enum TopLevelEnumTest1 {
13+
TOP_LEVEL_ENUM_TEST_1_NONE = 0;
14+
TOP_LEVEL_ENUM_TEST_1_ONE = 1;
15+
}
16+
17+
extend DescriptorPoolTest1 {
18+
optional TopLevelEnumTest1 top_level_extension_test1 = 1000;
19+
}
20+
21+
service DescriporPoolTestService {}
22+
1223
message DescriptorPoolTest1 {
1324
extensions 1000 to max;
1425

@@ -63,7 +74,7 @@ message DescriptorPoolTest2 {
6374
LAMBDA = 11;
6475
MU = 12;
6576

66-
reserved -1;
77+
reserved - 1;
6778
reserved 536870913; // 0x20000001
6879
}
6980
optional NestedEnum nested_enum = 1 [default = MU];

0 commit comments

Comments
 (0)