[Python-checkins] cpython (3.3): Issue #16076: fix refleak in pickling of Element.

eli.bendersky python-checkins at python.org
Sat Jan 12 14:21:32 CET 2013


http://hg.python.org/cpython/rev/5b36768b9a11
changeset:   81445:5b36768b9a11
branch:      3.3
parent:      81442:b468f6c8eae5
user:        Eli Bendersky <eliben at gmail.com>
date:        Sat Jan 12 05:20:16 2013 -0800
summary:
  Issue #16076: fix refleak in pickling of Element.

Thanks to Ezio Melotti and Daniel Shahaf for the patch.

files:
  Modules/_elementtree.c |  16 +++++-----------
  1 files changed, 5 insertions(+), 11 deletions(-)


diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c
--- a/Modules/_elementtree.c
+++ b/Modules/_elementtree.c
@@ -859,8 +859,10 @@
                                      PICKLED_ATTRIB, self->extra->attrib,
                                      PICKLED_TEXT, self->text,
                                      PICKLED_TAIL, self->tail);
-    if (instancedict)
+    if (instancedict) {
+        Py_DECREF(children);
         return instancedict;
+    }
     else {
         for (i = 0; i < PyList_GET_SIZE(children); i++)
             Py_DECREF(PyList_GET_ITEM(children, i));
@@ -884,25 +886,17 @@
         PyErr_SetString(PyExc_TypeError, "tag may not be NULL");
         return NULL;
     }
-    if (!text) {
-        Py_INCREF(Py_None);
-        text = Py_None;
-    }
-    if (!tail) {
-        Py_INCREF(Py_None);
-        tail = Py_None;
-    }
 
     Py_CLEAR(self->tag);
     self->tag = tag;
     Py_INCREF(self->tag);
 
     Py_CLEAR(self->text);
-    self->text = text;
+    self->text = text ? text : Py_None;
     Py_INCREF(self->text);
 
     Py_CLEAR(self->tail);
-    self->tail = tail;
+    self->tail = tail ? tail : Py_None;
     Py_INCREF(self->tail);
 
     /* Handle ATTRIB and CHILDREN. */

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list