]> granicus.if.org Git - python/commitdiff
Fixed possible leaks in ElementTree parser.
authorSerhiy Storchaka <storchaka@gmail.com>
Wed, 9 Dec 2015 17:44:30 +0000 (19:44 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Wed, 9 Dec 2015 17:44:30 +0000 (19:44 +0200)
Modules/_elementtree.c

index 2bf8014f4c3a086ee8d37e0ee105b58f91038dd0..2647c7bc2a17c9b7921246841f15c6905b157b79 100644 (file)
@@ -2227,8 +2227,10 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in,
     /* attributes */
     if (attrib_in[0]) {
         attrib = PyDict_New();
-        if (!attrib)
+        if (!attrib) {
+            Py_DECREF(tag);
             return;
+        }
         while (attrib_in[0] && attrib_in[1]) {
             PyObject* key = makeuniversal(self, attrib_in[0]);
             PyObject* value = makestring(attrib_in[1], strlen(attrib_in[1]));
@@ -2236,6 +2238,7 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in,
                 Py_XDECREF(value);
                 Py_XDECREF(key);
                 Py_DECREF(attrib);
+                Py_DECREF(tag);
                 return;
             }
             ok = PyDict_SetItem(attrib, key, value);
@@ -2243,6 +2246,7 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in,
             Py_DECREF(key);
             if (ok < 0) {
                 Py_DECREF(attrib);
+                Py_DECREF(tag);
                 return;
             }
             attrib_in += 2;
@@ -2260,8 +2264,10 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in,
         if (attrib == Py_None) {
             Py_DECREF(attrib);
             attrib = PyDict_New();
-            if (!attrib)
+            if (!attrib) {
+                Py_DECREF(tag);
                 return;
+            }
         }
         res = PyObject_CallFunction(self->handle_start, "OO", tag, attrib);
     } else