Skip to content

Commit 94a2663

Browse files
habermanzhangskz
authored andcommitted
Fixed a SEGV when deep copying a non-reified sub-message.
PiperOrigin-RevId: 600951523
1 parent 5d47e0a commit 94a2663

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

python/google/protobuf/internal/reflection_test.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,11 @@ def testDeepCopy(self, message_module):
789789
messages.remove(messages[0])
790790
self.assertEqual(len(messages), 0)
791791

792+
def testEmptyDeepCopy(self, message_module):
793+
proto1 = message_module.TestAllTypes()
794+
nested2 = copy.deepcopy(proto1.optional_nested_message)
795+
self.assertEqual(0, nested2.bb)
796+
792797
# TODO: Implement deepcopy for extension dict
793798

794799
def testDisconnectingBeforeClear(self, message_module):

python/message.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1610,10 +1610,13 @@ static PyObject* PyUpb_Message_WhichOneof(PyObject* _self, PyObject* name) {
16101610
PyObject* DeepCopy(PyObject* _self, PyObject* arg) {
16111611
PyUpb_Message* self = (void*)_self;
16121612
const upb_MessageDef* def = PyUpb_Message_GetMsgdef(_self);
1613-
1613+
const upb_MiniTable* mini_table = upb_MessageDef_MiniTable(def);
1614+
upb_Message* msg = PyUpb_Message_GetIfReified(_self);
16141615
PyObject* arena = PyUpb_Arena_New();
1615-
upb_Message* clone = upb_Message_DeepClone(
1616-
self->ptr.msg, upb_MessageDef_MiniTable(def), PyUpb_Arena_Get(arena));
1616+
upb_Arena* upb_arena = PyUpb_Arena_Get(arena);
1617+
1618+
upb_Message* clone = msg ? upb_Message_DeepClone(msg, mini_table, upb_arena)
1619+
: upb_Message_New(mini_table, upb_arena);
16171620
PyObject* ret = PyUpb_Message_Get(clone, def, arena);
16181621
Py_DECREF(arena);
16191622

0 commit comments

Comments
 (0)