Skip to content

Commit d056818

Browse files
orenmnserhiy-storchaka
authored andcommitted
bpo-31428: Prevent raising a SystemError in case the memo arg of ElementTree.Element.__deepcopy__() isn't a dictionary. (#3512)
1 parent 98758bc commit d056818

2 files changed

Lines changed: 24 additions & 5 deletions

File tree

Modules/_elementtree.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -733,14 +733,14 @@ LOCAL(PyObject *) deepcopy(PyObject *, PyObject *);
733733
/*[clinic input]
734734
_elementtree.Element.__deepcopy__
735735
736-
memo: object
736+
memo: object(subclass_of="&PyDict_Type")
737737
/
738738
739739
[clinic start generated code]*/
740740

741741
static PyObject *
742-
_elementtree_Element___deepcopy__(ElementObject *self, PyObject *memo)
743-
/*[clinic end generated code: output=d1f19851d17bf239 input=df24c2b602430b77]*/
742+
_elementtree_Element___deepcopy___impl(ElementObject *self, PyObject *memo)
743+
/*[clinic end generated code: output=eefc3df50465b642 input=a2d40348c0aade10]*/
744744
{
745745
Py_ssize_t i;
746746
ElementObject* element;
@@ -849,7 +849,8 @@ deepcopy(PyObject *object, PyObject *memo)
849849
/* Fall through to general case */
850850
}
851851
else if (Element_CheckExact(object)) {
852-
return _elementtree_Element___deepcopy__((ElementObject *)object, memo);
852+
return _elementtree_Element___deepcopy___impl(
853+
(ElementObject *)object, memo);
853854
}
854855
}
855856

Modules/clinic/_elementtree.c.h

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,24 @@ PyDoc_STRVAR(_elementtree_Element___deepcopy____doc__,
7070
#define _ELEMENTTREE_ELEMENT___DEEPCOPY___METHODDEF \
7171
{"__deepcopy__", (PyCFunction)_elementtree_Element___deepcopy__, METH_O, _elementtree_Element___deepcopy____doc__},
7272

73+
static PyObject *
74+
_elementtree_Element___deepcopy___impl(ElementObject *self, PyObject *memo);
75+
76+
static PyObject *
77+
_elementtree_Element___deepcopy__(ElementObject *self, PyObject *arg)
78+
{
79+
PyObject *return_value = NULL;
80+
PyObject *memo;
81+
82+
if (!PyArg_Parse(arg, "O!:__deepcopy__", &PyDict_Type, &memo)) {
83+
goto exit;
84+
}
85+
return_value = _elementtree_Element___deepcopy___impl(self, memo);
86+
87+
exit:
88+
return return_value;
89+
}
90+
7391
PyDoc_STRVAR(_elementtree_Element___sizeof____doc__,
7492
"__sizeof__($self, /)\n"
7593
"--\n"
@@ -731,4 +749,4 @@ _elementtree_XMLParser__setevents(XMLParserObject *self, PyObject **args, Py_ssi
731749
exit:
732750
return return_value;
733751
}
734-
/*[clinic end generated code: output=75d0ff80e20b830f input=a9049054013a1b77]*/
752+
/*[clinic end generated code: output=ed55bd5209c12364 input=a9049054013a1b77]*/

0 commit comments

Comments
 (0)