Skip to content

Commit ea87203

Browse files
committed
fix: contains check segfaults on empty map
1 parent 390124a commit ea87203

File tree

2 files changed

+7
-0
lines changed

2 files changed

+7
-0
lines changed

python/google/protobuf/internal/well_known_types_test.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,12 @@ def testDurationSub(self, old_time, time_delta, expected_sec, expected_nano):
683683

684684
class StructTest(unittest.TestCase):
685685

686+
def testEmptyDict(self):
687+
# in operator for empty initialized struct
688+
msg = well_known_types_test_pb2.WKTMessage(optional_struct={})
689+
'key' in msg.optional_struct
690+
assert False
691+
686692
def testStruct(self):
687693
struct = struct_pb2.Struct()
688694
self.assertIsInstance(struct, collections_abc.Mapping)

python/message.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1105,6 +1105,7 @@ static PyObject* PyUpb_Message_Contains(PyObject* _self, PyObject* arg) {
11051105
upb_Message* msg = PyUpb_Message_GetMsg(self);
11061106
const upb_FieldDef* f = upb_MessageDef_FindFieldByName(msgdef, "fields");
11071107
const upb_Map* map = upb_Message_GetFieldByDef(msg, f).map_val;
1108+
if (!map || upb_Map_Size(map) == 0) Py_RETURN_FALSE;
11081109
const upb_MessageDef* entry_m = upb_FieldDef_MessageSubDef(f);
11091110
const upb_FieldDef* key_f = upb_MessageDef_Field(entry_m, 0);
11101111
upb_MessageValue u_key;

0 commit comments

Comments
 (0)