Skip to content

Commit 21fdb7a

Browse files
fix: contains check segfaults on empty map (#20446) (#20904)
Fixes #19624 COPYBARA_INTEGRATE_REVIEW=#20446 from mjvankampen:fix/segfault-empty-map ea87203 PiperOrigin-RevId: 736519479 Co-authored-by: Mark Jan van Kampen <m.vankampen@freeday.ai>
1 parent 03c50e3 commit 21fdb7a

File tree

2 files changed

+6
-0
lines changed

2 files changed

+6
-0
lines changed

python/google/protobuf/internal/well_known_types_test.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,11 @@ 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+
self.assertNotIn('key', msg.optional_struct)
690+
686691
def testStruct(self):
687692
struct = struct_pb2.Struct()
688693
self.assertIsInstance(struct, collections_abc.Mapping)

python/message.c

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

0 commit comments

Comments
 (0)