]> granicus.if.org Git - python/commitdiff
bpo-31428: Prevent raising a SystemError in case the memo arg of ElementTree.Element...
authorOren Milman <orenmn@gmail.com>
Tue, 12 Sep 2017 14:39:15 +0000 (17:39 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Tue, 12 Sep 2017 14:39:15 +0000 (17:39 +0300)
Modules/_elementtree.c
Modules/clinic/_elementtree.c.h

index 857005a2a9b8ad84c223d1d0bc254b1c6584fe81..98d5e7f50626c84254c36e8259d92a97d53a76b1 100644 (file)
@@ -733,14 +733,14 @@ LOCAL(PyObject *) deepcopy(PyObject *, PyObject *);
 /*[clinic input]
 _elementtree.Element.__deepcopy__
 
-    memo: object
+    memo: object(subclass_of="&PyDict_Type")
     /
 
 [clinic start generated code]*/
 
 static PyObject *
-_elementtree_Element___deepcopy__(ElementObject *self, PyObject *memo)
-/*[clinic end generated code: output=d1f19851d17bf239 input=df24c2b602430b77]*/
+_elementtree_Element___deepcopy___impl(ElementObject *self, PyObject *memo)
+/*[clinic end generated code: output=eefc3df50465b642 input=a2d40348c0aade10]*/
 {
     Py_ssize_t i;
     ElementObject* element;
@@ -849,7 +849,8 @@ deepcopy(PyObject *object, PyObject *memo)
             /* Fall through to general case */
         }
         else if (Element_CheckExact(object)) {
-            return _elementtree_Element___deepcopy__((ElementObject *)object, memo);
+            return _elementtree_Element___deepcopy___impl(
+                (ElementObject *)object, memo);
         }
     }
 
index 19a77978f36ebf1431b88e68ff4c361b314c2465..9563afa88d0b27706451a8d51ab98adb88f49ba2 100644 (file)
@@ -70,6 +70,24 @@ PyDoc_STRVAR(_elementtree_Element___deepcopy____doc__,
 #define _ELEMENTTREE_ELEMENT___DEEPCOPY___METHODDEF    \
     {"__deepcopy__", (PyCFunction)_elementtree_Element___deepcopy__, METH_O, _elementtree_Element___deepcopy____doc__},
 
+static PyObject *
+_elementtree_Element___deepcopy___impl(ElementObject *self, PyObject *memo);
+
+static PyObject *
+_elementtree_Element___deepcopy__(ElementObject *self, PyObject *arg)
+{
+    PyObject *return_value = NULL;
+    PyObject *memo;
+
+    if (!PyArg_Parse(arg, "O!:__deepcopy__", &PyDict_Type, &memo)) {
+        goto exit;
+    }
+    return_value = _elementtree_Element___deepcopy___impl(self, memo);
+
+exit:
+    return return_value;
+}
+
 PyDoc_STRVAR(_elementtree_Element___sizeof____doc__,
 "__sizeof__($self, /)\n"
 "--\n"
@@ -731,4 +749,4 @@ _elementtree_XMLParser__setevents(XMLParserObject *self, PyObject **args, Py_ssi
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=75d0ff80e20b830f input=a9049054013a1b77]*/
+/*[clinic end generated code: output=ed55bd5209c12364 input=a9049054013a1b77]*/