[Python-checkins] bpo-31544: Fix a reference leak to 'self' after the previous target error handling fixes. (GH-6318)

Serhiy Storchaka webhook-mailer at python.org
Sat Mar 31 08:23:33 EDT 2018


https://github.com/python/cpython/commit/c498cd8bf81fc47acf2f1f702e8b3bc9bd4aed65
commit: c498cd8bf81fc47acf2f1f702e8b3bc9bd4aed65
branch: 2.7
author: scoder <stefan_ml at behnel.de>
committer: Serhiy Storchaka <storchaka at gmail.com>
date: 2018-03-31T15:23:30+03:00
summary:

bpo-31544: Fix a reference leak to 'self' after the previous target error handling fixes. (GH-6318)

This change generally splits the xmlparser creation code into an unsafe part with "rollback" error handling and a safe "object initialisation done" part with normal decref cleanup.

files:
A Misc/NEWS.d/next/Library/2017-09-13-19-55-35.bpo-31455.beTh6t.rst
M Modules/_elementtree.c

diff --git a/Misc/NEWS.d/next/Library/2017-09-13-19-55-35.bpo-31455.beTh6t.rst b/Misc/NEWS.d/next/Library/2017-09-13-19-55-35.bpo-31455.beTh6t.rst
new file mode 100644
index 000000000000..9ea3599ee0b0
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2017-09-13-19-55-35.bpo-31455.beTh6t.rst
@@ -0,0 +1,2 @@
+The C accelerator module of ElementTree ignored exceptions raised when
+looking up TreeBuilder target methods in XMLParser().
diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c
index 7f0e60934003..1d316a1c91d2 100644
--- a/Modules/_elementtree.c
+++ b/Modules/_elementtree.c
@@ -2575,14 +2575,24 @@ xmlparser(PyObject* self_, PyObject* args, PyObject* kw)
         return NULL;
     }
 
+    ALLOC(sizeof(XMLParserObject), "create expatparser");
+
+    /* Init to NULL to keep the error handling below manageable. */
+    self->target =
+        self->handle_xml =
+        self->handle_start =
+        self->handle_data =
+        self->handle_end =
+        self->handle_comment =
+        self->handle_pi =
+        self->handle_close =
+        NULL;
+
     /* setup target handlers */
     if (!target) {
         target = treebuilder_new();
         if (!target) {
-            EXPAT(ParserFree)(self->parser);
-            PyObject_Del(self->names);
-            PyObject_Del(self->entity);
-            PyObject_Del(self);
+            Py_DECREF(self);
             return NULL;
         }
     } else
@@ -2591,30 +2601,37 @@ xmlparser(PyObject* self_, PyObject* args, PyObject* kw)
 
     self->handle_xml = PyObject_GetAttrString(target, "xml");
     if (ignore_attribute_error(self->handle_xml)) {
+        Py_DECREF(self);
         return NULL;
     }
     self->handle_start = PyObject_GetAttrString(target, "start");
     if (ignore_attribute_error(self->handle_start)) {
+        Py_DECREF(self);
         return NULL;
     }
     self->handle_data = PyObject_GetAttrString(target, "data");
     if (ignore_attribute_error(self->handle_data)) {
+        Py_DECREF(self);
         return NULL;
     }
     self->handle_end = PyObject_GetAttrString(target, "end");
     if (ignore_attribute_error(self->handle_end)) {
+        Py_DECREF(self);
         return NULL;
     }
     self->handle_comment = PyObject_GetAttrString(target, "comment");
     if (ignore_attribute_error(self->handle_comment)) {
+        Py_DECREF(self);
         return NULL;
     }
     self->handle_pi = PyObject_GetAttrString(target, "pi");
     if (ignore_attribute_error(self->handle_pi)) {
+        Py_DECREF(self);
         return NULL;
     }
     self->handle_close = PyObject_GetAttrString(target, "close");
     if (ignore_attribute_error(self->handle_close)) {
+        Py_DECREF(self);
         return NULL;
     }
 
@@ -2650,8 +2667,6 @@ xmlparser(PyObject* self_, PyObject* args, PyObject* kw)
         );
 #endif
 
-    ALLOC(sizeof(XMLParserObject), "create expatparser");
-
     return (PyObject*) self;
 }
 



More information about the Python-checkins mailing list